trellor 2.0.3 → 2.0.4
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/README.md +13 -1
- data/docs/trellor.png +0 -0
- data/docs/trellor.txt +92 -0
- data/docs/trellor_seq_diag.png +0 -0
- data/docs/trellor_seq_diag.txt +20 -0
- data/lib/cli.rb +26 -7
- data/lib/models.rb +25 -0
- data/lib/trellor.rb +62 -29
- data/lib/trellor/version.rb +1 -1
- data/lib/web_trellor.rb +50 -70
- data/lib/webapi.rb +34 -6
- data/trellor.gemspec +6 -0
- metadata +77 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb73b614f294042859a8e4e29f7cd048e51cde34
|
4
|
+
data.tar.gz: 09f5a4d543b4879a05c83b22f9ce080cce4b98b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56b997c347869890817f41e4b6f692d17ca787c32cb410a84bd0c1524fbcdac5153323b34037af76cd1caacc11f334d6210234b98e5435d426b8f1a247c70bc7
|
7
|
+
data.tar.gz: 7d99b990aff8f0cecc011c728fb4f845211c1b4e21f0436b24cb0e708ccd139c4fce95dddfa3a39a32fc225094f574fcf6e4dd5d35ce2bd6be348bd99972b74c
|
data/README.md
CHANGED
@@ -28,6 +28,7 @@ Three environment variables need to be set: TRELLOR_KEY, TRELLOR_TOKEN,
|
|
28
28
|
$ trellor to # prints all list names inside the first board with name
|
29
29
|
# beginning with 'to' (case insensitive)
|
30
30
|
# for example, this matches 'ToDo'
|
31
|
+
$ trellor 'to.*o' # regular expression search, would also print todo board.
|
31
32
|
$ trellor to in # prints all card names in the list named 'in*' in board
|
32
33
|
# named 'to*', e.g., matches 'ToDo.Inbox'
|
33
34
|
# create a card:
|
@@ -42,6 +43,9 @@ Starting with version 2, a webapp is run in the background. Making the connectio
|
|
42
43
|
Trello resulted in over half the time to run a command. The local webapp pays
|
43
44
|
this cost only once.
|
44
45
|
|
46
|
+
Version 3 will be faster by using Trello's recently released webhooks. Plans
|
47
|
+
also include allowing offline usage.
|
48
|
+
|
45
49
|
|
46
50
|
## Development
|
47
51
|
|
@@ -49,9 +53,17 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
49
53
|
|
50
54
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
51
55
|
|
56
|
+
## Design
|
57
|
+
|
58
|
+
### Class Diagram
|
59
|
+

|
60
|
+
|
61
|
+
### Sequence Diagram
|
62
|
+

