troo 0.0.1 → 0.0.2
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 +7 -0
- data/.ruby-version +1 -0
- data/Gemfile +0 -1
- data/Guardfile +6 -0
- data/LICENSE.txt +1 -0
- data/README.md +46 -3
- data/Rakefile +11 -0
- data/bin/troo +12 -0
- data/configuration.yml.example +7 -0
- data/features/add_board.feature +1 -0
- data/features/add_card.feature +1 -0
- data/features/add_comment.feature +1 -0
- data/features/add_list.feature +1 -0
- data/features/cleanup.feature +0 -0
- data/features/move_card_to_list.feature +1 -0
- data/features/refresh.feature +1 -0
- data/features/set_default.feature +7 -0
- data/features/show_board.feature +1 -0
- data/features/show_boards.feature +1 -0
- data/features/show_card.feature +1 -0
- data/features/show_comments.feature +1 -0
- data/features/show_list.feature +1 -0
- data/features/status.feature +1 -0
- data/features/step_definitions/troo_steps.rb +0 -0
- data/features/support/env.rb +31 -0
- data/features/troo.feature +1 -0
- data/features/version.feature +8 -0
- data/lib/troo.rb +24 -2
- data/lib/troo/actions/create_board.rb +43 -0
- data/lib/troo/actions/create_card.rb +43 -0
- data/lib/troo/actions/create_comment.rb +44 -0
- data/lib/troo/actions/create_list.rb +41 -0
- data/lib/troo/actions/move_card.rb +36 -0
- data/lib/troo/actions/refresh_all.rb +79 -0
- data/lib/troo/actions/set_default.rb +35 -0
- data/lib/troo/cli/add_cli.rb +83 -0
- data/lib/troo/cli/default_cli.rb +37 -0
- data/lib/troo/cli/main_cli.rb +130 -0
- data/lib/troo/cli/show_cli.rb +83 -0
- data/lib/troo/cli/thor_fixes.rb +9 -0
- data/lib/troo/display/board_decorator.rb +58 -0
- data/lib/troo/display/board_presenter.rb +65 -0
- data/lib/troo/display/card_decorator.rb +105 -0
- data/lib/troo/display/card_presenter.rb +27 -0
- data/lib/troo/display/comment_decorator.rb +32 -0
- data/lib/troo/display/comment_presenter.rb +35 -0
- data/lib/troo/display/decorator_helpers.rb +76 -0
- data/lib/troo/display/list_decorator.rb +53 -0
- data/lib/troo/display/list_presenter.rb +43 -0
- data/lib/troo/display/member_decorator.rb +24 -0
- data/lib/troo/display/member_presenter.rb +59 -0
- data/lib/troo/external/board.rb +49 -0
- data/lib/troo/external/board_adaptor.rb +43 -0
- data/lib/troo/external/card.rb +70 -0
- data/lib/troo/external/card_adaptor.rb +78 -0
- data/lib/troo/external/comment.rb +64 -0
- data/lib/troo/external/comment_adaptor.rb +53 -0
- data/lib/troo/external/list.rb +58 -0
- data/lib/troo/external/list_adaptor.rb +48 -0
- data/lib/troo/external/member.rb +52 -0
- data/lib/troo/external/member_adaptor.rb +63 -0
- data/lib/troo/models/board.rb +26 -0
- data/lib/troo/models/board_persistence.rb +53 -0
- data/lib/troo/models/board_retrieval.rb +45 -0
- data/lib/troo/models/card.rb +54 -0
- data/lib/troo/models/card_persistence.rb +53 -0
- data/lib/troo/models/card_retrieval.rb +49 -0
- data/lib/troo/models/comment.rb +32 -0
- data/lib/troo/models/comment_persistence.rb +53 -0
- data/lib/troo/models/comment_retrieval.rb +32 -0
- data/lib/troo/models/list.rb +27 -0
- data/lib/troo/models/list_persistence.rb +53 -0
- data/lib/troo/models/list_retrieval.rb +45 -0
- data/lib/troo/models/member.rb +18 -0
- data/lib/troo/models/member_persistence.rb +53 -0
- data/lib/troo/models/member_retrieval.rb +36 -0
- data/lib/troo/models/model_helpers.rb +32 -0
- data/lib/troo/models/refresh.rb +23 -0
- data/lib/troo/presentation/template.rb +31 -0
- data/lib/troo/troo.rb +69 -0
- data/lib/troo/version.rb +2 -1
- data/lib/troo/views/card.erb +17 -0
- data/lib/troo/views/comment.erb +3 -0
- data/logs/.gitkeep +0 -0
- data/test/cassettes/board_by_id.yml +59 -0
- data/test/cassettes/boards_all.yml +118 -0
- data/test/cassettes/card_by_card_id.yml +58 -0
- data/test/cassettes/cards_by_board_id.yml +117 -0
- data/test/cassettes/cards_by_list_id.yml +114 -0
- data/test/cassettes/comments_by_board_id.yml +122 -0
- data/test/cassettes/comments_by_card_id.yml +114 -0
- data/test/cassettes/comments_by_list_id.yml +109 -0
- data/test/cassettes/create_board.yml +62 -0
- data/test/cassettes/create_card.yml +63 -0
- data/test/cassettes/create_comment.yml +67 -0
- data/test/cassettes/create_list.yml +60 -0
- data/test/cassettes/list_by_list_id.yml +56 -0
- data/test/cassettes/lists_by_board_id.yml +118 -0
- data/test/cassettes/member_by_member_id.yml +60 -0
- data/test/cassettes/members_by_board_id.yml +109 -0
- data/test/cassettes/move_card.yml +61 -0
- data/test/lib/troo/actions/create_board_test.rb +47 -0
- data/test/lib/troo/actions/create_card_test.rb +54 -0
- data/test/lib/troo/actions/create_comment_test.rb +49 -0
- data/test/lib/troo/actions/create_list_test.rb +49 -0
- data/test/lib/troo/actions/move_card_test.rb +46 -0
- data/test/lib/troo/actions/refresh_all_test.rb +68 -0
- data/test/lib/troo/actions/set_default_test.rb +44 -0
- data/test/lib/troo/cli/add_cli_test.rb +216 -0
- data/test/lib/troo/cli/default_cli_test.rb +79 -0
- data/test/lib/troo/cli/main_cli_test.rb +232 -0
- data/test/lib/troo/cli/show_cli_test.rb +221 -0
- data/test/lib/troo/cli/thor_fixes_test.rb +21 -0
- data/test/lib/troo/display/board_decorator_test.rb +126 -0
- data/test/lib/troo/display/board_presenter_test.rb +77 -0
- data/test/lib/troo/display/card_decorator_test.rb +221 -0
- data/test/lib/troo/display/card_presenter_test.rb +38 -0
- data/test/lib/troo/display/comment_decorator_test.rb +65 -0
- data/test/lib/troo/display/comment_presenter_test.rb +47 -0
- data/test/lib/troo/display/decorator_helpers_test.rb +7 -0
- data/test/lib/troo/display/list_decorator_test.rb +98 -0
- data/test/lib/troo/display/list_presenter_test.rb +48 -0
- data/test/lib/troo/display/member_decorator_test.rb +42 -0
- data/test/lib/troo/display/member_presenter_test.rb +70 -0
- data/test/lib/troo/external/board_adaptor_test.rb +36 -0
- data/test/lib/troo/external/board_test.rb +69 -0
- data/test/lib/troo/external/card_adaptor_test.rb +50 -0
- data/test/lib/troo/external/card_test.rb +108 -0
- data/test/lib/troo/external/comment_adaptor_test.rb +41 -0
- data/test/lib/troo/external/comment_test.rb +88 -0
- data/test/lib/troo/external/list_adaptor_test.rb +38 -0
- data/test/lib/troo/external/list_test.rb +65 -0
- data/test/lib/troo/external/member_adaptor_test.rb +44 -0
- data/test/lib/troo/external/member_test.rb +65 -0
- data/test/lib/troo/models/board_persistence_test.rb +61 -0
- data/test/lib/troo/models/board_retrieval_test.rb +93 -0
- data/test/lib/troo/models/board_test.rb +50 -0
- data/test/lib/troo/models/card_persistence_test.rb +60 -0
- data/test/lib/troo/models/card_retrieval_test.rb +101 -0
- data/test/lib/troo/models/card_test.rb +102 -0
- data/test/lib/troo/models/comment_persistence_test.rb +65 -0
- data/test/lib/troo/models/comment_retrieval_test.rb +46 -0
- data/test/lib/troo/models/comment_test.rb +59 -0
- data/test/lib/troo/models/list_persistence_test.rb +60 -0
- data/test/lib/troo/models/list_retrieval_test.rb +93 -0
- data/test/lib/troo/models/list_test.rb +53 -0
- data/test/lib/troo/models/member_persistence_test.rb +59 -0
- data/test/lib/troo/models/member_retrieval_test.rb +58 -0
- data/test/lib/troo/models/member_test.rb +44 -0
- data/test/lib/troo/models/model_helpers_test.rb +103 -0
- data/test/lib/troo/models/refresh_test.rb +45 -0
- data/test/lib/troo/presentation/template_test.rb +40 -0
- data/test/support/fabrication.rb +56 -0
- data/test/support/template.erb +3 -0
- data/test/support/vcr_setup.rb +36 -0
- data/test/test_helper.rb +30 -0
- data/troo.gemspec +24 -5
- metadata +501 -23
@@ -0,0 +1,49 @@
|
|
1
|
+
module Troo
|
2
|
+
class CardRetrieval
|
3
|
+
class << self
|
4
|
+
def all
|
5
|
+
Troo::Card.all
|
6
|
+
end
|
7
|
+
|
8
|
+
def default
|
9
|
+
new.retrieve
|
10
|
+
end
|
11
|
+
|
12
|
+
def retrieve(id = nil)
|
13
|
+
new(id).retrieve
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(id = nil)
|
18
|
+
@id = id
|
19
|
+
end
|
20
|
+
|
21
|
+
def retrieve
|
22
|
+
return default unless id
|
23
|
+
by_short_id || by_id || by_external_id || remote
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
attr_reader :id
|
28
|
+
|
29
|
+
def default
|
30
|
+
Troo::Card.default
|
31
|
+
end
|
32
|
+
|
33
|
+
def by_id
|
34
|
+
Troo::Card[id]
|
35
|
+
end
|
36
|
+
|
37
|
+
def by_short_id
|
38
|
+
Troo::Card.first(short_id: id)
|
39
|
+
end
|
40
|
+
|
41
|
+
def by_external_id
|
42
|
+
Troo::Card.first(external_card_id: id)
|
43
|
+
end
|
44
|
+
|
45
|
+
def remote
|
46
|
+
External::Card.fetch(id, { mode: :card }).first
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Troo
|
2
|
+
class Comment < Ohm::Model
|
3
|
+
include Ohm::DataTypes
|
4
|
+
include ModelHelpers
|
5
|
+
|
6
|
+
attribute :text
|
7
|
+
attribute :date
|
8
|
+
attribute :external_board_id
|
9
|
+
attribute :external_card_id
|
10
|
+
attribute :external_comment_id
|
11
|
+
attribute :external_member_id
|
12
|
+
|
13
|
+
index :date
|
14
|
+
index :external_board_id
|
15
|
+
index :external_card_id
|
16
|
+
index :external_comment_id
|
17
|
+
index :external_member_id
|
18
|
+
|
19
|
+
def board
|
20
|
+
Troo::BoardRetrieval.retrieve(self.external_board_id)
|
21
|
+
end
|
22
|
+
|
23
|
+
def card
|
24
|
+
Troo::CardRetrieval.retrieve(self.external_card_id)
|
25
|
+
end
|
26
|
+
|
27
|
+
def member
|
28
|
+
Troo::MemberRetrieval.retrieve(self.external_member_id)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Troo
|
2
|
+
class CommentPersistence
|
3
|
+
class << self
|
4
|
+
def for(resource, options = {})
|
5
|
+
new(resource, options).persist
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(resource, options = {})
|
10
|
+
@resource = resource
|
11
|
+
@options = options
|
12
|
+
end
|
13
|
+
|
14
|
+
def persist
|
15
|
+
return local if local_identical?
|
16
|
+
return updated if local_exists?
|
17
|
+
return created
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
attr_reader :resource, :options
|
22
|
+
|
23
|
+
def created
|
24
|
+
Troo::Comment.create(remote)
|
25
|
+
end
|
26
|
+
|
27
|
+
def updated
|
28
|
+
local.update(remote) && local
|
29
|
+
end
|
30
|
+
|
31
|
+
def local_identical?
|
32
|
+
return false unless local_exists?
|
33
|
+
return false if local_data != remote
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
37
|
+
def local_data
|
38
|
+
local.external_attributes
|
39
|
+
end
|
40
|
+
|
41
|
+
def local_exists?
|
42
|
+
!!local
|
43
|
+
end
|
44
|
+
|
45
|
+
def local
|
46
|
+
@local ||= Troo::Comment.first(external_comment_id: resource.id)
|
47
|
+
end
|
48
|
+
|
49
|
+
def remote
|
50
|
+
@remote ||= Troo::External::CommentAdaptor.adapt(resource)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Troo
|
2
|
+
class CommentRetrieval
|
3
|
+
class << self
|
4
|
+
def all
|
5
|
+
Troo::Comment.all
|
6
|
+
end
|
7
|
+
|
8
|
+
def retrieve(id)
|
9
|
+
new(id).retrieve
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(id)
|
14
|
+
@id = id
|
15
|
+
end
|
16
|
+
|
17
|
+
def retrieve
|
18
|
+
by_id || by_external_id
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
attr_reader :id
|
23
|
+
|
24
|
+
def by_id
|
25
|
+
Troo::Comment[id]
|
26
|
+
end
|
27
|
+
|
28
|
+
def by_external_id
|
29
|
+
Troo::Comment.first(external_comment_id: id)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Troo
|
2
|
+
class List < Ohm::Model
|
3
|
+
include Ohm::DataTypes
|
4
|
+
include ModelHelpers
|
5
|
+
|
6
|
+
attribute :name
|
7
|
+
attribute :position, Type::Integer
|
8
|
+
attribute :default, Type::Boolean
|
9
|
+
attribute :closed, Type::Boolean
|
10
|
+
attribute :external_board_id
|
11
|
+
attribute :external_list_id
|
12
|
+
|
13
|
+
index :default
|
14
|
+
index :external_board_id
|
15
|
+
index :external_list_id
|
16
|
+
|
17
|
+
alias_method :default?, :default
|
18
|
+
|
19
|
+
def board
|
20
|
+
Troo::BoardRetrieval.retrieve(self.external_board_id)
|
21
|
+
end
|
22
|
+
|
23
|
+
def cards
|
24
|
+
Troo::Card.find(external_list_id: self.external_list_id)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Troo
|
2
|
+
class ListPersistence
|
3
|
+
class << self
|
4
|
+
def for(resource, options = {})
|
5
|
+
new(resource, options).persist
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(resource, options = {})
|
10
|
+
@resource = resource
|
11
|
+
@options = options
|
12
|
+
end
|
13
|
+
|
14
|
+
def persist
|
15
|
+
return local if local_identical?
|
16
|
+
return updated if local_exists?
|
17
|
+
return created
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
attr_reader :resource, :options
|
22
|
+
|
23
|
+
def created
|
24
|
+
Troo::List.create(remote)
|
25
|
+
end
|
26
|
+
|
27
|
+
def updated
|
28
|
+
local.update(remote) && local
|
29
|
+
end
|
30
|
+
|
31
|
+
def local_identical?
|
32
|
+
return false unless local_exists?
|
33
|
+
return false if local_data != remote
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
37
|
+
def local_data
|
38
|
+
local.external_attributes
|
39
|
+
end
|
40
|
+
|
41
|
+
def local_exists?
|
42
|
+
!!local
|
43
|
+
end
|
44
|
+
|
45
|
+
def local
|
46
|
+
@local ||= Troo::List.first(external_list_id: resource.id)
|
47
|
+
end
|
48
|
+
|
49
|
+
def remote
|
50
|
+
@remote ||= Troo::External::ListAdaptor.adapt(resource)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Troo
|
2
|
+
class ListRetrieval
|
3
|
+
class << self
|
4
|
+
def all
|
5
|
+
Troo::List.all
|
6
|
+
end
|
7
|
+
|
8
|
+
def default
|
9
|
+
new.retrieve
|
10
|
+
end
|
11
|
+
|
12
|
+
def retrieve(id = nil)
|
13
|
+
new(id).retrieve
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(id = nil)
|
18
|
+
@id = id
|
19
|
+
end
|
20
|
+
|
21
|
+
def retrieve
|
22
|
+
return default unless id
|
23
|
+
by_id || by_external_id || remote
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
attr_reader :id
|
28
|
+
|
29
|
+
def default
|
30
|
+
Troo::List.default
|
31
|
+
end
|
32
|
+
|
33
|
+
def by_id
|
34
|
+
Troo::List[id]
|
35
|
+
end
|
36
|
+
|
37
|
+
def by_external_id
|
38
|
+
Troo::List.first(external_list_id: id)
|
39
|
+
end
|
40
|
+
|
41
|
+
def remote
|
42
|
+
External::List.fetch(id, { mode: :list }).first
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Troo
|
2
|
+
class Member < Ohm::Model
|
3
|
+
include Ohm::DataTypes
|
4
|
+
include ModelHelpers
|
5
|
+
|
6
|
+
attribute :username
|
7
|
+
attribute :email
|
8
|
+
attribute :full_name
|
9
|
+
attribute :initials
|
10
|
+
attribute :avatar_id
|
11
|
+
attribute :bio
|
12
|
+
attribute :url
|
13
|
+
attribute :external_member_id
|
14
|
+
|
15
|
+
index :external_member_id
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Troo
|
2
|
+
class MemberPersistence
|
3
|
+
class << self
|
4
|
+
def for(resource, options = {})
|
5
|
+
new(resource, options).persist
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(resource, options = {})
|
10
|
+
@resource = resource
|
11
|
+
@options = options
|
12
|
+
end
|
13
|
+
|
14
|
+
def persist
|
15
|
+
return local if local_identical?
|
16
|
+
return updated if local_exists?
|
17
|
+
return created
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
attr_reader :resource, :options
|
22
|
+
|
23
|
+
def created
|
24
|
+
Troo::Member.create(remote)
|
25
|
+
end
|
26
|
+
|
27
|
+
def updated
|
28
|
+
local.update(remote) && local
|
29
|
+
end
|
30
|
+
|
31
|
+
def local_identical?
|
32
|
+
return false unless local_exists?
|
33
|
+
return false if local_data != remote
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
37
|
+
def local_data
|
38
|
+
local.external_attributes
|
39
|
+
end
|
40
|
+
|
41
|
+
def local_exists?
|
42
|
+
!!local
|
43
|
+
end
|
44
|
+
|
45
|
+
def local
|
46
|
+
@local ||= Troo::Member.first(external_member_id: resource.id)
|
47
|
+
end
|
48
|
+
|
49
|
+
def remote
|
50
|
+
@remote ||= Troo::External::MemberAdaptor.adapt(resource)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Troo
|
2
|
+
class MemberRetrieval
|
3
|
+
class << self
|
4
|
+
def all
|
5
|
+
Troo::Member.all
|
6
|
+
end
|
7
|
+
|
8
|
+
def retrieve(id)
|
9
|
+
new(id).retrieve
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(id)
|
14
|
+
@id = id
|
15
|
+
end
|
16
|
+
|
17
|
+
def retrieve
|
18
|
+
by_id || by_external_id || remote
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
attr_reader :id
|
23
|
+
|
24
|
+
def by_id
|
25
|
+
Troo::Member[id]
|
26
|
+
end
|
27
|
+
|
28
|
+
def by_external_id
|
29
|
+
Troo::Member.first(external_member_id: id)
|
30
|
+
end
|
31
|
+
|
32
|
+
def remote
|
33
|
+
External::Member.fetch(id, { mode: :member }).first
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Troo
|
2
|
+
module ModelHelpers
|
3
|
+
module ClassMethods
|
4
|
+
def first(criteria = {})
|
5
|
+
return all.first if criteria.nil? || criteria.empty?
|
6
|
+
find(criteria).first
|
7
|
+
end
|
8
|
+
|
9
|
+
def update(criteria = {})
|
10
|
+
return false if criteria.nil? || criteria.empty?
|
11
|
+
all.map { |record| record.update(criteria) }
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
def default
|
16
|
+
first(default: true)
|
17
|
+
end
|
18
|
+
|
19
|
+
def count
|
20
|
+
all.count
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.included(base)
|
25
|
+
base.extend(ClassMethods)
|
26
|
+
end
|
27
|
+
|
28
|
+
def external_attributes
|
29
|
+
self.attributes.delete_if { |k, _| k == :id || k == :default }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|