ruby-trello 1.1.0 → 1.1.1

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: c4d52816b20573e0e428d30639952518f52c303e
4
- data.tar.gz: ba52ccc7483b34f53d018cdef8be47565959c1b0
3
+ metadata.gz: 646b1425d617c5840facf57bee4cf7b52a7ef4a7
4
+ data.tar.gz: 805feb33ce7d86288b20612451bbe523fce80e91
5
5
  SHA512:
6
- metadata.gz: 64d9ab9659f109dca082bf07764aa695c6487e294c6b5fd9e3e951ffc8492d24ab26e80a676648a2dd3f877f7d2c2b3c00e4bf7b8fab742d7caae67f1e1a4511
7
- data.tar.gz: 06941e4963b76afb942927c2657e07544fa44e698655bb1d4a6d74c6457b53fec9aa695615076ff3b544bafe9a7e679918f510111358bf5c690f246254530bf4
6
+ metadata.gz: d5c21fc97bbfe409dadf87336190dd6ec1c875bae9f4154ae761529a1dae50c17fe7757af4b9cb66c6bf40498c8a2f9a9085da1978ddfba279486c93bdb09baa
7
+ data.tar.gz: 74655e09b8a6fb6ed6a00e10a63b5e4f4d9e9b7d4014aaf74575e8a473f9644e9759f75b6f9722800b8af2852de8e2a75dbd706afc1404c3f50c778120dc9cf7
data/lib/trello.rb CHANGED
@@ -41,6 +41,7 @@ module Trello
41
41
  autoload :Association, 'trello/association'
42
42
  autoload :AssociationProxy, 'trello/association_proxy'
43
43
  autoload :Attachment, 'trello/attachment'
44
+ autoload :CoverImage, 'trello/cover_image'
44
45
  autoload :BasicData, 'trello/basic_data'
45
46
  autoload :Board, 'trello/board'
46
47
  autoload :Card, 'trello/card'
data/lib/trello/action.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Trello
2
2
  # Action represents some event that occurred. For instance, when a card is created.
3
3
  class Action < BasicData
4
- register_attributes :id, :type, :data, :date, :member_creator_id,
5
- :readonly => [ :id, :type, :data, :date, :member_creator_id ]
4
+ register_attributes :id, :type, :data, :date, :member_creator_id, :member_participant,
5
+ :readonly => [ :id, :type, :data, :date, :member_creator_id, :member_participant ]
6
6
  validates_presence_of :id, :type, :date, :member_creator_id
7
7
 
8
8
  class << self
@@ -10,6 +10,14 @@ module Trello
10
10
  def find(id, params = {})
11
11
  client.find(:action, id, params)
12
12
  end
13
+
14
+ def search(query, opts={})
15
+ response = client.get("/search/", { query: query }.merge(opts))
16
+ formatted_response = JSON.parse(response).except("options").inject({}) do |res, key|
17
+ res.merge!({ key.first => key.last.jsoned_into("Trello::#{key.first.singularize.capitalize}".constantize) })
18
+ res
19
+ end
20
+ end
13
21
  end
14
22
 
15
23
  # Update the attributes of an action
@@ -17,11 +25,12 @@ module Trello
17
25
  # Supply a hash of string keyed data retrieved from the Trello API representing
18
26
  # an Action.
19
27
  def update_fields(fields)
20
- attributes[:id] = fields['id']
21
- attributes[:type] = fields['type']
22
- attributes[:data] = fields['data']
23
- attributes[:date] = Time.iso8601(fields['date'])
24
- attributes[:member_creator_id] = fields['idMemberCreator']
28
+ attributes[:id] = fields['id']
29
+ attributes[:type] = fields['type']
30
+ attributes[:data] = fields['data']
31
+ attributes[:date] = Time.iso8601(fields['date'])
32
+ attributes[:member_creator_id] = fields['idMemberCreator']
33
+ attributes[:member_participant] = fields['member']
25
34
  self
26
35
  end
27
36
 
