trello-client 0.0.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.
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ .*.swp
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ html/
13
+ lib/bundler/man
14
+ out.txt
15
+ pkg
16
+ rdoc
17
+ spec/reports
18
+ test/tmp
19
+ test/version_tmp
20
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in trello-client.gemspec
4
+ gemspec
data/History.rdoc ADDED
@@ -0,0 +1,7 @@
1
+ = Trello::Client History
2
+
3
+ == 2012-03-28 v0.0.1
4
+
5
+ * First public release.
6
+ * Added Trello::Client#member()
7
+
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 blair christensen
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,53 @@
1
+ = Trello::Client - Trello API client
2
+
3
+ == Configuration
4
+
5
+ Get developer API key:
6
+ https://trello.com/1/appKey/generate
7
+
8
+ Get user token:
9
+ https://trello.com/1/connect?key=$YOUR_API_KEY&name=trello-client.rb&response_type=token
10
+
11
+ == Usage
12
+
13
+ require 'trello-client'
14
+
15
+ Trello::Client.new do |client|
16
+ # Set API key
17
+ client.api_key = ...
18
+
19
+ # Set token
20
+ client.token = ...
21
+
22
+ # Get member
23
+ client.member('me') do |m|
24
+ # Returns Trello::Client::Member object
25
+ m['id'] # => member identity
26
+ m['fullName'] # => member name
27
+ m['userName'] # => member user
28
+
29
+ m.boards.each do |board|
30
+ # TODO Returns Board JSON
31
+ end
32
+ end
33
+
34
+ == Author
35
+
36
+ blair christensen. <mailto:blair.christensen@gmail.com>
37
+
38
+ == Homepage
39
+
40
+ https://github.com/blairc/trello-client/
41
+
42
+ == See Also
43
+
44
+ * https://trello.com/docs/api/
45
+
46
+ == To Do
47
+
48
+ * Get boards
49
+ * Get lists
50
+ * Get cards
51
+ * Memoize API calls
52
+ * Add script
53
+
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
3
+
4
+ require 'rake/clean'
5
+ require 'rake/testtask'
6
+ require 'rdoc-readme/rake_task'
7
+ require 'rdoc/task'
8
+
9
+ %w{ coverage html out.txt pkg }.each { |p| CLEAN.include(p) }
10
+ %w{ build install rdoc test }.each { |t| task t.to_sym => [ 'rdoc:readme' ] }
11
+
12
+ task :default => :test
13
+
14
+ Rake::TestTask.new do |t|
15
+ t.libs << 'test'
16
+ t.test_files = FileList['test/test*.rb']
17
+ t.verbose = true
18
+ end
19
+
20
+ RDoc::Readme::RakeTask.new 'lib/trello-client.rb', 'README.rdoc'
21
+
22
+ RDoc::Task.new do |rdoc|
23
+ rdoc.main = 'README.rdoc'
24
+ rdoc.rdoc_files.include('README.rdoc', 'lib/**/*.rb', 'doc/*.txt')
25
+ end
26
+
27
+ desc 'Update test data files'
28
+ task :update_test_data do
29
+ $LOAD_PATH << 'lib'
30
+ require 'open-uri'
31
+ require 'trello-client'
32
+
33
+ Trello::Client.new do |client|
34
+ client.api_key = ENV['TRELLO_API_KEY']
35
+ client.api_token = ENV['TRELLO_API_TOKEN']
36
+
37
+ {
38
+ 'member' => [ :member, 'me' ],
39
+ 'member_with_boards' => [ :member, 'me', :boards => 'all' ]
40
+ }.each_pair do |file, request|
41
+ fn = File.join( File.dirname(__FILE__), 'test', 'data', "#{file}.json" )
42
+ meth = request.shift
43
+ args = request
44
+ File.open(fn, 'w') { |fh| fh.puts( client.send meth, *args ) }
45
+ end
46
+ end
47
+
48
+ end
49
+
@@ -0,0 +1,134 @@
1
+ # encoding: utf-8
2
+
3
+ require 'multi_json'
4
+ require 'open-uri'
5
+ require 'uri'
6
+
7
+ require 'trello-client/member'
8
+ require 'trello-client/version'
9
+
10
+ #
11
+ # = Trello::Client - Trello API client
12
+ #
13
+ # == Configuration
14
+ #
15
+ # Get developer API key:
16
+ # https://trello.com/1/appKey/generate
17
+ #
18
+ # Get user token:
19
+ # https://trello.com/1/connect?key=$YOUR_API_KEY&name=trello-client.rb&response_type=token
20
+ #
21
+ # == Usage
22
+ #
23
+ # require 'trello-client'
24
+ #
25
+ # Trello::Client.new do |client|
26
+ # # Set API key
27
+ # client.api_key = ...
28
+ #
29
+ # # Set token
30
+ # client.token = ...
31
+ #
32
+ # # Get member
33
+ # client.member('me') do |m|
34
+ # # Returns Trello::Client::Member object
35
+ # m['id'] # => member identity
36
+ # m['fullName'] # => member name
37
+ # m['userName'] # => member user
38
+ #
39
+ # m.boards.each do |board|
40
+ # # TODO Returns Board JSON
41
+ # end
42
+ # end
43
+ #
44
+ # == Author
45
+ #
46
+ # blair christensen. <mailto:blair.christensen@gmail.com>
47
+ #
48
+ # == Homepage
49
+ #
50
+ # https://github.com/blairc/trello-client/
51
+ #
52
+ # == See Also
53
+ #
54
+ # * https://trello.com/docs/api/
55
+ #
56
+ # == To Do
57
+ #
58
+ # * Get boards
59
+ # * Get lists
60
+ # * Get cards
61
+ # * Memoize API calls
62
+ # * Add script
63
+ #
64
+ module Trello # :nodoc:
65
+
66
+ #
67
+ # Trello API client.
68
+ #
69
+ class Client
70
+
71
+ #
72
+ # Get/Set Trello API URL
73
+ #
74
+ attr_accessor :api
75
+
76
+ #
77
+ # Get/Set Trello API key
78
+ #
79
+ attr_accessor :api_key
80
+
81
+ #
82
+ # Get/Set Trello API application token
83
+ #
84
+ attr_accessor :api_token
85
+
86
+ #
87
+ # Initialize Trello::Client object
88
+ #
89
+ def initialize
90
+ @api = 'https://api.trello.com/1'
91
+ @api_key = nil
92
+ @api_token = nil
93
+ yield self if block_given?
94
+ self
95
+ end
96
+
97
+ #
98
+ # Get Trello::Client::Member object
99
+ #
100
+ # See https://trello.com/docs/api/member/index.html
101
+ #
102
+ # Params:
103
+ # +id+:: Member identifier
104
+ # +options+:: (optional) Additional API parameters
105
+ #
106
+ def member(id, options = {} )
107
+ raise('invalid id') if id.nil? || id.empty?
108
+ _get "#{api}/members/#{id}", options
109
+ end
110
+
111
+
112
+ private
113
+
114
+ def _get( uri, options = {} )
115
+ raise('invalid URI') if uri.nil? || uri.empty?
116
+ raise('invalid API key') if @api_key.nil? || @api_key.empty?
117
+ raise('invalid API token') if @api_token.nil? || @api_token.empty?
118
+
119
+ defaults = { :key => @api_key, :token => @api_token }
120
+ options.merge!(defaults)
121
+ if options
122
+ uri << '?'
123
+ options.keys.sort.each do |k|
124
+ uri << "#{k}=#{ options[k] }&"
125
+ end
126
+ end
127
+ uri.gsub! /&$/, ''
128
+ open(uri).read
129
+ end
130
+
131
+ end # class Client
132
+
133
+ end # module Trello
134
+
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+
3
+ module Trello # :nodoc:
4
+ class Client # :nodoc
5
+
6
+ #
7
+ # Trello::Client::Member object
8
+ #
9
+ class Member
10
+
11
+ #
12
+ # Initialize Trello::Member
13
+ #
14
+ def initialize(json)
15
+ @json = MultiJson.decode(json)
16
+ yield self if block_given?
17
+ self
18
+ end
19
+
20
+ #
21
+ # Get Trello::Member property
22
+ #
23
+ def[](key)
24
+ @json[key]
25
+ end
26
+
27
+ #
28
+ # Get +Array+ of boards
29
+ #
30
+ def boards
31
+ @json['boards'] || []
32
+ end
33
+
34
+ end # class Member
35
+
36
+ end # class Client
37
+ end # module Trello
38
+
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ module Trello
4
+ class Client
5
+ #
6
+ # Trello::Client version
7
+ #
8
+ VERSION = '0.0.1'
9
+ end
10
+ end
@@ -0,0 +1 @@
1
+ {"id":"4f4f9d55cf2e679318098c45","fullName":"blair christensen","initials":"BC","username":"blairchristensen","avatarHash":"65fcb89a59ff96b68b11332686c8f4f9","bio":"","url":"https://trello.com/blairchristensen"}
@@ -0,0 +1 @@
1
+ {"id":"4f4f9d55cf2e679318098c45","fullName":"blair christensen","initials":"BC","username":"blairchristensen","avatarHash":"65fcb89a59ff96b68b11332686c8f4f9","bio":"","url":"https://trello.com/blairchristensen","boards":[{"id":"4f4d0477e4ba0e4f09af1c6c","name":"5E - Survey Database Site Features","desc":"","closed":false,"idOrganization":"","pinned":true,"url":"https://trello.com/board/5e-survey-database-site-features/4f4d0477e4ba0e4f09af1c6c","prefs":{"selfJoin":false,"invitations":"members","comments":"members","voting":"members","permissionLevel":"private"}},{"id":"4f4f9d55cf2e679318098c5b","name":"Welcome Board","desc":"","closed":false,"pinned":true,"url":"https://trello.com/board/welcome-board/4f4f9d55cf2e679318098c5b","prefs":{"selfJoin":false,"invitations":"members","comments":"members","voting":"members","permissionLevel":"private"}},{"id":"4f6c9a79c3974b4d730a5533","name":"uchicago","desc":"","closed":false,"idOrganization":"","pinned":true,"url":"https://trello.com/board/uchicago/4f6c9a79c3974b4d730a5533","prefs":{"selfJoin":false,"invitations":"members","comments":"members","voting":"members","permissionLevel":"private"}}]}
@@ -0,0 +1,147 @@
1
+ # encoding: utf-8
2
+
3
+ require 'simplecov'
4
+ SimpleCov.start
5
+
6
+ require 'fakeweb'
7
+ require 'mocha'
8
+ require 'trello-client'
9
+ require 'test/unit'
10
+
11
+
12
+ class TestClient < Test::Unit::TestCase
13
+
14
+ def setup
15
+ @api_key = 'test'
16
+ @api_token = 'test'
17
+
18
+ @test_dir = File.dirname(__FILE__)
19
+ @test_data = File.join( @test_dir, 'data' )
20
+ end
21
+
22
+
23
+ def test_initialization
24
+ blockable = false
25
+ client = Trello::Client.new do |client|
26
+ assert_kind_of Trello::Client, client
27
+ blockable = true
28
+ end
29
+ assert blockable, 'works as block'
30
+ assert_kind_of Trello::Client, client
31
+ assert_kind_of Trello::Client, Trello::Client.new
32
+ end
33
+
34
+ def test_accessors
35
+ Trello::Client.new do |client|
36
+ assert_equal 'https://api.trello.com/1', client.api
37
+ assert_nil client.api_key
38
+ assert_nil client.api_token
39
+ end
40
+ end
41
+
42
+ def test_member_parameter_validation
43
+ Trello::Client.new do |client|
44
+ assert_raise(RuntimeError, 'invalid id') { client.member(nil) }
45
+ assert_raise(RuntimeError, 'invalid id') { client.member('') }
46
+
47
+ assert_nil client.api_key
48
+ assert_raise(RuntimeError, 'invalid API key') { client.member('me') }
49
+ client.api_key = ''
50
+ assert_equal '', client.api_key
51
+ assert_raise(RuntimeError, 'invalid API key') { client.member('me') }
52
+ client.api_key = @api_key
53
+ assert_equal @api_key, client.api_key
54
+
55
+ assert_nil client.api_token
56
+ assert_raise(RuntimeError, 'invalid API token') { client.member('me') }
57
+ client.api_token = ''
58
+ assert_equal '', client.api_token
59
+ assert_raise(RuntimeError, 'invalid API token') { client.member('me') }
60
+ end
61
+ end
62
+
63
+ def test_member
64
+ Trello::Client.new do |client|
65
+ json = open( File.join( @test_data, 'member.json' ) )
66
+ m = Trello::Client::Member.new(json)
67
+ client.stubs(:member).with('me').returns(m)
68
+
69
+ assert_not_nil m
70
+ assert_kind_of Trello::Client::Member, m
71
+
72
+ assert_equal '65fcb89a59ff96b68b11332686c8f4f9', m['avatarHash']
73
+ assert_equal '', m['bio']
74
+ assert_nil m['boards']
75
+ assert_equal 'blair christensen', m['fullName']
76
+ assert_equal '4f4f9d55cf2e679318098c45', m['id']
77
+ assert_equal 'BC', m['initials']
78
+ assert_equal 'https://trello.com/blairchristensen', m['url']
79
+ assert_equal 'blairchristensen', m['username']
80
+
81
+ assert_not_nil m.boards
82
+ assert_kind_of Array, m.boards
83
+ assert_equal 0, m.boards.size
84
+ end
85
+ end
86
+
87
+ def test_member_with_boards
88
+ Trello::Client.new do |client|
89
+ json = open( File.join( @test_data, 'member_with_boards.json' ) )
90
+ m = Trello::Client::Member.new(json)
91
+ client.stubs(:member).with('me').returns(m)
92
+
93
+ assert_not_nil m
94
+ assert_kind_of Trello::Client::Member, m
95
+
96
+ assert_equal '65fcb89a59ff96b68b11332686c8f4f9', m['avatarHash']
97
+ assert_equal '', m['bio']
98
+ assert_not_nil m['boards']
99
+ assert_equal 'blair christensen', m['fullName']
100
+ assert_equal '4f4f9d55cf2e679318098c45', m['id']
101
+ assert_equal 'BC', m['initials']
102
+ assert_equal 'https://trello.com/blairchristensen', m['url']
103
+ assert_equal 'blairchristensen', m['username']
104
+
105
+ assert_not_nil m.boards
106
+ assert_kind_of Array, m.boards
107
+ assert_equal 3, m.boards.size
108
+ end
109
+ end
110
+
111
+ def test_underscore_get_parameter_validation
112
+ Trello::Client.new do |client|
113
+ uri = "#{ client.api }/member/me"
114
+
115
+ assert_raise(RuntimeError, 'invalid URI') { client.send( :_get, nil ) }
116
+ assert_raise(RuntimeError, 'invalid URI') { client.send( :_get, '' ) }
117
+
118
+ assert_raise(RuntimeError, 'invalid API key') { client.send( :_get, uri ) }
119
+ assert_raise(RuntimeError, 'invalid API key') { client.send( :_get, uri ) }
120
+ client.api_key = @api_key
121
+
122
+ assert_raise(RuntimeError, 'invalid API token') { client.send( :_get, uri ) }
123
+ assert_raise(RuntimeError, 'invalid API token') { client.send( :_get, uri ) }
124
+ client.api_token = @api_token
125
+ end
126
+ end
127
+
128
+ def test_underscore_get
129
+ Trello::Client.new do |client|
130
+ json = open( File.join( @test_data, 'member.json' ) ).read
131
+ uri = "#{ client.api }/member/me"
132
+ fake_uri = "#{uri}?key=test&token=test"
133
+ FakeWeb.register_uri( :get, fake_uri, :body => json )
134
+
135
+ client.api_key = @api_key
136
+ client.api_token = @api_token
137
+
138
+ r = client.send( :_get, uri )
139
+
140
+ assert_not_nil r
141
+ assert_equal json, r
142
+ end
143
+
144
+ end
145
+
146
+ end
147
+
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ require 'simplecov'
4
+ SimpleCov.start
5
+
6
+ require 'fakeweb'
7
+ require 'mocha'
8
+ require 'trello-client'
9
+ require 'test/unit'
10
+
11
+
12
+ class TestMember < Test::Unit::TestCase
13
+
14
+ def test
15
+ skip 'TODO - Add explicit Test::Client::Member tests'
16
+ end
17
+
18
+ end
19
+
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/trello-client/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ['blair christensen']
6
+ gem.email = ['blair.christensen@gmail.com']
7
+ gem.description = %q{Trello API client}
8
+ gem.summary = %q{Trello API client}
9
+ gem.homepage = 'https://github.com/blairc/trello-client/'
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = 'trello-client'
15
+ gem.require_paths = ['lib']
16
+ gem.version = Trello::Client::VERSION
17
+
18
+ gem.add_runtime_dependency 'multi_json'
19
+
20
+ gem.add_development_dependency 'fakeweb'
21
+ gem.add_development_dependency 'mocha'
22
+ gem.add_development_dependency 'rake'
23
+ gem.add_development_dependency 'rdoc'
24
+ gem.add_development_dependency 'rdoc-readme', '~> 0.1.2'
25
+ gem.add_development_dependency 'simplecov'
26
+ end
27
+
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trello-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - blair christensen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: multi_json
16
+ requirement: &70273668948620 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70273668948620
25
+ - !ruby/object:Gem::Dependency
26
+ name: fakeweb
27
+ requirement: &70273668947980 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70273668947980
36
+ - !ruby/object:Gem::Dependency
37
+ name: mocha
38
+ requirement: &70273668947200 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70273668947200
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: &70273668946460 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70273668946460
58
+ - !ruby/object:Gem::Dependency
59
+ name: rdoc
60
+ requirement: &70273668945700 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70273668945700
69
+ - !ruby/object:Gem::Dependency
70
+ name: rdoc-readme
71
+ requirement: &70273668944700 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 0.1.2
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70273668944700
80
+ - !ruby/object:Gem::Dependency
81
+ name: simplecov
82
+ requirement: &70273668965120 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70273668965120
91
+ description: Trello API client
92
+ email:
93
+ - blair.christensen@gmail.com
94
+ executables: []
95
+ extensions: []
96
+ extra_rdoc_files: []
97
+ files:
98
+ - .gitignore
99
+ - Gemfile
100
+ - History.rdoc
101
+ - LICENSE
102
+ - README.rdoc
103
+ - Rakefile
104
+ - lib/trello-client.rb
105
+ - lib/trello-client/member.rb
106
+ - lib/trello-client/version.rb
107
+ - test/data/member.json
108
+ - test/data/member_with_boards.json
109
+ - test/test_client.rb
110
+ - test/test_member.rb
111
+ - trello-client.gemspec
112
+ homepage: https://github.com/blairc/trello-client/
113
+ licenses: []
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ segments:
125
+ - 0
126
+ hash: -3090611917339135223
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ segments:
134
+ - 0
135
+ hash: -3090611917339135223
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 1.8.11
139
+ signing_key:
140
+ specification_version: 3
141
+ summary: Trello API client
142
+ test_files:
143
+ - test/data/member.json
144
+ - test/data/member_with_boards.json
145
+ - test/test_client.rb
146
+ - test/test_member.rb