trello_flow 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8479d6897951ce3c0d4813c3480ea1b22d64162
4
- data.tar.gz: 356b3eb31e43278518f8d192d65832ed55796595
3
+ metadata.gz: 25cffdf1ba58b120f8ac843494b1e10c928cf9c0
4
+ data.tar.gz: c5b25cf7d13abff425216edecddbb020c7f55248
5
5
  SHA512:
6
- metadata.gz: bc3123f66076c39431d09c3f555972a24c17934c5d260e0a36ca21e7bb5d4d1a26eb83c486b6967709f56dd1508f3691a5a67c50b5db17bf1beff641fa60b5bd
7
- data.tar.gz: a4fe9952c229e7b766d90e482db55af5867456aa7b4e82f6ddb8494fdeedc2c00fb1227f9c04ad4e9179088b519fd4a6c4327f884a373573259f7223df061787
6
+ metadata.gz: ed517dc500c33843ab1f7ea9802558f421c9dfb68653b3d79952d5cb702f5212901188aba15f23031e6737107ff9b49fb1b55219272310a7f83a5ec8d7d8fdc5
7
+ data.tar.gz: 1cf7c109ec40c83768ba1ffe90353484ba4759e509c8f9b6ee3a1dc2d3275e882b076f16569c2f08319be04f3da1922929ad94b06efe859af27d9a6cf34ffbdb
data/README.md CHANGED
@@ -10,11 +10,11 @@ gem install trello_flow
10
10
  ## Usage
11
11
 
12
12
  ```bash
13
- git open # Open relevant card/all users card in browser
14
- git start # shows list of cards user is member of
15
- git start <card URL> # show checklist. Choosing items assigns self & creates branch
16
- git start "Do this" # picking a card/checklist adds and starts item
17
- git finish # checks off task, opens PR
13
+ git open # Open relevant card/all user's cards in browser
14
+ git start # Pick a board to see backlog
15
+ git start <card URL> # Assigns self to card, moves to "started", and creates branch
16
+ git start "Do this" # Picking a board creates card "Do this" and starts it
17
+ git finish # Moves card to "in review" and opens PR
18
18
  git cleanup # cleans up merged card branches
19
19
  ```
20
20
 
@@ -6,10 +6,8 @@ module TrelloFlow
6
6
  class Base < Spyke::Base
7
7
  require "trello_flow/api/board"
8
8
  require "trello_flow/api/card"
9
- require "trello_flow/api/checklist"
10
9
  require "trello_flow/api/list"
11
10
  require "trello_flow/api/member"
12
- require "trello_flow/api/item"
13
11
 
14
12
  include_root_in_json false
15
13
  cattr_accessor :token
@@ -1,7 +1,7 @@
1
1
  module TrelloFlow
2
2
  module Api
3
3
  class Card < Base
4
- has_many :checklists
4
+ belongs_to :board, foreign_key: "idBoard"
5
5
 
6
6
  def self.fields
7
7
  [:name]
@@ -12,8 +12,12 @@ module TrelloFlow
12
12
  find(id)
13
13
  end
14
14
 
15
- def self.for(user)
16
- with("members/:username/cards/open").where(username: user.username)
15
+ def start
16
+ move_to board.lists.started
17
+ end
18
+
19
+ def finish
20
+ move_to board.lists.finished
17
21
  end
18
22
 
19
23
  def add_member(user)
@@ -21,16 +25,20 @@ module TrelloFlow
21
25
  self.class.with("cards/:id/members").where(id: id, value: user.id).post
22
26
  end
23
27
 
24
- def find_or_create_checklist
25
- Table.pick(checklists) || Checklist.create(idCard: id, name: "To-Do")
26
- end
27
-
28
28
  def url
29
29
  attributes[:shortUrl]
30
30
  end
31
31
 
32
+ def to_param
33
+ name.parameterize[0..50]
34
+ end
35
+
32
36
  private
33
37
 
38
+ def move_to(list)
39
+ self.class.with("cards/:id/idList").where(id: id, value: list.id).put
40
+ end
41
+
34
42
  def member_ids
35
43
  attributes["idMembers"] || []
36
44
  end
@@ -1,11 +1,27 @@
1
1
  module TrelloFlow
2
2
  module Api
3
3
  class List < Base
4
+ BACKLOG_INDEX = 0
5
+ STARTED_INDEX = 1
6
+ FINISHED_INDEX = 2
7
+
4
8
  has_many :cards
5
9
 
6
10
  def self.fields
7
11
  [:name]
8
12
  end
13
+
14
+ def self.backlog
15
+ all[BACKLOG_INDEX]
16
+ end
17
+
18
+ def self.started
19
+ all[STARTED_INDEX]
20
+ end
21
+
22
+ def self.finished
23
+ all[FINISHED_INDEX]
24
+ end
9
25
  end
10
26
  end
11
27
  end
@@ -11,8 +11,8 @@ module TrelloFlow
11
11
  new Cli.read("git rev-parse --abbrev-ref HEAD")