@@ -1,4 +1,7 @@
1
- require 'trello/string'
1
+ require 'trello/core_ext/array'
2
+ require 'trello/core_ext/hash'
3
+ require 'trello/core_ext/string'
4
+ require 'active_support/inflector'
2
5
 
3
6
  module Trello
4
7
  class BasicData
data/lib/trello/board.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Trello
2
2
  class Board < BasicData
3
3
  register_attributes :id, :name, :description, :closed, :url, :organization_id, :prefs,
4
- :readonly => [ :id, :url, :organization_id, :prefs ]
4
+ :readonly => [ :id, :url, :prefs ]
5
5
  validates_presence_of :id, :name
6
6
  validates_length_of :name, :in => 1..16384
7
7
  validates_length_of :description, :maximum => 16384
@@ -15,10 +15,12 @@ module Trello
15
15
  end
16
16
 
17
17
  def create(fields)
18
- client.create(:board,
18
+ data = {
19
19
  'name' => fields[:name],
20
20
  'desc' => fields[:description],
21
- 'closed' => fields[:closed] || false)
21
+ 'closed' => fields[:closed] || false }
22
+ data.merge!('idOrganization' => fields[:organization_id]) if fields[:organization_id]
23
+ client.create(:board, data)
22
24
  end
23
25
 
24
26
  def all
data/lib/trello/card.rb CHANGED
@@ -1,14 +1,36 @@
1
1
  module Trello
2
2
  # A Card is a container that can house checklists and comments; it resides inside a List.
3
3
  class Card < BasicData
4
- register_attributes :id, :short_id, :name, :desc, :due, :closed, :url, :board_id, :member_ids, :list_id, :pos, :last_activity_date,
5
- :readonly => [ :id, :short_id, :url, :board_id, :member_ids, :last_activity_date ]
4
+ register_attributes :id, :short_id, :name, :desc, :due, :closed, :url, :short_url,
5
+ :board_id, :member_ids, :list_id, :pos, :last_activity_date, :card_labels,
6
+ :cover_image_id, :badges, :card_members,
7
+ :readonly => [ :id, :short_id, :url, :short_url, :last_activity_date, :badges, :card_members ]
6
8
  validates_presence_of :id, :name, :list_id
7
9
  validates_length_of :name, :in => 1..16384
8
10
  validates_length_of :desc, :in => 0..16384
9
11
 
10
12
  include HasActions
11
13
 
14
+ SYMBOL_TO_STRING = {
15
+ id: 'id',
16
+ short_id: 'idShort',
17
+ name: 'name',
18
+ desc: 'desc',
19
+ due: 'due',
20
+ closed: 'closed',
21
+ url: 'url',
22
+ short_url: 'shortUrl',
23
+ board_id: 'idBoard',
24
+ member_ids: 'idMembers',
25
+ cover_image_id: 'idAttachmentCover',
26
+ list_id: 'idList',
27
+ pos: 'pos',
28
+ last_activity_date: 'dateLastActivity',
29
+ card_labels: 'labels',
30
+ badges: 'badges',
31
+ card_members: 'members'
32
+ }
33
+
12
34
  class << self
13
35
  # Find a specific card by its id.
14
36
  def find(id, params = {})
@@ -18,9 +40,12 @@ module Trello
18
40
  # Create a new card and save it on Trello.
19
41
  def create(options)
20
42
  client.create(:card,
21
- 'name' => options[:name],
22
- 'idList' => options[:list_id],
23
- 'desc' => options[:desc])
43
+ 'name' => options[:name],
44
+ 'idList' => options[:list_id],
45
+ 'desc' => options[:desc],
46
+ 'idMembers' => options[:member_ids],
47
+ 'labels' => options[:card_labels]
48
+ )
24
49
  end
25
50
  end
26
51
 
@@ -29,23 +54,30 @@ module Trello
29
54
  # Supply a hash of string keyed data retrieved from the Trello API representing
30
55
  # a card.
31
56
  def update_fields(fields)
