diff --git a/cmd/qiita/flags.go b/cmd/qiita/flags.go index 5c7aa6e..ed5da65 100644 --- a/cmd/qiita/flags.go +++ b/cmd/qiita/flags.go @@ -65,18 +65,6 @@ var ( // items create var ( - // --file - flagItemsCreateFile = &flags.String{Flag: &flags.Flag{ - Name: "file", - Description: "create an item from a file", - }} - - // --write - flagItemsCreateWrite = &flags.Bool{Flag: &flags.Flag{ - Name: "write", - Description: "write information about the created item to a file", - }} - // --title flagItemsCreateTitle = &flags.String{Flag: &flags.Flag{ Name: "title", @@ -110,18 +98,6 @@ var ( // items update var ( - // --file - flagItemsUpdateFile = &flags.String{Flag: &flags.Flag{ - Name: "file", - Description: "update an item from a file", - }} - - // --write - flagItemsUpdateWrite = &flags.Bool{Flag: &flags.Flag{ - Name: "write", - Description: "write information about the updated item to a file", - }} - // --title flagItemsUpdateTitle = &flags.String{Flag: &flags.Flag{ Name: "title", @@ -168,6 +144,15 @@ var ( } ) +// items push +var ( + // --write + flagItemsPushWrite = &flags.Bool{Flag: &flags.Flag{ + Name: "write", + Description: "write information about the pushed item to a file", + }} +) + // items pull var ( // --out diff --git a/cmd/qiita/items.go b/cmd/qiita/items.go index 44967df..59cd189 100644 --- a/cmd/qiita/items.go +++ b/cmd/qiita/items.go @@ -90,8 +90,6 @@ var itemsCreateCmd = &cobra.Command{ } if err := c.ItemsCreate(&cli.ItemsCreateParameters{ - FlagFile: flagItemsCreateFile, // --file - FlagWrite: flagItemsCreateWrite, // --write FlagTitle: flagItemsCreateTitle, // --title FlagBody: flagItemsCreateBody, // --body FlagTags: flagItemsCreateTags, // --tags @@ -118,8 +116,6 @@ var itemsUpdateCmd = &cobra.Command{ if err := c.ItemsUpdate(&cli.ItemsUpdateParameters{ Args: args, - FlagFile: flagItemsUpdateFile, // --file - FlagWrite: flagItemsUpdateWrite, // --write FlagTitle: flagItemsUpdateTitle, // --title FlagTags: flagItemsUpdateTags, // --tags FlagBody: flagItemsUpdateBody, // --body @@ -177,6 +173,28 @@ var itemsNewCmd = &cobra.Command{ }, } +var itemsPushCmd = &cobra.Command{ + Use: "push [files]", + Short: "Upload items", + Long: "Upload items.", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + c, err := newCLI(cmd, nil) + if err != nil { + return err + } + + if err := c.ItemsPush(&cli.ItemsPushParameters{ + Args: args, + FlagWrite: flagItemsPushWrite, // --write + }); err != nil { + return err + } + + return nil + }, +} + var itemsPullCmd = &cobra.Command{ Use: "pull [ids]", Short: "Download items", diff --git a/cmd/qiita/root.go b/cmd/qiita/root.go index b703566..5938b28 100644 --- a/cmd/qiita/root.go +++ b/cmd/qiita/root.go @@ -55,6 +55,7 @@ func init() { itemsUpdateCmd, // items update itemsDeleteCmd, // items delete itemsNewCmd, // items new + itemsPushCmd, // items push itemsPullCmd, // items pull ) @@ -96,8 +97,6 @@ func init() { flags.Flags{ flagFormat, // --format flagItemsColumns, // --columns - flagItemsCreateFile, // --file - flagItemsCreateWrite, // --write flagItemsCreateTitle, // --title flagItemsCreateTags, // --tags flagItemsCreateBody, // --body @@ -109,8 +108,6 @@ func init() { flags.Flags{ flagFormat, // --format flagItemsColumns, // --columns - flagItemsUpdateFile, // --file - flagItemsUpdateWrite, // --write flagItemsUpdateTitle, // --title flagItemsUpdateTags, // --tags flagItemsUpdateBody, // --body @@ -124,6 +121,11 @@ func init() { flagItemsNewPrivate, // --private }.AddTo(itemsNewCmd) + /* items push */ + flags.Flags{ + flagItemsPushWrite, // --write + }.AddTo(itemsPushCmd) + /* items pull */ flags.Flags{ flagItemsPullOut, // --out diff --git a/docs/usage/create_edit_delete/README.md b/docs/usage/create_edit_delete/README.md index 156ccea..631b4fd 100644 --- a/docs/usage/create_edit_delete/README.md +++ b/docs/usage/create_edit_delete/README.md @@ -9,8 +9,8 @@ ## 記事を作成 > **Note** -> マークダウンファイルから記事を作成することもできます。 -> 詳しくは「[マークダウンファイルで記事を管理する](./file.md)」をご参照ください。 +> `push` コマンドを使用してマークダウンファイルから記事を作成することもできます。 +> 詳しくは「[マークダウンファイルで記事を管理する](../file/README.md)」をご参照ください。 `qiita items create` で記事を作成することができます。 @@ -38,8 +38,8 @@ $ qiita items create --help ## 記事を更新 > **Note** -> マークダウンファイルから記事を更新することもできます。 -> 詳しくは「[マークダウンファイルで記事を管理する](./file.md)」をご参照ください。 +> `push` コマンドを使用してマークダウンファイルから記事を更新することもできます。 +> 詳しくは「[マークダウンファイルで記事を管理する](../file/README.md)」をご参照ください。 `qiita items update` で記事を更新することができます。 diff --git a/docs/usage/file/README.md b/docs/usage/file/README.md index 34fa2e4..c11f532 100644 --- a/docs/usage/file/README.md +++ b/docs/usage/file/README.md @@ -40,13 +40,11 @@ private: true これはテスト投稿です。 ``` -最後に `qiita items create` を次のように実行すると記事を作成することができます。 +最後に `qiita items push` を次のように実行すると記事を作成することができます。 `--write` フラグを指定すると ID などのメタ情報がファイルに書き込まれます。 ```sh -$ qiita items create \ - --file ./test.md \ - --write +$ qiita items push ./test.md --write ``` 実際に [Qiita](https://qiita.com) で記事が作成されていることが確認できます。 @@ -83,12 +81,10 @@ private: true 更新されたボディ ``` -最後に `qiita items update` を次のように実行すると記事を更新することができます。 +最後に `qiita items push` を次のように実行すると記事を更新することができます。 ```sh -$ qiita items update \ - --file ./test.md \ - --write +$ qiita items push ./test.md --write ``` 実際に [Qiita](https://qiita.com) で記事が更新されていることが確認できます。 @@ -105,4 +101,4 @@ $ qiita items pull --all --out ./items ``` すると全ての自分の記事が `./items/<記事のタイトル>.md` という名前でマークダウン形式で保存されます。 -その後は `qiita items update` などを使用して記事をマークダウンファイルで管理することができます。 +その後は `qiita items push` を使用して記事をマークダウンファイルで管理 / 更新することができます。 diff --git a/internal/cli/items.go b/internal/cli/items.go index f3639e6..325125a 100644 --- a/internal/cli/items.go +++ b/internal/cli/items.go @@ -79,8 +79,6 @@ func (c *CLI) ItemsGet(params *ItemsGetParameters) error { } type ItemsCreateParameters struct { - FlagFile *flags.String // --file - FlagWrite *flags.Bool // --write FlagTitle *flags.String // --title FlagTags *flags.StringSlice // --tags FlagBody *flags.String // --body @@ -90,54 +88,21 @@ type ItemsCreateParameters struct { // $ qiita items create func (c *CLI) ItemsCreate(params *ItemsCreateParameters) error { - if params.FlagWrite.Changed(c.command) && !params.FlagFile.Changed(c.command) { - return ErrWriteWithoutFile - } - file := params.FlagFile.Get(c.command, false) - - p := &qiita.CreateItemParameters{} - - if file != nil { - md, fm, err := c.readMarkdown(*file) - if err != nil { - return err - } - if fm.ID != nil { - return ErrCreateWithID - } - p.Title = fm.Title - p.Tags = fm.QiitaTags() - p.Body = &md - p.Private = fm.Private - } - - if params.FlagTitle.Changed(c.command) { - p.Title = params.FlagTitle.Get(c.command, true) + p := &qiita.CreateItemParameters{ + Title: params.FlagTitle.Get(c.command, false), + Body: params.FlagBody.Get(c.command, false), + Private: params.FlagPrivate.Get(c.command, false), + Tweet: params.FlagTweet.Get(c.command, false), } if params.FlagTags.Changed(c.command) { p.Tags = util.Ptr(qiita.TagsFromStrings(*params.FlagTags.Get(c.command, true))) } - if params.FlagBody.Changed(c.command) { - p.Body = params.FlagBody.Get(c.command, true) - } - if params.FlagPrivate.Changed(c.command) { - p.Private = params.FlagPrivate.Get(c.command, true) - } - if params.FlagTweet.Changed(c.command) { - p.Tweet = params.FlagTweet.Get(c.command, true) - } item, err := c.client.CreateItem(p) if err != nil { return err } - if *params.FlagWrite.Get(c.command, true) { - if err := c.writeMarkdown(*file, item); err != nil { - return err - } - } - if err := c.printer.Print(c.writer, item); err != nil { return err } @@ -147,8 +112,6 @@ func (c *CLI) ItemsCreate(params *ItemsCreateParameters) error { type ItemsUpdateParameters struct { Args []string - FlagFile *flags.String // --file - FlagWrite *flags.Bool // --write FlagTitle *flags.String // --title FlagTags *flags.StringSlice // --tags FlagBody *flags.String // --body @@ -156,59 +119,21 @@ type ItemsUpdateParameters struct { } func (c *CLI) ItemsUpdate(params *ItemsUpdateParameters) error { - if params.FlagWrite.Changed(c.command) && !params.FlagFile.Changed(c.command) { - return ErrWriteWithoutFile - } - file := params.FlagFile.Get(c.command, false) - - var id string - p := &qiita.UpdateItemParameters{} - - if file != nil { - md, fm, err := c.readMarkdown(*file) - if err != nil { - return err - } - if fm.ID != nil { - id = *fm.ID - } - p.Title = fm.Title - p.Tags = fm.QiitaTags() - p.Body = &md - p.Private = fm.Private - } - - if len(params.Args) > 0 { - id = params.Args[0] - } - if id == "" { - return ErrIDRequired - } - - if params.FlagTitle.Changed(c.command) { - p.Title = params.FlagTitle.Get(c.command, true) + id := params.Args[0] + p := &qiita.UpdateItemParameters{ + Title: params.FlagTitle.Get(c.command, false), + Body: params.FlagBody.Get(c.command, false), + Private: params.FlagPrivate.Get(c.command, false), } if params.FlagTags.Changed(c.command) { p.Tags = util.Ptr(qiita.TagsFromStrings(*params.FlagTags.Get(c.command, true))) } - if params.FlagBody.Changed(c.command) { - p.Body = params.FlagBody.Get(c.command, true) - } - if params.FlagPrivate.Changed(c.command) { - p.Private = params.FlagPrivate.Get(c.command, true) - } item, err := c.client.UpdateItem(id, p) if err != nil { return err } - if *params.FlagWrite.Get(c.command, true) { - if err := c.writeMarkdown(*file, item); err != nil { - return err - } - } - if err := c.printer.Print(c.writer, item); err != nil { return err } @@ -271,6 +196,59 @@ func (c *CLI) ItemsNew(params *ItemsNewParameters) error { return nil } +type ItemsPushParameters struct { + Args []string + FlagWrite *flags.Bool // --write +} + +func (c *CLI) ItemsPush(params *ItemsPushParameters) error { + for _, filename := range params.Args { + md, fm, err := c.readMarkdown(filename) + if err != nil { + return err + } + + fmt.Fprintf(c.writer, "Pushing... %s\n", filename) + var item qiita.Item + if fm.ID == nil { + // create + p := &qiita.CreateItemParameters{ + Title: fm.Title, + Tags: fm.QiitaTags(), + Body: &md, + Private: fm.Private, + } + var err error + item, err = c.client.CreateItem(p) + if err != nil { + return err + } + } else { + // update + p := &qiita.UpdateItemParameters{ + Title: fm.Title, + Tags: fm.QiitaTags(), + Body: &md, + Private: fm.Private, + } + var err error + item, err = c.client.UpdateItem(*fm.ID, p) + if err != nil { + return err + } + } + fmt.Fprintf(c.writer, "Pushed: %s\n", item.URL()) + + if *params.FlagWrite.Get(c.command, true) { + if err := c.writeMarkdown(filename, item); err != nil { + return err + } + } + } + + return nil +} + type ItemsPullParameters struct { Args []string FlagAll *flags.Bool // --all diff --git a/internal/qiita/models.go b/internal/qiita/models.go index 2720817..cd6dd0c 100644 --- a/internal/qiita/models.go +++ b/internal/qiita/models.go @@ -36,6 +36,10 @@ func (item Item) ID() string { return item["id"].(string) } +func (item Item) URL() string { + return item["url"].(string) +} + func (item Item) Title() string { return item["title"].(string) }