12
12
  end
13
13
 
14
- def self.from_item(item)
15
- new("#{current.target}.#{item.to_param}.#{item.checklist_id}-#{item.id}")
14
+ def self.from_card(card)
15
+ new("#{current.target}.#{card.to_param}.#{card.id}")
16
16
  end
17
17
 
18
18
  def checkout
@@ -24,16 +24,16 @@ module TrelloFlow
24
24
  end
25
25
 
26
26
  def open_pull_request
27
- PullRequest.new(current_item, from: name, target: target).open
27
+ PullRequest.new(current_card, from: name, target: target).open
28
28
  end
29
29
 
30
- def complete_current_item
31
- current_item.complete
30
+ def finish_current_card
31
+ current_card.finish
32
32
  end
33
33
 
34
34
  def open_trello(user)
35
- if current_item
36
- Cli.open_url current_item.card.url
35
+ if current_card
36
+ Cli.open_url current_card.url
37
37
  else
38
38
  Cli.open_url "https://trello.com/#{user.username}/cards"
39
39
  end
@@ -47,20 +47,12 @@ module TrelloFlow
47
47
 
48
48
  attr_reader :name
49
49
 
50
- def ids
51
- name.split(".").last.split("-")
50
+ def current_card
51
+ @_current_card ||= Api::Card.find(card_id) if card_id
52
52
  end
53
53
 
54
- def checklist_id
55
- ids.first
56
- end
57
-
58
- def item_id
59
- ids.last if ids.size == 2
60
- end
61
-
62
- def current_item
63
- @_current_item ||= Api::Item.find(checklist_id, item_id) if item_id
54
+ def card_id
55
+ name.split(".").last
64
56
  end
65
57
  end
66
58
  end
@@ -5,17 +5,10 @@ module TrelloFlow
5
5
  end
6
6
 
7
7
  def start(name)
8
- if name.to_s.start_with?("http")
9
- card = Api::Card.find_by_url(name)
10
- name = nil
11
- else
12
- card = find_or_create_card(name)
13
- end
14
-
15
- checklist = card.find_or_create_checklist
16
- item = checklist.select_or_create_item(name)
17
- item.assign(current_user)
18
- Branch.from_item(item).checkout
8
+ card = create_or_pick_card(name)
9
+ card.add_member(current_user)
10
+ card.start
11
+ Branch.from_card(card).checkout
19
12
  end
20
13
 
21
14
  def open
@@ -26,7 +19,7 @@ module TrelloFlow
26
19
  branch = Branch.current
27
20
  branch.push
28
21
  branch.open_pull_request
29
- branch.complete_current_item
22
+ branch.finish_current_card
30
23
  end
31
24
 
32
25
  def cleanup
@@ -35,8 +28,10 @@ module TrelloFlow
35
28
 
36
29
  private
37
30
 
38
- def find_or_create_card(name)
39
- if Cli.ask("(n)ew or (e)xisting card?") == "n"
31
+ def create_or_pick_card(name)
32
+ if name.to_s.start_with?("http")
33
+ Api::Card.find_by_url(name)
34
+ elsif name.present?
40
35
  create_new_card(name)
41
36
  else
42
37
  pick_existing_card
@@ -44,13 +39,13 @@ module TrelloFlow
44
39
  end
45
40
 
46
41
  def create_new_card(name)
47
- board = Table.pick(Api::Member.current.boards.active)
48
- list = Table.pick(board.lists)
49
- list.cards.create name: Cli.ask("Input card title [#{name}]:").presence || name
42
+ board = Table.pick(current_user.boards.active)
43
+ board.lists.backlog.cards.create name: name
50
44
  end
51
45
 
52
46
  def pick_existing_card
53
- Table.pick Api::Card.for(current_user)
47
+ board = Table.pick(current_user.boards.active)
48
+ Table.pick board.lists.backlog.cards
54
49
  end
55
50
 
56
51
  def current_user
@@ -2,8 +2,8 @@ require "trello_flow/repo"
2
2
 
3
3
  module TrelloFlow
4
4
  class PullRequest
5
- def initialize(item, from:, target:)
6
- @item = item
5
+ def initialize(card, from:, target:)
6
+ @card = card
7
7
  @from = from
8
8
  @target = target
9
9
  end
@@ -14,18 +14,18 @@ module TrelloFlow
14
14
 
15
15
  private
16
16
 
17
- attr_reader :item, :from, :target
17
+ attr_reader :card, :from, :target
18
18
 
19
19
  def url
20
20
  repo.url + "/compare/#{target}...#{from}?expand=1&title=#{escape title_with_prefixes}&body=#{escape body}"
21
21
  end
22
22
 
23
23
  def title
24
- item.name_without_mentions.gsub('"',"'")
24
+ card.name.gsub('"',"'")
25
25
  end
26
26
 
27
27
  def body
28
- "Trello: #{item.card.url}"
28
+ "Trello: #{card.url}"
29
29
  end
30
30
 
31
31
  def prefixes