32
- attributes[:id] = fields['id']
33
- attributes[:short_id] = fields['idShort']
34
- attributes[:name] = fields['name']
35
- attributes[:desc] = fields['desc']
36
- attributes[:due] = Time.iso8601(fields['due']) rescue nil
37
- attributes[:closed] = fields['closed']
38
- attributes[:url] = fields['url']
39
- attributes[:board_id] = fields['idBoard']
40
- attributes[:member_ids] = fields['idMembers']
41
- attributes[:list_id] = fields['idList']
42
- attributes[:pos] = fields['pos']
43
- attributes[:last_activity_date] = Time.iso8601(fields['dateLastActivity']) rescue nil
57
+ attributes[:id] = fields[SYMBOL_TO_STRING[:id]]
58
+ attributes[:short_id] = fields[SYMBOL_TO_STRING[:short_id]]
59
+ attributes[:name] = fields[SYMBOL_TO_STRING[:name]]
60
+ attributes[:desc] = fields[SYMBOL_TO_STRING[:desc]]
61
+ attributes[:due] = Time.iso8601(fields[SYMBOL_TO_STRING[:due]]) rescue nil
62
+ attributes[:closed] = fields[SYMBOL_TO_STRING[:closed]]
63
+ attributes[:url] = fields[SYMBOL_TO_STRING[:url]]
64
+ attributes[:short_url] = fields[SYMBOL_TO_STRING[:short_url]]
65
+ attributes[:board_id] = fields[SYMBOL_TO_STRING[:board_id]]
66
+ attributes[:member_ids] = fields[SYMBOL_TO_STRING[:member_ids]]
67
+ attributes[:list_id] = fields[SYMBOL_TO_STRING[:list_id]]
68
+ attributes[:pos] = fields[SYMBOL_TO_STRING[:post]]
69
+ attributes[:card_labels] = fields[SYMBOL_TO_STRING[:card_labels]]
70
+ attributes[:last_activity_date] = Time.iso8601(fields[SYMBOL_TO_STRING[:last_activity_date]]) rescue nil
71
+ attributes[:cover_image_id] = fields[SYMBOL_TO_STRING[:cover_image_id]]
72
+ attributes[:badges] = fields[SYMBOL_TO_STRING[:badges]]
73
+ attributes[:card_members] = fields[SYMBOL_TO_STRING[:card_members]]
44
74
  self
45
75
  end
46
76
 
47
77
  # Returns a reference to the board this card is part of.
48
78
  one :board, :path => :boards, :using => :board_id
79
+ # Returns a reference to the cover image attachment
80
+ one :cover_image, :path => :attachments, :using => :cover_image_id
49
81
 
50
82
  # Returns a list of checklists associated with the card.
51
83
  #
@@ -77,9 +109,11 @@ module Trello
77
109
  return update! if id
78
110
 
79
111
  client.post("/cards", {
80
- :name => name,
81
- :desc => desc,
82
- :idList => list_id
112
+ name: name,
113
+ desc: desc,
114
+ idList: list_id,
115
+ idMembers: member_ids,
116
+ labels: card_labels
83
117
  }).json_into(self)
84
118
  end
85
119
 
@@ -90,7 +124,7 @@ module Trello
90
124
  def update!
91
125
  @previously_changed = changes
92
126
  # extract only new values to build payload
93
- payload = Hash[changes.map { |key, values| [key.to_sym.eql?(:list_id) ? :idList : key.to_sym, values[1]] }]
127
+ payload = Hash[changes.map { |key, values| [SYMBOL_TO_STRING[key.to_sym].to_sym, values[1]] }]
94
128
  @changed_attributes.clear
95
129
 
96
130
  client.put("/cards/#{id}", payload)
@@ -1,7 +1,7 @@
1
1
  module Trello
2
2
  # A Checklist holds items which are like a "task" list. Checklists are linked to a card.
3
3
  class Checklist < BasicData
4
- register_attributes :id, :name, :description, :closed, :url, :check_items, :board_id, :list_id, :member_ids,
4
+ register_attributes :id, :name, :description, :closed, :position, :url, :check_items, :board_id, :list_id, :member_ids,
5
5
  :readonly => [:id, :description, :closed, :url, :check_items, :board_id, :list_id, :member_ids]
