troo 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Gemfile.lock +7 -7
- data/README.md +39 -40
- data/Rakefile +17 -11
- data/features/step_definitions/troo_steps.rb +1 -1
- data/lib/troo.rb +24 -35
- data/lib/troo/api/client.rb +3 -0
- data/lib/troo/api/endpoints.rb +7 -1
- data/lib/troo/api/headers.rb +7 -0
- data/lib/troo/api/request.rb +9 -0
- data/lib/troo/api/response.rb +3 -0
- data/lib/troo/cli/add.rb +11 -0
- data/lib/troo/cli/commands/add.rb +9 -0
- data/lib/troo/cli/commands/default.rb +7 -0
- data/lib/troo/cli/commands/move/card.rb +9 -0
- data/lib/troo/cli/commands/refresh.rb +7 -0
- data/lib/troo/cli/commands/refresh/all.rb +2 -0
- data/lib/troo/cli/commands/show.rb +7 -0
- data/lib/troo/cli/commands/show/show_boards.rb +2 -0
- data/lib/troo/cli/commands/show/show_comments.rb +5 -0
- data/lib/troo/cli/commands/status.rb +5 -0
- data/lib/troo/cli/default.rb +6 -0
- data/lib/troo/cli/main.rb +8 -0
- data/lib/troo/cli/refresh.rb +7 -0
- data/lib/troo/cli/show.rb +9 -0
- data/lib/troo/cli/thor_fixes.rb +4 -0
- data/lib/troo/configuration.rb +5 -30
- data/lib/troo/database.rb +7 -0
- data/lib/troo/debug.rb +3 -0
- data/lib/troo/decorators/member.rb +1 -0
- data/lib/troo/decorators/resource.rb +19 -0
- data/lib/troo/helpers/model_helpers.rb +13 -0
- data/lib/troo/helpers/remote_model_helpers.rb +9 -0
- data/lib/troo/launcher.rb +44 -0
- data/lib/troo/models/behaviours/set_default.rb +6 -0
- data/lib/troo/models/board.rb +9 -0
- data/lib/troo/models/card.rb +15 -0
- data/lib/troo/models/comment.rb +9 -0
- data/lib/troo/models/list.rb +9 -0
- data/lib/troo/models/member.rb +8 -0
- data/lib/troo/models/refresh.rb +2 -0
- data/lib/troo/options.rb +9 -0
- data/lib/troo/persistence/local.rb +8 -0
- data/lib/troo/preference.rb +29 -0
- data/lib/troo/presentation/formatter.rb +12 -0
- data/lib/troo/presentation/sentence.rb +7 -0
- data/lib/troo/presentation/template.rb +7 -0
- data/lib/troo/presenters/board.rb +8 -0
- data/lib/troo/presenters/card.rb +4 -0
- data/lib/troo/presenters/comment.rb +4 -0
- data/lib/troo/presenters/list.rb +5 -0
- data/lib/troo/presenters/member.rb +4 -0
- data/lib/troo/presenters/resource.rb +7 -0
- data/lib/troo/remote/board.rb +6 -0
- data/lib/troo/remote/card.rb +7 -0
- data/lib/troo/remote/comment.rb +10 -0
- data/lib/troo/remote/list.rb +6 -0
- data/lib/troo/remote/member.rb +6 -0
- data/lib/troo/remote/persistence/board.rb +7 -0
- data/lib/troo/remote/persistence/card.rb +9 -0
- data/lib/troo/remote/persistence/comment.rb +7 -0
- data/lib/troo/remote/persistence/list.rb +7 -0
- data/lib/troo/remote/persistence/move_card.rb +9 -0
- data/lib/troo/retrieval/local.rb +16 -0
- data/lib/troo/retrieval/remote.rb +9 -0
- data/lib/troo/troo.rb +4 -0
- data/lib/troo/version.rb +1 -1
- data/test/lib/troo/api/client_test.rb +4 -4
- data/test/lib/troo/api/response_test.rb +27 -0
- data/test/lib/troo/cli/commands/refresh/all_test.rb +2 -2
- data/test/lib/troo/cli/commands/refresh_test.rb +2 -2
- data/test/lib/troo/configuration_test.rb +1 -1
- data/test/lib/troo/database_test.rb +7 -0
- data/test/lib/troo/decorators/resource_test.rb +5 -3
- data/test/lib/troo/launcher_test.rb +7 -0
- data/test/lib/troo/models/card_test.rb +5 -5
- data/test/lib/troo/options_test.rb +7 -0
- data/test/lib/troo/preference_test.rb +21 -0
- data/test/lib/troo/presentation/formatter_test.rb +8 -8
- data/test/lib/troo/presenters/member_test.rb +33 -3
- data/test/lib/troo/presenters/resource_test.rb +2 -2
- data/test/lib/troo/remote/board_test.rb +2 -2
- data/test/lib/troo/remote/card_test.rb +2 -2
- data/test/lib/troo/remote/comment_test.rb +2 -2
- data/test/lib/troo/remote/list_test.rb +2 -2
- data/test/lib/troo/remote/member_test.rb +2 -2
- data/test/lib/troo/remote/persistence/card_test.rb +2 -2
- data/test/lib/troo/remote/persistence/comment_test.rb +2 -2
- data/test/lib/troo/remote/persistence/list_test.rb +2 -2
- data/test/lib/troo_test.rb +5 -0
- data/test/support/remotes/board.json +140 -0
- data/test/test_helper.rb +1 -1
- data/troo.gemspec +2 -1
- metadata +34 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e68baa9983b5fa453d4feceb5542febfa90bb445
|
4
|
+
data.tar.gz: 3b3a8343f7f8b1d80ac3ee811faa29fdaefde523
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58654c3f6350bd6e016a44b94191263577cb655835882926896c553c7b8c10e79eb8b387130b71b7ced574533a0a8f9dfc47b9158263616836a67b2f5f3c8f9f
|
7
|
+
data.tar.gz: f3d8a493bba1fcc134496dd3f437b7ba613ba978802cd45fd74786d46adedfdaae4e1ea579148eaec983b20a8864ecc42485c32016db149e07bc40b224951259
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
troo (0.0.
|
4
|
+
troo (0.0.11)
|
5
5
|
addressable
|
6
|
-
curses (= 1.0.
|
6
|
+
curses (= 1.0.1)
|
7
7
|
dispel
|
8
8
|
json
|
9
9
|
oauth
|
@@ -26,7 +26,6 @@ GEM
|
|
26
26
|
cucumber (>= 1.1.1)
|
27
27
|
rspec-expectations (>= 2.7.0)
|
28
28
|
ast (1.1.0)
|
29
|
-
atomic (1.1.16)
|
30
29
|
axiom-types (0.1.1)
|
31
30
|
descendants_tracker (~> 0.0.4)
|
32
31
|
ice_nine (~> 0.11.0)
|
@@ -50,7 +49,7 @@ GEM
|
|
50
49
|
gherkin (~> 2.12)
|
51
50
|
multi_json (>= 1.7.5, < 2.0)
|
52
51
|
multi_test (>= 0.1.1)
|
53
|
-
curses (1.0.
|
52
|
+
curses (1.0.1)
|
54
53
|
descendants_tracker (0.0.4)
|
55
54
|
thread_safe (~> 0.3, >= 0.3.1)
|
56
55
|
diff-lcs (1.2.5)
|
@@ -147,11 +146,10 @@ GEM
|
|
147
146
|
term-ansicolor (1.3.0)
|
148
147
|
tins (~> 1.0)
|
149
148
|
thor (0.18.1)
|
150
|
-
thread_safe (0.3.
|
151
|
-
atomic (>= 1.1.7, < 2)
|
149
|
+
thread_safe (0.3.3)
|
152
150
|
tilt (1.4.1)
|
153
151
|
timers (1.1.0)
|
154
|
-
tins (1.0
|
152
|
+
tins (1.1.0)
|
155
153
|
vcr (2.9.0)
|
156
154
|
virtus (1.0.2)
|
157
155
|
axiom-types (~> 0.1)
|
@@ -162,6 +160,7 @@ GEM
|
|
162
160
|
addressable (>= 2.2.7)
|
163
161
|
crack (>= 0.3.2)
|
164
162
|
yajl-ruby (1.2.0)
|
163
|
+
yard (0.8.7.4)
|
165
164
|
|
166
165
|
PLATFORMS
|
167
166
|
ruby
|
@@ -184,3 +183,4 @@ DEPENDENCIES
|
|
184
183
|
troo!
|
185
184
|
vcr
|
186
185
|
webmock
|
186
|
+
yard
|
data/README.md
CHANGED
@@ -4,6 +4,45 @@
|
|
4
4
|
|
5
5
|
CLI interface for Trello. Named after Trello's mascot 'Roo'.
|
6
6
|
|
7
|
+
## Requirements
|
8
|
+
|
9
|
+
- A Trello account with API key/secret.
|
10
|
+
- MacOSX/Linux (I've not tested with Windows, sorry.)
|
11
|
+
- Ruby 2.1.1 (>= 1.9.3 should be fine, developed mainly in 2.1.0 so far.)
|
12
|
+
- Redis.
|
13
|
+
|
14
|
+
## Installation
|
15
|
+
|
16
|
+
Add this line to your application's Gemfile:
|
17
|
+
|
18
|
+
gem 'troo'
|
19
|
+
|
20
|
+
And then execute:
|
21
|
+
|
22
|
+
$ bundle
|
23
|
+
|
24
|
+
Or install it yourself as:
|
25
|
+
|
26
|
+
$ gem install troo
|
27
|
+
|
28
|
+
## Usage
|
29
|
+
|
30
|
+
You will need user authentication tokens to access your Trello account.
|
31
|
+
|
32
|
+
1) Sign in to Trello in the normal way.
|
33
|
+
|
34
|
+
2) Create your developer key at Trello:
|
35
|
+
|
36
|
+
https://trello.com/1/appKey/generate
|
37
|
+
|
38
|
+
3) Go to:
|
39
|
+
|
40
|
+
https://trello.com/1/connect?key=your_key_here&name=troo&response_type=token&scope=read,write
|
41
|
+
|
42
|
+
4) Add your authentication tokens to the configuration file `.trooconf` in your home directory. (This file will be created for you the first time you run `troo init`)
|
43
|
+
|
44
|
+
5) Have fun, and tweet me @gavinlaking if you like it.
|
45
|
+
|
7
46
|
## Commands
|
8
47
|
|
9
48
|
- Add board, list, card or comment.
|
@@ -50,46 +89,6 @@ CLI interface for Trello. Named after Trello's mascot 'Roo'.
|
|
50
89
|
|
51
90
|
troo version
|
52
91
|
|
53
|
-
|
54
|
-
## Requirements
|
55
|
-
|
56
|
-
- A Trello account with API key/secret.
|
57
|
-
- MacOSX/Linux (I've not tested with Windows, sorry.)
|
58
|
-
- Ruby 2.1.1 (>= 1.9.3 should be fine, developed mainly in 2.1.0 so far.)
|
59
|
-
- Redis.
|
60
|
-
|
61
|
-
## Installation
|
62
|
-
|
63
|
-
Add this line to your application's Gemfile:
|
64
|
-
|
65
|
-
gem 'troo'
|
66
|
-
|
67
|
-
And then execute:
|
68
|
-
|
69
|
-
$ bundle
|
70
|
-
|
71
|
-
Or install it yourself as:
|
72
|
-
|
73
|
-
$ gem install troo
|
74
|
-
|
75
|
-
## Usage
|
76
|
-
|
77
|
-
You will need user authentication tokens to access your Trello account.
|
78
|
-
|
79
|
-
1) Sign in to Trello in the normal way.
|
80
|
-
|
81
|
-
2) Create your developer key at Trello:
|
82
|
-
|
83
|
-
https://trello.com/1/appKey/generate
|
84
|
-
|
85
|
-
3) Go to:
|
86
|
-
|
87
|
-
https://trello.com/1/connect?key=your_key_here&name=troo&response_type=token&scope=read,write
|
88
|
-
|
89
|
-
4) Add your authentication tokens to the configuration file `.trooconf` in your home directory. (This file will be created for you the first time you run `troo init`)
|
90
|
-
|
91
|
-
5) Have fun, and tweet me @gavinlaking if you like it.
|
92
|
-
|
93
92
|
## Todo
|
94
93
|
|
95
94
|
- Fix multitude of sins.
|
data/Rakefile
CHANGED
@@ -3,17 +3,23 @@ require "rake/testtask"
|
|
3
3
|
require 'cucumber'
|
4
4
|
require 'cucumber/rake/task'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
if File.exist?(Dir.home + '/.trooconf')
|
7
|
+
Cucumber::Rake::Task.new(:cucumber) do |t|
|
8
|
+
t.cucumber_opts = "features --format progress"
|
9
|
+
end
|
9
10
|
|
10
|
-
Rake::TestTask.new do |t|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
11
|
+
Rake::TestTask.new do |t|
|
12
|
+
t.libs << 'lib/troo'
|
13
|
+
t.test_files = FileList["test/lib/troo/*_test.rb",
|
14
|
+
"test/lib/troo/**/*_test.rb"]
|
15
|
+
t.verbose = false
|
16
|
+
end
|
16
17
|
|
17
|
-
task :default => :test
|
18
|
+
task :default => :test
|
18
19
|
|
19
|
-
Rake::Task['cucumber'].execute
|
20
|
+
Rake::Task['cucumber'].execute
|
21
|
+
else
|
22
|
+
warn "\nConfiguration cannot be found, please run 'troo " \
|
23
|
+
"init' or './bin/troo init' first.\n"
|
24
|
+
exit(1)
|
25
|
+
end
|
data/lib/troo.rb
CHANGED
@@ -8,58 +8,47 @@ module Troo
|
|
8
8
|
InvalidAccessToken = Class.new(StandardError)
|
9
9
|
EndpointNotFound = Class.new(StandardError)
|
10
10
|
|
11
|
-
|
11
|
+
# @param []
|
12
|
+
# @param [String]
|
13
|
+
# @return []
|
14
|
+
def self.configuration(file = Dir.home + '/.trooconf', env = 'default')
|
15
|
+
unless File.exist?(file)
|
16
|
+
warn "\nConfiguration cannot be found, please run 'troo " \
|
17
|
+
"init' or './bin/troo init' first.\n"
|
18
|
+
file = configuration_path + '/trooconf.yml'
|
19
|
+
end
|
20
|
+
|
12
21
|
@configuration ||= Troo::Configuration.load(file, env)
|
13
22
|
end
|
14
23
|
|
15
|
-
|
24
|
+
# @param [String]
|
25
|
+
# @return []
|
26
|
+
def self.endpoints(version = 'version_1')
|
16
27
|
@endpoints ||= Troo::API::Endpoints
|
17
|
-
.load(
|
28
|
+
.load(configuration_path + '/trello_api.yml', version)
|
18
29
|
end
|
19
|
-
endpoints
|
20
30
|
|
31
|
+
# @return []
|
21
32
|
def self.logger
|
22
33
|
@logger ||= Logger
|
23
|
-
.new(
|
34
|
+
.new(log_path + '/troo.log').tap do |log|
|
24
35
|
log.formatter = proc do |mode, time, prog, msg|
|
25
|
-
"#{time.iso8601} #{mode}:\n#{msg}\n
|
36
|
+
"#{time.iso8601} #{mode}:\n#{msg}\n"
|
26
37
|
end
|
27
38
|
end
|
28
39
|
end
|
29
40
|
|
30
|
-
# RestClient.log =
|
41
|
+
# RestClient.log = log_dir + '/restclient.log'
|
31
42
|
|
32
43
|
Database.connect(configuration)
|
33
44
|
|
34
|
-
|
35
|
-
def initialize(argv, stdin = STDIN,
|
36
|
-
stdout = STDOUT,
|
37
|
-
stderr = STDERR,
|
38
|
-
kernel = Kernel)
|
39
|
-
@argv = argv
|
40
|
-
@stdin = stdin
|
41
|
-
@stdout = stdout
|
42
|
-
@stderr = stderr
|
43
|
-
@kernel = kernel
|
44
|
-
end
|
45
|
+
private
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
@kernel.exit(0)
|
50
|
-
rescue Redis::CannotConnectError
|
51
|
-
pad { puts 'Cannot connect to Redis database.' }
|
52
|
-
@kernel.exit(1)
|
53
|
-
ensure
|
54
|
-
$stdin, $stdout, $stderr = STDIN, STDOUT, STDERR
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
47
|
+
def self.configuration_path
|
48
|
+
File.dirname(__FILE__) + '/../config'
|
49
|
+
end
|
58
50
|
|
59
|
-
|
60
|
-
|
61
|
-
yield
|
62
|
-
puts
|
63
|
-
end
|
51
|
+
def self.log_path
|
52
|
+
File.dirname(__FILE__) + '/../logs'
|
64
53
|
end
|
65
54
|
end
|
data/lib/troo/api/client.rb
CHANGED
@@ -10,11 +10,14 @@ module Troo
|
|
10
10
|
attribute :model
|
11
11
|
|
12
12
|
class << self
|
13
|
+
# @param [Hash]
|
14
|
+
# @return [Array]
|
13
15
|
def perform(parameters)
|
14
16
|
new(parameters).perform
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
20
|
+
# @return [Array]
|
18
21
|
def perform
|
19
22
|
return [] unless allow_remote?
|
20
23
|
return [] if missing_parameters?
|
data/lib/troo/api/endpoints.rb
CHANGED
@@ -25,11 +25,17 @@ module Troo
|
|
25
25
|
end
|
26
26
|
|
27
27
|
class << self
|
28
|
+
# @param [String]
|
29
|
+
# @param [String]
|
30
|
+
# @return [Troo::API::Endpoints]
|
28
31
|
def load(file, version)
|
29
|
-
new(YAML.load_file(file)[version
|
32
|
+
new(YAML.load_file(file)[version])
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
36
|
+
# @param [Symbol]
|
37
|
+
# @param [Hash]
|
38
|
+
# @return [String, EndpointNotFound]
|
33
39
|
def interpolate!(endpoint, value = {})
|
34
40
|
return send(endpoint) % value if respond_to?(endpoint)
|
35
41
|
fail EndpointNotFound
|
data/lib/troo/api/headers.rb
CHANGED
@@ -2,15 +2,22 @@ module Troo
|
|
2
2
|
module API
|
3
3
|
class Headers
|
4
4
|
class << self
|
5
|
+
# @param [String]
|
6
|
+
# @param [Hash]
|
7
|
+
# @return [Hash]
|
5
8
|
def build!(uri, headers = {})
|
6
9
|
new(uri, headers).build!
|
7
10
|
end
|
8
11
|
end
|
9
12
|
|
13
|
+
# @param [String]
|
14
|
+
# @param [Hash]
|
15
|
+
# @return [Troo::API::Headers]
|
10
16
|
def initialize(uri, headers = {})
|
11
17
|
@uri, @headers = uri, headers
|
12
18
|
end
|
13
19
|
|
20
|
+
# @return [Hash]
|
14
21
|
def build!
|
15
22
|
defaults.merge!(@headers)
|
16
23
|
end
|
data/lib/troo/api/request.rb
CHANGED
@@ -2,15 +2,24 @@ module Troo
|
|
2
2
|
module API
|
3
3
|
class Request
|
4
4
|
class << self
|
5
|
+
# @param [Symbol]
|
6
|
+
# @param [String]
|
7
|
+
# @param [Hash]
|
8
|
+
# @return [Response, ErrorResponse]
|
5
9
|
def make(verb, uri, query = {})
|
6
10
|
new(verb, uri, query).make
|
7
11
|
end
|
8
12
|
end
|
9
13
|
|
14
|
+
# @param [Symbol]
|
15
|
+
# @param [String]
|
16
|
+
# @param [Hash]
|
17
|
+
# @return [Troo::API::Request]
|
10
18
|
def initialize(verb, uri, query = {})
|
11
19
|
@verb, @uri, @query = verb, uri, query
|
12
20
|
end
|
13
21
|
|
22
|
+
# @return [Response, ErrorResponse]
|
14
23
|
def make
|
15
24
|
@request ||= request
|
16
25
|
rescue RestClient::Exception => e
|
data/lib/troo/api/response.rb
CHANGED
@@ -9,11 +9,14 @@ module Troo
|
|
9
9
|
end
|
10
10
|
|
11
11
|
class << self
|
12
|
+
# @param [Hash]
|
13
|
+
# @return [Response, ErrorResponse]
|
12
14
|
def build(response)
|
13
15
|
new(response).build
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
19
|
+
# @return [Response, ErrorResponse]
|
17
20
|
def build
|
18
21
|
ok? ? Response.new(attributes) : ErrorResponse.new(attributes)
|
19
22
|
end
|
data/lib/troo/cli/add.rb
CHANGED
@@ -3,6 +3,8 @@ module Troo
|
|
3
3
|
class Add < ThorFixes
|
4
4
|
package_name 'add'
|
5
5
|
|
6
|
+
# @param [String]
|
7
|
+
# @return [String]
|
6
8
|
desc 'board (<name>)',
|
7
9
|
'Add a new board with <name>; prompts if <name> not ' \
|
8
10
|
'provided.'
|
@@ -11,6 +13,9 @@ module Troo
|
|
11
13
|
say Commands::Add.dispatch(value, nil, type: :board)
|
12
14
|
end
|
13
15
|
|
16
|
+
# @param [String]
|
17
|
+
# @param [String]
|
18
|
+
# @return [String]
|
14
19
|
desc 'card <list_id> (<name>)',
|
15
20
|
'Add a new card to the list with <list_id> with <name>; ' \
|
16
21
|
'prompts if <name> not provided.'
|
@@ -19,6 +24,9 @@ module Troo
|
|
19
24
|
say Commands::Add.dispatch(value, id, type: :card)
|
20
25
|
end
|
21
26
|
|
27
|
+
# @param [String]
|
28
|
+
# @param [String]
|
29
|
+
# @return [String]
|
22
30
|
desc 'comment <card_id> (<comment>)',
|
23
31
|
'Add a new comment to the card with <card_id> with ' \
|
24
32
|
'<comment>; prompts if <comment> not provided.'
|
@@ -27,6 +35,9 @@ module Troo
|
|
27
35
|
say Commands::Add.dispatch(value, id, type: :comment)
|
28
36
|
end
|
29
37
|
|
38
|
+
# @param [String]
|
39
|
+
# @param [String]
|
40
|
+
# @return [String]
|
30
41
|
desc 'list <board_id> (<name>)',
|
31
42
|
'Add a new list to the board with <board_id> with ' \
|
32
43
|
'<name>; prompts if <name> not provided.'
|
@@ -4,15 +4,24 @@ module Troo
|
|
4
4
|
attr_reader :id, :value
|
5
5
|
|
6
6
|
class << self
|
7
|
+
# @param []
|
8
|
+
# @param []
|
9
|
+
# @param [Hash]
|
10
|
+
# @return []
|
7
11
|
def dispatch(value, id = nil, options = {})
|
8
12
|
new(value, id, options).add
|
9
13
|
end
|
10
14
|
end
|
11
15
|
|
16
|
+
# @param []
|
17
|
+
# @param []
|
18
|
+
# @param [Hash]
|
19
|
+
# @return []
|
12
20
|
def initialize(value, id = nil, options = {})
|
13
21
|
@value, @id, @options = value, id, options
|
14
22
|
end
|
15
23
|
|
24
|
+
# @return []
|
16
25
|
def add
|
17
26
|
return success if create
|
18
27
|
error
|