@@ -11,18 +11,19 @@ module TrelloFlow
11
11
  end
12
12
 
13
13
  def pick(title = nil)
14
- return if @records.none?
15
- return @records.first if @records.one?
14
+ return if records.none?
16
15
  Cli.title title if title
17
16
  render_table
18
17
  index = Cli.ask("Pick one:", Integer)
19
- @records[index - 1]
18
+ records[index - 1]
20
19
  end
21
20
 
22
21
  private
23
22
 
23
+ attr_reader :records
24
+
24
25
  def render_table
25
- if @records.size > 0
26
+ if records.size > 0
26
27
  Cli.table rows
27
28
  else
28
29
  Cli.say "No records found"
@@ -30,7 +31,7 @@ module TrelloFlow
30
31
  end
31
32
 
32
33
  def rows
33
- @records.each_with_index.map do |record, index|
34
+ records.each_with_index.map do |record, index|
34
35
  Row.new(record, index).to_h
35
36
  end
36
37
  end
@@ -1,3 +1,3 @@
1
1
  module TrelloFlow
2
- VERSION = "1.3.0"
2
+ VERSION = "2.0.0"
3
3
  end
data/lib/trello_flow.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "trello_flow/version"
2
2
  require "trello_flow/cli"
3
+ require "trello_flow/table"
3
4
  require "trello_flow/config"
4
5
  require "trello_flow/branch"
5
6
  require "trello_flow/cleanup"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trello_flow
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jens Balvig
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-11-09 00:00:00.000000000 Z
11
+ date: 2016-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -232,8 +232,6 @@ files:
232
232
  - lib/trello_flow/api/base.rb
233
233
  - lib/trello_flow/api/board.rb
234
234
  - lib/trello_flow/api/card.rb
235
- - lib/trello_flow/api/checklist.rb
236
- - lib/trello_flow/api/item.rb
237
235
  - lib/trello_flow/api/json_parser.rb
238
236
  - lib/trello_flow/api/list.rb
239
237
  - lib/trello_flow/api/member.rb
@@ -1,39 +0,0 @@
1
- require "trello_flow/table"
2
-
3
- module TrelloFlow
4
- module Api
5
- class Checklist < Base
6
- belongs_to :card
7
- #has_many :items, uri: "checklists/:checklist_id/checkItems"
8
-
9
- def self.fields
10
- [:name]
11
- end
12
-
13
- def select_or_create_item(item_name = nil)
14
- if item_name.present? || items.none?
15
- add_item (Cli.ask("Input to-do [#{card.name}]:").presence || card.name)
16
- else
17
- Table.pick(items, title: "#{card.name} (#{name})")
18
- end
19
- end
20
-
21
- def items
22
- attributes[:checkItems].map do |attr|
23
- Item.new attr.merge(checklist_id: id)
24
- end
25
- end
26
-
27
- def card_id
28
- attributes[:idCard]
29
- end
30
-
31
- private
32
-
33
- def add_item(name)
34
- Item.with("checklists/:checklist_id/checkItems").where(checklist_id: id).create(name: name)
35
- # items.create(name: name)
36
- end
37
- end
38
- end
39
- end
@@ -1,71 +0,0 @@
1
- module TrelloFlow
2
- module Api
3
- class Item < Base
4
- delegate :card, :card_id, to: :checklist
5
-
6
- def self.fields
7
- [:description, :owners]
8
- end
9
-
10
- def self.find(checklist_id, item_id)
11
- with("checklists/#{checklist_id}/checkItems/#{item_id}").find_one
12
- end
13
-
14
- def description
15
- if complete?
16
- checkmark + name_without_mentions
17
- else
18
- name_without_mentions
19
- end
20
- end
21
-
22
- def owners
23
- mentions.join(", ")
24
- end
25
-
26
- def color
27
- :green if complete?
28
- end
29
-
30
- def assign(owner)
31
- return if mentions.include?(owner.username)
32
- self.class.request :put, "cards/#{card_id}/checklist/#{checklist_id}/checkItem/#{id}/name", value: name_without_mentions + " @#{owner.username}"
33
- card.add_member(owner)
34
- end
35
-
36
- def complete
37
- self.class.request :put, "cards/#{card_id}/checklist/#{checklist_id}/checkItem/#{id}/state", value: "complete"
38
- end
39
-
40
- def to_param
41
- name_without_mentions.parameterize[0..50]
42
- end
43
-
44
- def name_without_mentions
45
- (name.split - mentions).join(" ").strip
46
- end
47
-
48
- private
49
-
50
- def checklist
51
- @_checklist ||= Checklist.find checklist_id
52
- end
53
-
54
- def checklist_id
55
- attributes[:idChecklist]
56
- end
57
-
58
- def mentions
59
- name.scan(/(@\S+)/).flatten
60
- end
61
-
62
- def checkmark
63
- "\u2713 "
64
- end
65
-
66
- def complete?
67
- state == "complete"
68
- end
69
- end
70
- end
71
- end