6
6
  validates_presence_of :id, :board_id, :list_id
7
7
  validates_length_of :name, :in => 1..16384
@@ -30,6 +30,7 @@ module Trello
30
30
  attributes[:closed] = fields['closed']
31
31
  attributes[:url] = fields['url']
32
32
  attributes[:check_items] = fields['checkItems']
33
+ attributes[:position] = fields['position']
33
34
  attributes[:board_id] = fields['idBoard']
34
35
  attributes[:list_id] = fields['idList']
35
36
  attributes[:member_ids] = fields['idMembers']
@@ -52,7 +53,7 @@ module Trello
52
53
  end
53
54
 
54
55
  def update!
55
- client.put("/checklists/#{id}", {:name => name}).json_into(self)
56
+ client.put("/checklists/#{id}", {:name => name, :pos => position}).json_into(self)
56
57
  end
57
58
 
58
59
  # Return a list of items on the checklist.
data/lib/trello/client.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'addressable/uri'
2
2
  require 'forwardable'
3
+ require 'active_support/inflector'
3
4
 
4
5
  module Trello
5
6
  class Client
@@ -0,0 +1,5 @@
1
+ class Array
2
+ def jsoned_into(obj)
3
+ self.map { |element| element.jsoned_into(obj) }
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class Hash
2
+ def jsoned_into(obj)
3
+ action = obj.kind_of?(Class) ? :new : :update_fields
4
+ obj.send(action, self)
5
+ end
6
+ end
@@ -17,12 +17,7 @@ class String
17
17
  # thing.b == "foo"
18
18
  def json_into(obj)
19
19
  data = JSON.parse(self)
20
- action = obj.kind_of?(Class) ? :new : :update_fields
21
- if data.kind_of? Hash
22
- obj.send(action, JSON.parse(self))
23
- else
24
- data.map { |element| obj.send(action, element) }
25
- end
20
+ data.jsoned_into(obj)
26
21
  rescue JSON::ParserError => json_error
27
22
  if json_error.message =~ /model not found/
28
23
  Trello.logger.error "Could not find that record."
@@ -0,0 +1,8 @@
1
+ module Trello
2
+ # The trello cover image
3
+ #
4
+ # This is normally an attachment that the user (or trello) has set
5
+ # as the cover image
6
+ class CoverImage < Attachment
7
+ end
8
+ end
@@ -34,8 +34,8 @@ module Trello
34
34
  end
35
35
 
36
36
  # Returns an array of members associated with the organization.
37
- def members
38
- members = client.get("/organizations/#{id}/members/all").json_into(Member)
37
+ def members(params = {})
38
+ members = client.get("/organizations/#{id}/members/all", params).json_into(Member)
39
39
  MultiAssociation.new(self, members).proxy
40
40
  end
41
41
 
data/spec/action_spec.rb CHANGED
@@ -25,6 +25,15 @@ module Trello
25
25
  end
26
26
  end
27
27
 
28
+ context 'search' do
29
+ let(:client) { Trello.client }
30
+
31
+ it "should search and get back a card object" do
32
+ client.should_receive(:get).with("/search/", { query: "something"}).and_return(JSON.generate({ "cards" => cards_details }))
33
+ Action.search("something").should eq({ "cards" => cards_details.jsoned_into(Card) })
34
+ end
35
+ end
36
+
28
37
  context 'fields' do
29
38
  let(:detail) { actions_details.first }
30
39
 
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+ require 'trello/core_ext/array'
3
+
4
+ describe Array, '#jsoned_into' do
5
+ include Helpers
6
+
7
+ it "should convert an array of parsed json into cards" do
8
+ cards_details.jsoned_into(Trello::Card).should eq([cards_details.first.jsoned_into(Trello::Card)])
9
+ end
10
+ end
data/spec/card_spec.rb CHANGED
@@ -51,7 +51,7 @@ module Trello
51
51
 