|
63
|
+
|
52
64
|
## Contributing
|
53
65
|
|
54
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
66
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/brianmd/trellor.
|
55
67
|
|
56
68
|
|
57
69
|
## License
|
data/docs/trellor.png
ADDED
Binary file
|
data/docs/trellor.txt
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
@startuml
|
2
|
+
|
3
|
+
class Cli {
|
4
|
+
archive
|
5
|
+
verbose?
|
6
|
+
cache
|
7
|
+
webapi
|
8
|
+
slowtrellor
|
9
|
+
==
|
10
|
+
parse()
|
11
|
+
-- queries --
|
12
|
+
query_trellor()
|
13
|
+
-- private --
|
14
|
+
save_all()
|
15
|
+
get_all()
|
16
|
+
home()
|
17
|
+
filepath()
|
18
|
+
verbose_log()
|
19
|
+
}
|
20
|
+
|
21
|
+
class TrellorInterface {
|
22
|
+
verbose_log(*args)
|
23
|
+
-- queries --
|
24
|
+
board_names()
|
25
|
+
list_names(board_regex)
|
26
|
+
cart_names(board_regex,list_regex)
|
27
|
+
create_card(board,list,card,descript)
|
28
|
+
archive_card(board,list,card)
|
29
|
+
}
|
30
|
+
|
31
|
+
Cli *- TrellorInterface : trellor >
|
32
|
+
|
33
|
+
class Trellor {
|
34
|
+
self.singleton()
|
35
|
+
-- queries --
|
36
|
+
board_names()
|
37
|
+
list_names(board_regex)
|
38
|
+
cart_names(board_regex,list_regex)
|
39
|
+
create_card(board,list,card,descript)
|
40
|
+
archive_card(board,list,card)
|
41
|
+
-- private queries --
|
42
|
+
boards()
|
43
|
+
boards=(boards)
|
44
|
+
find_board(board_regex)
|
45
|
+
find_list(board_regex,list_regex)
|
46
|
+
cards(board_regex,list_regex)
|
47
|
+
find_card(board,list,card)
|
48
|
+
-- connecting --
|
49
|
+
client()
|
50
|
+
connect()
|
51
|
+
user()
|
52
|
+
}
|
53
|
+
|
54
|
+
class WebTrellor {
|
55
|
+
ensure_webapp_is_running()
|
56
|
+
run_webapp()
|
57
|
+
-- queries --
|
58
|
+
board_names()
|
59
|
+
list_names(board_regex)
|
60
|
+
cart_names(board_regex,list_regex)
|
61
|
+
create_card(board,list,card,descript)
|
62
|
+
archive_card(board,list,card)
|
63
|
+
-- private --
|
64
|
+
get_http(url,data,timeout,show_error?)
|
65
|
+
post_http(url,data,timeout,show_error?)
|
66
|
+
default_open_timeout()
|
67
|
+
default_read_timeout()
|
68
|
+
site()
|
69
|
+
port()
|
70
|
+
}
|
71
|
+
|
72
|
+
TrellorInterface <|-- Trellor
|
73
|
+
TrellorInterface <|-- WebTrellor
|
74
|
+
|
75
|
+
|
76
|
+
class Sinatra::Base
|
77
|
+
|
78
|
+
class TrellorWebapi {
|
79
|
+
-- GETs --
|
80
|
+
/version
|
81
|
+
/boards
|
82
|
+
-- POSTs --
|
83
|
+
/boards
|
84
|
+
-- error handling --
|
85
|
+
not_found()
|
86
|
+
error()
|
87
|
+
}
|
88
|
+
|
89
|
+
Sinatra::Base <|-- TrellorWebapi
|
90
|
+
|
91
|
+
@enduml
|
92
|
+
|
Binary file
|
@@ -0,0 +1,20 @@
|
|
1
|
+
@startuml
|
2
|
+
|
3
|
+
actor User
|
4
|
+
|
5
|
+
User -> Cli : board_regex
|
6
|
+
Cli -> WebTrellor : board_names\n (board_regex)
|
7
|
+
WebTrellor -> TrellorWebapi : get_http(/boards)\n {board_name:\n board_regex}
|
8
|
+
|||
|
9
|
+
TrellorWebapi -> Trellor : board_names\n (board_regex)
|
10
|
+
|||
|
11
|
+
|
12
|
+
== OR, with -s(low) flag, goes directly to trellor class ==
|
13
|
+
|
14
|
+
User -> Cli : board_regex
|
15
|
+
Cli -> Trellor : board_names\n (board_regex)
|
16
|
+
|||
|
17
|
+
note over TrellorWebapi: Runs sinatra \non localhost
|
18
|
+
|
19
|
+
@enduml
|
20
|
+
|
data/lib/cli.rb
CHANGED
@@ -14,11 +14,13 @@ module Trellor
|
|
14
14
|
opt :slowtrellor, 'Make own connection rather than using webapi', short: '-s'
|
15
15
|
end
|
16
16
|
|
17
|
+
logger # sets the logger's progname
|
18
|
+
|
17
19
|
if webapi?
|
18
20
|
require_relative 'web_trellor'
|
19
21
|
web = WebTrellor.new
|
20
|
-
web.be_verbose = true if
|
21
|
-
web.ensure_webapp_is_running
|
22
|
+
# web.be_verbose = true if verbose?
|
23
|
+
web.ensure_webapp_is_running(false)
|
22
24
|
exit 0
|
23
25
|
end
|
24
26
|
|
@@ -27,7 +29,7 @@ module Trellor
|
|
27
29
|
p hash
|
28
30
|
end
|
29
31
|
|
30
|
-
|
32
|
+
query_trellor(*ARGV)
|
31
33
|
end
|
32
34
|
|
33
35
|
private
|
@@ -42,14 +44,18 @@ module Trellor
|
|
42
44
|
verbose_log('using webapi')
|
43
45
|
require_relative 'web_trellor'
|
44
46
|
web = WebTrellor.new
|
45
|
-
web.be_verbose = true if
|
47
|
+
web.be_verbose = true if verbose?
|
46
48
|
web.ensure_webapp_is_running
|
47
49
|
web
|
48
50
|
end
|
49
|
-
@trellor.be_verbose = true if
|
51
|
+
@trellor.be_verbose = true if verbose?
|
50
52
|
end
|
51
53
|
@trellor
|
52
54
|
end
|
55
|
+
|
56
|
+
def self.verbose?
|
57
|
+
@opts[:verbose]
|
58
|
+
end
|
53
59
|
|
54
60
|
def self.homepath
|
55
61
|
Pathname.new(ENV['HOME'])
|
@@ -84,7 +90,7 @@ module Trellor
|
|
84
90
|
hash
|
85
91
|
end
|
86
92
|
|
87
|
-
def self.
|
93
|
+
def self.query_trellor(board_name=nil, list_name=nil, card_name=nil, descript=nil)
|
88
94
|
verbose_log "board_name", board_name
|
89
95
|
verbose_log "list_name", list_name
|
90
96
|
verbose_log "card_name", card_name
|
@@ -107,7 +113,20 @@ module Trellor
|
|
107
113
|
end
|
108
114
|
|
109
115
|
def self.verbose_log(*args)
|
110
|
-
|
116
|
+
logger.debug(" ****** #{args.inspect}")
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.logger
|
120
|
+
unless @logger
|
121
|
+
@logger = Trellor.logger
|
122
|
+
@logger.progname = '[cli]'
|
123
|
+
if verbose?
|
124
|
+
@logger.level = Logger::DEBUG
|
125
|
+
else
|
126
|
+
@logger.level = Logger::WARN
|
127
|
+
end
|
128
|
+
end
|
129
|
+
@logger
|
111
130
|
end
|
112
131
|
|
113
132
|
def self.webapi?
|
data/lib/models.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'virtus'
|
2
|
+
|
3
|
+
module Trellor
|
4
|
+
|
5
|
+
class Base
|
6
|
+
include Virtus.model
|
7
|
+
|
8
|
+
attribute :id, String
|
9
|
+
attribute :name, String
|
10
|
+
# children is an ordered colleciton
|
11
|
+
attribute :children, Array[Base]
|
12
|
+
end
|
13
|
+
|
14
|
+
class Board < Base
|
15
|
+
end
|
16
|
+
|
17
|
+
class List < Base
|
18
|
+
end
|
19
|
+
|
20
|
+
class Card < Base
|
21
|
+
attribute :description, String
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
data/lib/trellor.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# TODO: show card descriptions
|
2
2
|
|
3
|
+
require 'logger'
|
4
|
+
|
3
5
|
require_relative "trellor/version"
|
4
6
|
require 'trello'
|
5
7
|
|
@@ -15,40 +17,44 @@ module Trellor
|
|
15
17
|
@singleton
|
16
18
|
end
|
17
19
|
|
18
|
-
def
|
19
|
-
@
|
20
|
+
def self.logger
|
21
|
+
unless @logger
|
22
|
+
file = File.new(logger_filename.to_s, 'a')
|
23
|
+
# webapi wasn't logging to the file until it was killed.
|
24
|
+
# this causes the logger to flush immediately
|
25
|
+
file.sync = true
|
26
|
+
@logger = Logger.new file
|
27
|
+
end
|
28
|
+
@logger
|
20
29
|
end
|
21
30
|
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
)
|
31
|
+
def self.logger_filename
|
32
|
+
dirpath = Pathname.new(ENV['HOME']) + '.config/trellor'
|
33
|
+
dirpath.mkdir unless dirpath.directory?
|
34
|
+
filename = 'log'
|
35
|
+
dirpath + filename
|
28
36
|
end
|
29
37
|
|
30
|
-
def
|
31
|
-
|
38
|
+
def logger
|
39
|
+
self.class.logger
|
32
40
|
end
|
33
41
|
|
34
|
-
|
35
|
-
|
36
|
-
@user ||= client.find(:members, ENV['TRELLOR_USERNAME'])
|
37
|
-
end
|
42
|
+
|
43
|
+
############## trellor interface queries ###############
|
38
44
|
|
39
45
|
def board_names
|
40
46
|
boards.collect{ |board| board.name }.sort_by{|name| name.downcase}
|
41
47
|
end
|
42
48
|
def list_names(board_name)
|
43
|
-
|
49
|
+
find_board(board_name).lists.collect{ |list| list.name }.sort_by{|name| name.downcase}
|
44
50
|
end
|
45
51
|
def card_names(board_name, list_name)
|
46
|
-
|
52
|
+
find_list(board_name, list_name).cards.collect{ |card| card.name }
|
47
53
|
end
|
48
54
|
def create_card(board_name, list_name, name, descript=nil)
|
49
55
|
card = Trello::Card.new
|
50
56
|
card.client = client
|
51
|
-
card.list_id =
|
57
|
+
card.list_id = find_list(board_name, list_name).id
|
52
58
|
card.name = name
|
53
59
|
card.desc = descript if descript
|
54
60
|
card.save
|
@@ -59,8 +65,7 @@ module Trellor
|
|
59
65
|
end
|
60
66
|
|
61
67
|
|
62
|
-
|
63
|
-
|
68
|
+
################ private queries #################
|
64
69
|
|
65
70
|
def boards
|
66
71
|
verbose_log('getting boards') unless @boards
|
@@ -70,31 +75,59 @@ module Trellor
|
|
70
75
|
@boards = boards
|
71
76
|
end
|
72
77
|
|
73
|
-
def
|
78
|
+
def find_board(name)
|
74
79
|
boards # to get verbose log ordering correct
|
75
80
|
verbose_log('getting board', name)
|
76
81
|
name = Regexp.new(name, Regexp::IGNORECASE)
|
77
|
-
boards.
|
82
|
+
boards.find{ |board| name.match(board.name) }
|
78
83
|
end
|
79
84
|
|
80
|
-
def
|
81
|
-
this_board =
|
85
|
+
def find_list(board_name, list_name)
|
86
|
+
this_board = find_board(board_name)
|
82
87
|
verbose_log(' getting list', board_name, list_name)
|
83
88
|
name = Regexp.new(list_name, Regexp::IGNORECASE)
|
84
|
-
this_board.lists.
|
89
|
+
this_board.lists.find{ |list| name.match(list.name) }
|
85
90
|
end
|
86
91
|
|
87
92
|
def cards(board_name, list_name)
|
88
93
|
verbose_log(' getting cards for', board_name, list_name)
|
89
|
-
|
94
|
+
find_list(board_name, list_name).cards
|
90
95
|
end
|
91
96
|
|
92
97
|
def find_card(board_name, list_name, card_name)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
98
|
+
this_list = find_list(board_name, list_name)
|
99
|
+
verbose_log(' getting card', board_name, list_name, card_name)
|
100
|
+
name = Regexp.new(card_name, Regexp::IGNORECASE)
|
101
|
+
this_list.cards.find{ |card| name.match(card.name) }
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
|
107
|
+
############ connecting ###############
|
108
|
+
|
109
|
+
def client(key=ENV['TRELLOR_KEY'], token=ENV['TRELLOR_TOKEN'])
|
110
|
+
@client ||= connect(key, token)
|
111
|
+
end
|
112
|
+
|
113
|
+
def connect(key=ENV['TRELLOR_KEY'], token=ENV['TRELLOR_TOKEN'])
|
114
|
+
verbose_log("connecting with", key, token)
|
115
|
+
Trello::Client.new(
|
116
|
+
:developer_public_key => key,
|
117
|
+
:member_token => token
|
118
|
+
)
|
119
|
+
end
|
120
|
+
|
121
|
+
def verbose_log(*args)
|
122
|
+
logger.error(" ****** #{args.inspect}") if be_verbose
|
97
123
|
end
|
124
|
+
|
125
|
+
def user()
|
126
|
+
verbose_log('username', ENV['TRELLOR_USERNAME'])
|
127
|
+
@user ||= client.find(:members, ENV['TRELLOR_USERNAME'])
|
128
|
+
end
|
129
|
+
|
130
|
+
|
98
131
|
end
|
99
132
|
end
|
100
133
|
|
data/lib/trellor/version.rb
CHANGED
data/lib/web_trellor.rb
CHANGED
@@ -6,24 +6,31 @@ require 'pathname'
|
|
6
6
|
require 'addressable/uri'
|
7
7
|
require_relative "trellor/version"
|
8
8
|
|
9
|
+
# this is loaded just for logger.
|
10
|
+
# TODO: move logger to separate file.
|
11
|
+
require_relative 'trellor'
|
12
|
+
|
9
13
|
module Trellor
|
10
14
|
class WebTrellor
|
11
|
-
|
12
|
-
|
13
|
-
def ensure_webapp_is_running
|
15
|
+
def ensure_webapp_is_running(fork=true)
|
14
16
|
v = get_version
|
15
|
-
$stderr.puts "Warning: this version is #{VERSION} but the webapp version is #{v}. You may want to kill the older webapp." unless
|
17
|
+
$stderr.puts "Warning: this version is #{VERSION} but the webapp version is #{v}. You may want to kill the older webapp." unless (!v or (v==VERSION))
|
16
18
|
fail unless v
|
17
19
|
rescue
|
18
20
|
puts "The background webapp wasn't running. Will run it now."
|
19
21
|
verbose_log "The background webapp wasn't running. Will run it now."
|
20
|
-
run_webapp
|
22
|
+
run_webapp(fork)
|
21
23
|
end
|
22
24
|
|
23
|
-
def run_webapp
|
25
|
+
def run_webapp(fork)
|
24
26
|
path = Pathname.new(__FILE__).parent.parent
|
25
27
|
cmd = "cd '#{path}' && ruby lib/webapi.rb &> /dev/null"
|
26
28
|
verbose_log cmd
|
29
|
+
unless fork
|
30
|
+
$stderr.puts 'running ...'
|
31
|
+
exec cmd
|
32
|
+
exit 0
|
33
|
+
end
|
27
34
|
job = fork do
|
28
35
|
exec cmd
|
29
36
|
end
|
@@ -44,8 +51,41 @@ module Trellor
|
|
44
51
|
nil
|
45
52
|
end
|
46
53
|
|
54
|
+
|
55
|
+
############## trellor interface queries ###############
|
56
|
+
|
57
|
+
def board_names
|
58
|
+
verbose_log('getting boards') unless @boards
|
59
|
+
@boards = JSON.parse(get_http('/boards').body)
|
60
|
+
end
|
61
|
+
|
62
|
+
def list_names(board_name)
|
63
|
+
JSON.parse(get_http("/boards", {board_name: board_name}).body)
|
64
|
+
end
|
65
|
+
|
66
|
+
def card_names(board_name, list_name)
|
67
|
+
body = get_http("/boards", {board_name: board_name, list_name: list_name}).body
|
68
|
+
JSON.parse(body)
|
69
|
+
end
|
70
|
+
|
71
|
+
def create_card(board_name, list_name, name, descript=nil)
|
72
|
+
data = {board_name: board_name, list_name: list_name, card_name: name, descript: descript}
|
73
|
+
JSON.parse(post_http('/boards', data).body)
|
74
|
+
end
|
75
|
+
|
76
|
+
def archive_card(board_name, list_name, name)
|
77
|
+
data = {archive: true, board_name: board_name, list_name: list_name, card_name: name}
|
78
|
+
JSON.parse(post_http('/boards', data).body)
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
|
84
|
+
################# private ################
|
85
|
+
|
47
86
|
def get_http(url, data=nil, timeout=nil, show_error=true)
|
48
87
|
uri = Addressable::URI.parse("#{site}#{url}")
|
88
|
+
verbose_log('get_http', uri, data)
|
49
89
|
http = Net::HTTP.new uri.host, uri.port
|
50
90
|
http.open_timeout = default_open_timeout
|
51
91
|
http.read_timeout = timeout || default_read_timeout
|
@@ -60,12 +100,9 @@ module Trellor
|
|
60
100
|
raise e
|
61
101
|
end
|
62
102
|
|
63
|
-
def
|
64
|
-
60
|
65
|
-
end
|
66
|
-
|
67
|
-
def post_http(url, data, timeout=nil)
|
103
|
+
def post_http(url, data, timeout=nil, show_error=true)
|
68
104
|
uri = URI("#{site}#{url}")
|
105
|
+
verbose_log('post_http', uri, data)
|
69
106
|
http = Net::HTTP.new uri.host, uri.port
|
70
107
|
http.open_timeout = default_open_timeout
|
71
108
|
http.read_timeout = timeout || default_read_timeout
|
@@ -77,7 +114,7 @@ module Trellor
|
|
77
114
|
verbose_log response.code, response.body
|
78
115
|
response
|
79
116
|
rescue Exception => e
|
80
|
-
$stderr.puts "ERROR in post_http(#{url})"
|
117
|
+
$stderr.puts "ERROR in post_http(#{url})" if show_error
|
81
118
|
raise e
|
82
119
|
end
|
83
120
|
|
@@ -97,64 +134,7 @@ module Trellor
|
|
97
134
|
end
|
98
135
|
|
99
136
|
def verbose_log(*args)
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
def user()
|
104
|
-
verbose_log('username', ENV['TRELLOR_USERNAME'])
|
105
|
-
@user ||= client.find(:members, ENV['TRELLOR_USERNAME'])
|
106
|
-
end
|
107
|
-
|
108
|
-
def board_names
|
109
|
-
verbose_log('getting boards') unless @boards
|
110
|
-
@boards = JSON.parse(get_http('/boards').body)
|
111
|
-
#@boards ||= user.boards.select{ |b| !b.closed? }
|
112
|
-
end
|
113
|
-
|
114
|
-
def list_names(board_name)
|
115
|
-
JSON.parse(get_http("/boards", {board_name: board_name}).body)
|
116
|
-
end
|
117
|
-
|
118
|
-
def card_names(board_name, list_name)
|
119
|
-
JSON.parse(get_http("/boards", {board_name: board_name, list_name: list_name}).body)
|
120
|
-
end
|
121
|
-
|
122
|
-
def create_card(board_name, list_name, name, descript=nil)
|
123
|
-
JSON.parse(post_http("/boards/#{board_name}/lists/#{list_name}/cards", {card_name: name, descript: descript}).body)
|
124
|
-
end
|
125
|
-
|
126
|
-
def archive_card(board_name, list_name, name)
|
127
|
-
JSON.parse(post_http("/boards/#{board_name}/lists/#{list_name}/cards", {card_name: name, archive: true}).body)
|
128
|
-
end
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
def board(name)
|
134
|
-
boards # to get verbose log ordering correct
|
135
|
-
verbose_log('getting board', name)
|
136
|
-
name = name.downcase
|
137
|
-
boards.detect{ |board| board.name.downcase.start_with?(name) }
|
138
|
-
end
|
139
|
-
|
140
|
-
def list(board_name, list_name)
|
141
|
-
this_board = board(board_name)
|
142
|
-
verbose_log(' getting list', board_name, list_name)
|
143
|
-
list_name = list_name.downcase
|
144
|
-
this_board.lists.detect do |list|
|
145
|
-
list.name.downcase.start_with?(list_name)
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
def cards(board_name, list_name)
|
150
|
-
verbose_log(' getting cards for', board_name, list_name)
|
151
|
-
list(board_name, list_name).cards
|
152
|
-
end
|
153
|
-
|
154
|
-
def card(board_name, list_name, card_name)
|
155
|
-
list(board_name, list_name).cards.detect do |card|
|
156
|
-
card.name==card_name
|
157
|
-
end
|
137
|
+
Trellor.logger.debug(" ****** #{args.inspect}")
|
158
138
|
end
|
159
139
|
end
|
160
140
|
end
|
data/lib/webapi.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'sinatra'
|
2
|
-
require '
|
2
|
+
require 'yajl/json_gem'
|
3
3
|
require_relative 'trellor/version'
|
4
4
|
require_relative 'trellor'
|
5
5
|
|
6
|
-
|
7
6
|
module Trellor
|
8
7
|
class TrellorWebapi < Sinatra::Base
|
9
8
|
# enable error handler even in development mode
|
@@ -28,9 +27,22 @@ not_found do
|
|
28
27
|
end
|
29
28
|
|
30
29
|
error do
|
31
|
-
|
30
|
+
# log = Logger.new(File.new('log','a'))
|
31
|
+
msg = 'Sorry there was a error: ' + env['sinatra.error'].message
|
32
|
+
logger.error msg
|
33
|
+
env['sinatra.error'].backtrace.each{|l| logger.error l}
|
34
|
+
msg
|
32
35
|
end
|
33
36
|
|
37
|
+
helpers do
|
38
|
+
def logger
|
39
|
+
unless @logger
|
40
|
+
@logger = Trellor::Trellor.logger
|
41
|
+
@logger.progname = '[webapi]'
|
42
|
+
end
|
43
|
+
@logger
|
44
|
+
end
|
45
|
+
end
|
34
46
|
|
35
47
|
def trellor
|
36
48
|
Trellor::Trellor.singleton
|
@@ -42,7 +54,9 @@ end
|
|
42
54
|
|
43
55
|
get '/boards' do
|
44
56
|
if params[:list_name]
|
45
|
-
|
57
|
+
logger.info params.inspect
|
58
|
+
# cards = trellor.list_names(params[:board_name],params[:list_name]).cards.collect{ |card| card.name }
|
59
|
+
cards = trellor.card_names(params[:board_name],params[:list_name])
|
46
60
|
cards.to_json
|
47
61
|
elsif params[:board_name]
|
48
62
|
lists = trellor.list_names(params[:board_name])
|
@@ -53,15 +67,29 @@ get '/boards' do
|
|
53
67
|
end
|
54
68
|
end
|
55
69
|
|
56
|
-
post '/boards
|
70
|
+
post '/boards' do
|
71
|
+
board_name = params['board_name']
|
72
|
+
list_name = params['list_name']
|
57
73
|
if params['archive']
|
58
74
|
trellor.archive_card(board_name, list_name, params['card_name'])
|
59
75
|
else
|
60
76
|
trellor.create_card(board_name, list_name, params['card_name'], params['descript'])
|
61
77
|
end
|
62
78
|
|
63
|
-
cards = trellor.
|
79
|
+
cards = trellor.card_names(board_name,list_name)
|
64
80
|
cards.to_json
|
65
81
|
params.to_json
|
66
82
|
end
|
67
83
|
|
84
|
+
# post '/boards/:board_name/lists/:list_name/cards' do |board_name, list_name|
|
85
|
+
# if params['archive']
|
86
|
+
# trellor.archive_card(board_name, list_name, params['card_name'])
|
87
|
+
# else
|
88
|
+
# trellor.create_card(board_name, list_name, params['card_name'], params['descript'])
|
89
|
+
# end
|
90
|
+
|
91
|
+
# cards = trellor.list(board_name,list_name).cards.collect{ |c| c.name }
|
92
|
+
# cards.to_json
|
93
|
+
# params.to_json
|
94
|
+
# end
|
95
|
+
|
data/trellor.gemspec
CHANGED
@@ -24,8 +24,14 @@ Gem::Specification.new do |spec|
|
|
24
24
|
# for webapi.rb only. Wonder if there is a way to make it a dependency only
|
25
25
|
# when it is used?
|
26
26
|
spec.add_dependency 'sinatra'
|
27
|
+
spec.add_dependency 'virtus'
|
28
|
+
# spec.add_dependency 'yajl-ruby', require: 'yajl'
|
29
|
+
spec.add_dependency 'yajl-ruby'
|
27
30
|
|
28
31
|
spec.add_development_dependency "bundler", "~> 1.10"
|
29
32
|
spec.add_development_dependency "rake", "~> 10.0"
|
30
33
|
spec.add_development_dependency "rspec"
|
34
|
+
spec.add_development_dependency "pry"
|
35
|
+
spec.add_development_dependency "pry-remote"
|
36
|
+
spec.add_development_dependency "pry-nav"
|
31
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trellor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Murphy-Dye
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-trello
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: virtus
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: yajl-ruby
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: bundler
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +122,48 @@ dependencies:
|
|
94
122
|
- - ">="
|
95
123
|
- !ruby/object:Gem::Version
|
96
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: pry
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: pry-remote
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: pry-nav
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
97
167
|
description: ''
|
98
168
|
email:
|
99
169
|
- brian@murphydye.com
|
@@ -111,7 +181,12 @@ files:
|
|
111
181
|
- bin/console
|
112
182
|
- bin/setup
|
113
183
|
- bin/trellor
|
184
|
+
- docs/trellor.png
|
185
|
+
- docs/trellor.txt
|
186
|
+
- docs/trellor_seq_diag.png
|
187
|
+
- docs/trellor_seq_diag.txt
|
114
188
|
- lib/cli.rb
|
189
|
+
- lib/models.rb
|
115
190
|
- lib/trellor.rb
|
116
191
|
- lib/trellor/version.rb
|
117
192
|
- lib/web_trellor.rb
|