troo 0.0.10 → 0.0.11
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 +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
@@ -1,34 +1,47 @@
|
|
1
1
|
module Troo
|
2
2
|
module ModelHelpers
|
3
3
|
module ClassMethods
|
4
|
+
# @param [Hash]
|
5
|
+
# @return [Ohm::Model]
|
4
6
|
def first(criteria = {})
|
5
7
|
return all.first if criteria.nil? || criteria.empty?
|
6
8
|
find(criteria).first
|
7
9
|
end
|
8
10
|
|
11
|
+
# @param [Hash]
|
12
|
+
# @return [TrueClass]
|
9
13
|
def update(criteria = {})
|
10
14
|
return false if criteria.nil? || criteria.empty?
|
11
15
|
all.map { |record| record.update(criteria) }
|
12
16
|
true
|
13
17
|
end
|
14
18
|
|
19
|
+
# @return [Ohm::Model]
|
15
20
|
def default
|
16
21
|
first(default: true)
|
17
22
|
end
|
18
23
|
|
24
|
+
# @return [TrueClass, FalseClass]
|
19
25
|
def default?
|
20
26
|
!!(default)
|
21
27
|
end
|
22
28
|
|
29
|
+
# @param [Hash]
|
30
|
+
# @return [Integer]
|
23
31
|
def count(criteria = {})
|
24
32
|
return all.count if criteria.empty?
|
25
33
|
find(criteria).size
|
26
34
|
end
|
27
35
|
|
36
|
+
# @param [String]
|
37
|
+
# @return [Ohm::Model]
|
28
38
|
def by_external_id(id)
|
29
39
|
first(external_id: id)
|
30
40
|
end
|
31
41
|
|
42
|
+
# @param [String, NilClass]
|
43
|
+
# @param [Hash]
|
44
|
+
# @return [Ohm::Model]
|
32
45
|
def retrieve(id = nil, options = {})
|
33
46
|
Troo::Retrieval::Local.retrieve(self, id, options)
|
34
47
|
end
|
@@ -1,32 +1,40 @@
|
|
1
1
|
module Troo
|
2
2
|
module RemoteModelHelpers
|
3
3
|
module ClassMethods
|
4
|
+
# @param [Array]
|
5
|
+
# @return [Array]
|
4
6
|
def with_collection(resources = [])
|
5
7
|
resources.map { |resource| new(resource) }
|
6
8
|
end
|
7
9
|
|
10
|
+
# @return [Hash]
|
8
11
|
def all
|
9
12
|
{}
|
10
13
|
end
|
11
14
|
|
15
|
+
# @return [Hash]
|
12
16
|
def by_board_id
|
13
17
|
{}
|
14
18
|
end
|
15
19
|
|
20
|
+
# @return [Hash]
|
16
21
|
def by_list_id
|
17
22
|
{}
|
18
23
|
end
|
19
24
|
|
25
|
+
# @return [Hash]
|
20
26
|
def by_card_id
|
21
27
|
{}
|
22
28
|
end
|
23
29
|
|
30
|
+
# @return [Hash]
|
24
31
|
def by_member_id
|
25
32
|
{}
|
26
33
|
end
|
27
34
|
end
|
28
35
|
|
29
36
|
module InstanceMethods
|
37
|
+
# @return []
|
30
38
|
def preprocess
|
31
39
|
associations.map do |association|
|
32
40
|
associated(association).map { |record| record.preprocess }
|
@@ -35,6 +43,7 @@ module Troo
|
|
35
43
|
Persistence::Local.persist(self)
|
36
44
|
end
|
37
45
|
|
46
|
+
# @return [Ohm::Model]
|
38
47
|
def local
|
39
48
|
@local ||= local_model.by_external_id(id)
|
40
49
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Troo
|
2
|
+
class Launcher
|
3
|
+
# @param [Array]
|
4
|
+
# @param []
|
5
|
+
# @param []
|
6
|
+
# @param []
|
7
|
+
# @param []
|
8
|
+
# @return []
|
9
|
+
def initialize(argv, stdin = STDIN,
|
10
|
+
stdout = STDOUT,
|
11
|
+
stderr = STDERR,
|
12
|
+
kernel = Kernel)
|
13
|
+
@argv = argv
|
14
|
+
@stdin = stdin
|
15
|
+
@stdout = stdout
|
16
|
+
@stderr = stderr
|
17
|
+
@kernel = kernel
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return []
|
21
|
+
def execute!
|
22
|
+
$stdin, $stdout, $stderr = @stdin, @stdout, @stderr
|
23
|
+
pad { Troo::CLI::Main.start(@argv) }
|
24
|
+
@kernel.exit(0)
|
25
|
+
rescue Errno::ENOENT
|
26
|
+
pad { puts "Configuration cannot be found, please run 'troo init'" \
|
27
|
+
" first." }
|
28
|
+
@kernel.exit(1)
|
29
|
+
rescue Redis::CannotConnectError
|
30
|
+
pad { puts 'Cannot connect to Redis database.' }
|
31
|
+
@kernel.exit(1)
|
32
|
+
ensure
|
33
|
+
$stdin, $stdout, $stderr = STDIN, STDOUT, STDERR
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def pad
|
39
|
+
puts
|
40
|
+
yield
|
41
|
+
puts
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module Troo
|
2
2
|
module Behaviours
|
3
3
|
class NullEntity
|
4
|
+
# @return [FalseClass]
|
4
5
|
def default?
|
5
6
|
false
|
6
7
|
end
|
@@ -8,15 +9,20 @@ module Troo
|
|
8
9
|
|
9
10
|
class SetDefault
|
10
11
|
class << self
|
12
|
+
# @param []
|
13
|
+
# @return []
|
11
14
|
def for(entity)
|
12
15
|
new(entity).set_default!
|
13
16
|
end
|
14
17
|
end
|
15
18
|
|
19
|
+
# @param []
|
20
|
+
# @return []
|
16
21
|
def initialize(entity)
|
17
22
|
@entity = entity
|
18
23
|
end
|
19
24
|
|
25
|
+
# @return [TrueClass, ?]
|
20
26
|
def set_default!
|
21
27
|
return true if already_default?
|
22
28
|
unset_default
|
data/lib/troo/models/board.rb
CHANGED
@@ -17,31 +17,40 @@ module Troo
|
|
17
17
|
alias_method :default?, :default
|
18
18
|
|
19
19
|
class << self
|
20
|
+
# @return [Remote::Board]
|
20
21
|
def remote
|
21
22
|
Remote::Board
|
22
23
|
end
|
23
24
|
|
25
|
+
# @return [Symbol]
|
24
26
|
def type
|
25
27
|
:board
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
31
|
+
# @return [Ohm::Set]
|
29
32
|
def lists
|
30
33
|
Troo::List.find(external_board_id: external_id)
|
31
34
|
end
|
32
35
|
|
36
|
+
# @return [Ohm::Set]
|
33
37
|
def cards
|
34
38
|
Troo::Card.find(external_board_id: external_id)
|
35
39
|
end
|
36
40
|
|
41
|
+
# @param [Hash]
|
42
|
+
# @return []
|
37
43
|
def decorator(options = {})
|
38
44
|
Decorators::Resource.new(self, options)
|
39
45
|
end
|
40
46
|
|
47
|
+
# @param [Hash]
|
48
|
+
# @return [Troo::Presenters::Board]
|
41
49
|
def presenter(options = {})
|
42
50
|
Presenters::Board.new(self, options)
|
43
51
|
end
|
44
52
|
|
53
|
+
# @return [Symbol]
|
45
54
|
def type
|
46
55
|
self.class.type
|
47
56
|
end
|
data/lib/troo/models/card.rb
CHANGED
@@ -26,15 +26,18 @@ module Troo
|
|
26
26
|
alias_method :description, :desc
|
27
27
|
|
28
28
|
class << self
|
29
|
+
# @return [Remote::Card]
|
29
30
|
def remote
|
30
31
|
Remote::Card
|
31
32
|
end
|
32
33
|
|
34
|
+
# @return [Symbol]
|
33
35
|
def type
|
34
36
|
:card
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
40
|
+
# @return [Array, Array, String]
|
38
41
|
def external_member_ids
|
39
42
|
if @attributes[:external_member_ids].nil?
|
40
43
|
[]
|
@@ -45,22 +48,27 @@ module Troo
|
|
45
48
|
end
|
46
49
|
end
|
47
50
|
|
51
|
+
# @return []
|
48
52
|
def board
|
49
53
|
@board ||= Troo::Board.retrieve(external_board_id)
|
50
54
|
end
|
51
55
|
|
56
|
+
# @return []
|
52
57
|
def list
|
53
58
|
@list ||= Troo::List.retrieve(external_list_id)
|
54
59
|
end
|
55
60
|
|
61
|
+
# @return [Ohm::Set]
|
56
62
|
def comments
|
57
63
|
Troo::Comment.find(external_card_id: external_id)
|
58
64
|
end
|
59
65
|
|
66
|
+
# @return []
|
60
67
|
def recent_comments
|
61
68
|
comments.sort(by: :date, limit: [0, 3])
|
62
69
|
end
|
63
70
|
|
71
|
+
# @return []
|
64
72
|
def members
|
65
73
|
return [] if external_member_ids.empty?
|
66
74
|
@members ||= external_member_ids.map do |member_id|
|
@@ -68,18 +76,25 @@ module Troo
|
|
68
76
|
end.compact
|
69
77
|
end
|
70
78
|
|
79
|
+
# @param [Hash]
|
80
|
+
# @return []
|
71
81
|
def decorator(options = {})
|
72
82
|
Decorators::Resource.new(self, options)
|
73
83
|
end
|
74
84
|
|
85
|
+
# @param [Hash]
|
86
|
+
# @return [Troo::Presenters::Card]
|
75
87
|
def presenter(options = {})
|
76
88
|
Presenters::Card.new(self, options)
|
77
89
|
end
|
78
90
|
|
91
|
+
# @param [Hash]
|
92
|
+
# @return []
|
79
93
|
def comment_presenter(options = {})
|
80
94
|
Presenters::Comment.new(self, options)
|
81
95
|
end
|
82
96
|
|
97
|
+
# @return [Symbol]
|
83
98
|
def type
|
84
99
|
self.class.type
|
85
100
|
end
|
data/lib/troo/models/comment.rb
CHANGED
@@ -19,35 +19,44 @@ module Troo
|
|
19
19
|
index :short_id
|
20
20
|
|
21
21
|
class << self
|
22
|
+
# @return [Remote::Comment]
|
22
23
|
def remote
|
23
24
|
Remote::Comment
|
24
25
|
end
|
25
26
|
|
27
|
+
# @return [Symbol]
|
26
28
|
def type
|
27
29
|
:comments
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
33
|
+
# @return []
|
31
34
|
def board
|
32
35
|
Troo::Board.retrieve(external_board_id)
|
33
36
|
end
|
34
37
|
|
38
|
+
# @return []
|
35
39
|
def card
|
36
40
|
Troo::Card.retrieve(external_card_id)
|
37
41
|
end
|
38
42
|
|
43
|
+
# @return []
|
39
44
|
def member
|
40
45
|
Troo::Member.retrieve(external_member_id)
|
41
46
|
end
|
42
47
|
|
48
|
+
# @param [Hash]
|
49
|
+
# @return []
|
43
50
|
def decorator(options = {})
|
44
51
|
Decorators::Resource.new(self, options)
|
45
52
|
end
|
46
53
|
|
54
|
+
# @return [FalseClass]
|
47
55
|
def default?
|
48
56
|
false
|
49
57
|
end
|
50
58
|
|
59
|
+
# @return [Symbol]
|
51
60
|
def type
|
52
61
|
self.class.type
|
53
62
|
end
|
data/lib/troo/models/list.rb
CHANGED
@@ -19,31 +19,40 @@ module Troo
|
|
19
19
|
alias_method :default?, :default
|
20
20
|
|
21
21
|
class << self
|
22
|
+
# @return [Remote::List]
|
22
23
|
def remote
|
23
24
|
Remote::List
|
24
25
|
end
|
25
26
|
|
27
|
+
# @return [Symbol]
|
26
28
|
def type
|
27
29
|
:list
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
33
|
+
# @return []
|
31
34
|
def board
|
32
35
|
Troo::Board.retrieve(external_board_id)
|
33
36
|
end
|
34
37
|
|
38
|
+
# @return [Ohm::Set]
|
35
39
|
def cards
|
36
40
|
Troo::Card.find(external_list_id: external_id)
|
37
41
|
end
|
38
42
|
|
43
|
+
# @param [Hash]
|
44
|
+
# @return []
|
39
45
|
def decorator(options = {})
|
40
46
|
Decorators::Resource.new(self, options)
|
41
47
|
end
|
42
48
|
|
49
|
+
# @param [Hash]
|
50
|
+
# @return [Troo::Presenters::List]
|
43
51
|
def presenter(options = {})
|
44
52
|
Presenters::List.new(self, options)
|
45
53
|
end
|
46
54
|
|
55
|
+
# @return [Symbol]
|
47
56
|
def type
|
48
57
|
self.class.type
|
49
58
|
end
|
data/lib/troo/models/member.rb
CHANGED
@@ -17,27 +17,35 @@ module Troo
|
|
17
17
|
index :short_id
|
18
18
|
|
19
19
|
class << self
|
20
|
+
# @return []
|
20
21
|
def remote
|
21
22
|
Remote::Member
|
22
23
|
end
|
23
24
|
|
25
|
+
# @return [Symbol]
|
24
26
|
def type
|
25
27
|
:member
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
31
|
+
# @param [Hash]
|
32
|
+
# @return []
|
29
33
|
def decorator(options = {})
|
30
34
|
Decorators::Member.new(self, options)
|
31
35
|
end
|
32
36
|
|
37
|
+
# @param [Hash]
|
38
|
+
# @return []
|
33
39
|
def presenter(options = {})
|
34
40
|
Presenters::Member.new(decorator, options)
|
35
41
|
end
|
36
42
|
|
43
|
+
# @return [FalseClass]
|
37
44
|
def default?
|
38
45
|
false
|
39
46
|
end
|
40
47
|
|
48
|
+
# @return [Symbol]
|
41
49
|
def type
|
42
50
|
self.class.type
|
43
51
|
end
|
data/lib/troo/models/refresh.rb
CHANGED
@@ -8,11 +8,13 @@ module Troo
|
|
8
8
|
index :last_performed_at
|
9
9
|
|
10
10
|
class << self
|
11
|
+
# @return []
|
11
12
|
def completed!
|
12
13
|
all.map { |record| record.delete }
|
13
14
|
create(last_performed_at: Time.now.to_s)
|
14
15
|
end
|
15
16
|
|
17
|
+
# @return []
|
16
18
|
def last_performed_at
|
17
19
|
first ? first.last_performed_at : nil
|
18
20
|
end
|
data/lib/troo/options.rb
ADDED
@@ -2,25 +2,33 @@ module Troo
|
|
2
2
|
module Persistence
|
3
3
|
class Local
|
4
4
|
class << self
|
5
|
+
# @param [Array]
|
6
|
+
# @return [Array]
|
5
7
|
def with_collection(resources = [])
|
6
8
|
resources.map do |resource|
|
7
9
|
new(resource).preprocess
|
8
10
|
end
|
9
11
|
end
|
10
12
|
|
13
|
+
# @param []
|
14
|
+
# @return []
|
11
15
|
def persist(resource)
|
12
16
|
new(resource).persist
|
13
17
|
end
|
14
18
|
end
|
15
19
|
|
20
|
+
# @param []
|
21
|
+
# @return [Troo::Persistence::Local]
|
16
22
|
def initialize(resource)
|
17
23
|
@resource = resource
|
18
24
|
end
|
19
25
|
|
26
|
+
# @return []
|
20
27
|
def preprocess
|
21
28
|
resource.preprocess
|
22
29
|
end
|
23
30
|
|
31
|
+
# @return []
|
24
32
|
def persist
|
25
33
|
set_default
|
26
34
|
delete
|