52
52
  result = JSON.generate(cards_details.first.merge(payload.merge(:idList => lists_details.first['id'])))
53
53
 
54
- expected_payload = {:name => "Test Card", :desc => nil, :idList => "abcdef123456789123456789"}
54
+ expected_payload = {name: "Test Card", desc: nil, idList: "abcdef123456789123456789", idMembers: nil, labels: nil }
55
55
 
56
56
  client.should_receive(:post).with("/cards", expected_payload).and_return result
57
57
 
@@ -108,9 +108,17 @@ module Trello
108
108
  card.url.should_not be_nil
109
109
  end
110
110
 
111
+ it "gets its short url" do
112
+ card.short_url.should_not be_nil
113
+ end
114
+
111
115
  it "gets its last active date" do
112
116
  card.last_activity_date.should_not be_nil
113
117
  end
118
+
119
+ it "gets its cover image id" do
120
+ card.cover_image_id.should_not be_nil
121
+ end
114
122
  end
115
123
 
116
124
  context "actions" do
@@ -132,6 +140,13 @@ module Trello
132
140
  end
133
141
  end
134
142
 
143
+ context "cover image" do
144
+ it "has a cover image" do
145
+ client.stub(:get).with("/attachments/abcdef123456789123456789", {}).and_return JSON.generate(attachments_details.first)
146
+ card.cover_image.should_not be_nil
147
+ end
148
+ end
149
+
135
150
  context "checklists" do
136
151
  it "has a list of checklists" do
137
152
  client.stub(:get).with("/cards/abcdef123456789123456789/checklists", { :filter => :all }).and_return checklists_payload
@@ -66,7 +66,8 @@ module Trello
66
66
  expected_new_name = "xxx"
67
67
  expected_resource = "/checklists/abcdef123456789123456789"
68
68
  payload = {
69
- :name => expected_new_name
69
+ :name => expected_new_name,
70
+ :pos => checklist.position
70
71
  }
71
72
 
72
73
  result = JSON.generate(checklists_details.first)
@@ -76,6 +77,21 @@ module Trello
76
77
  checklist.save
77
78
  end
78
79
 
80
+ it "updating position does a put on the correct resource with the correct value" do
81
+ expected_new_position = 33
82
+ expected_resource = "/checklists/abcdef123456789123456789"
83
+ payload = {
84
+ :name => checklist.name,
85
+ :pos => expected_new_position
86
+ }
87
+
88
+ result = JSON.generate(checklists_details.first)
89
+ client.should_receive(:put).once.with(expected_resource, payload).and_return result
90
+
91
+ checklist.position = expected_new_position
92
+ checklist.save
93
+ end
94
+
79
95
  it "adds an item" do
80
96
  expected_item_name = "item1"
81
97
  expected_checked = true
data/spec/hash_spec.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+ require 'trello/core_ext/hash'
3
+
4
+ describe Hash, '#jsoned_into' do
5
+ include Helpers
6
+
7
+ it "should convert a single parsed json into card" do
8
+ Trello::Card.should_receive(:new).once.with(cards_details.first)
9
+ cards_details.first.jsoned_into(Trello::Card)
10
+ end
11
+ end
data/spec/spec_helper.rb CHANGED
@@ -70,6 +70,7 @@ module Helpers
70
70
  'name' => 'Test Checklist',
71
71
  'desc' => 'A marvelous little checklist',
72
72
  'closed' => false,
73
+ 'position' => 16384,
73
74
  'url' => 'https://trello.com/blah/blah',
74
75
  'idBoard' => 'abcdef123456789123456789',
75
76
  'idList' => 'abcdef123456789123456789',
@@ -105,8 +106,10 @@ module Helpers
105
106
  'closed' => false,
106
107
  'idList' => 'abcdef123456789123456789',
107
108
  'idBoard' => 'abcdef123456789123456789',
109
+ 'idAttachmentCover' => 'abcdef123456789123456789',
108
110
  'idMembers' => ['abcdef123456789123456789'],
109
111
  'url' => 'https://trello.com/card/board/specify-the-type-and-scope-of-the-jit-in-a-lightweight-spec/abcdef123456789123456789/abcdef123456789123456789',
112
+ 'shortUrl' => 'https://trello.com/c/abcdef12',
110
113
  'pos' => 12,
111
114
  'dateLastActivity' => '2012-12-07T18:40:24.314Z'
112
115
  }]
data/spec/string_spec.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'spec_helper'
2
- require 'trello/string'
2
+ require 'trello/core_ext/string'
3
3
 
4
4
  describe String, '#json_into' do
5
5
  include Helpers
@@ -24,9 +24,9 @@ describe String, '#json_into' do
24
24
  "name" => "Jazz Kang",
25
25
  "description" => "Plonker"
26
26
  })
27
-
27
+
28
28
  json_text = '{"name" : "Jazz Kang", "description": "Plonker"}'
29
-
29
+
30
30
  json_text.json_into example_class
31
31
  end
32
32
 
@@ -37,7 +37,7 @@ describe String, '#json_into' do
37
37
  {"name" : "Phil Murphy", "description": "Shoreditch hipster"}
38
38
  ]
39
39
  JSON
40
-
40
+
41
41
  result = json_text.json_into example_class
42
42
 
43
43
  result.should be_an Array
@@ -47,4 +47,4 @@ describe String, '#json_into' do
47
47
  end
48
48
  end
49
49
  end
50
-
50
+
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-trello
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Tregunna
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-23 00:00:00.000000000 Z
11
+ date: 2014-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: 3.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.2.0
27
27
  - !ruby/object:Gem::Dependency
@@ -98,6 +98,10 @@ files:
98
98
  - lib/trello/checklist.rb
99
99
  - lib/trello/client.rb
100
100
  - lib/trello/configuration.rb
101
+ - lib/trello/core_ext/array.rb
102
+ - lib/trello/core_ext/hash.rb
103
+ - lib/trello/core_ext/string.rb
104
+ - lib/trello/cover_image.rb
101
105
  - lib/trello/has_actions.rb
102
106
  - lib/trello/item.rb
103
107
  - lib/trello/item_state.rb
@@ -109,12 +113,12 @@ files:
109
113
  - lib/trello/net.rb
110
114
  - lib/trello/notification.rb
111
115
  - lib/trello/organization.rb
112
- - lib/trello/string.rb
113
116
  - lib/trello/token.rb
114
117
  - lib/trello/webhook.rb
115
118
  - lib/trello.rb
116
119
  - README.md
117
120
  - spec/action_spec.rb
121
+ - spec/array_spec.rb
118
122
  - spec/association_spec.rb
119
123
  - spec/basic_auth_policy_spec.rb
120
124
  - spec/board_spec.rb
@@ -122,6 +126,7 @@ files:
122
126
  - spec/checklist_spec.rb
123
127
  - spec/client_spec.rb
124
128
  - spec/configuration_spec.rb
129
+ - spec/hash_spec.rb
125
130
  - spec/integration/how_to_authorize_spec.rb
126
131
  - spec/integration/how_to_use_boards_spec.rb
127
132
  - spec/integration/integration_test.rb
@@ -164,6 +169,7 @@ specification_version: 4
164
169
  summary: A wrapper around the trello.com API.
165
170
  test_files:
166
171
  - spec/action_spec.rb
172
+ - spec/array_spec.rb
167
173
  - spec/association_spec.rb
168
174
  - spec/basic_auth_policy_spec.rb
169
175
  - spec/board_spec.rb
@@ -171,6 +177,7 @@ test_files:
171
177
  - spec/checklist_spec.rb
172
178
  - spec/client_spec.rb
173
179
  - spec/configuration_spec.rb
180
+ - spec/hash_spec.rb
174
181
  - spec/integration/how_to_authorize_spec.rb
175
182
  - spec/integration/how_to_use_boards_spec.rb
176
183
  - spec/integration/integration_test.rb