trellor 1.0.0 → 2.0.0
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 -4
- data/lib/cli.rb +36 -9
- data/lib/trellor.rb +31 -9
- data/lib/trellor/version.rb +1 -1
- data/lib/web_trellor.rb +134 -0
- data/lib/webapi.rb +52 -0
- data/trellor.gemspec +3 -0
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9a7abd7667991d513c5a1fc0f24ec51e63b7b80
|
4
|
+
data.tar.gz: 6cb3116624da44f20ef787abe4415dab26062b76
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4fdb1027f3444837db708e28358beae1d84971f43d598e66716b891a256b40119755d37f69aa353c83cf4c8422eda92bffd2db6434605619524f14857f80e978
|
7
|
+
data.tar.gz: db14810a4a883c0d799e6e538bf08249f7c7cee6549360bed4e29e97e399a1ec1a9ee5334f035e4a1f636b3f946154eee4a8f49fc91727cc59484b4271fe8c32
|
data/README.md
CHANGED
@@ -20,20 +20,29 @@ Three environment variables need to be set: TRELLOR_KEY, TRELLOR_TOKEN,
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
+
$ trellor -h # prints help
|
23
24
|
$ trellor # prints all board names
|
25
|
+
$ trellor # caches all boards and lists to ~/.config/.trellor
|
26
|
+
# toying with using this to speed access
|
27
|
+
# however, the connection seems to be main slowdown
|
24
28
|
$ trellor to # prints all list names inside the first board with name
|
25
29
|
# beginning with 'to' (case insensitive)
|
26
|
-
# for example, this
|
27
|
-
$ trellor to
|
30
|
+
# for example, this matches 'ToDo'
|
31
|
+
$ trellor to in # prints all card names in the list named 'in*' in board
|
28
32
|
# named 'to*', e.g., matches 'ToDo.Inbox'
|
29
33
|
# create a card:
|
30
|
-
$ trellor to
|
34
|
+
$ trellor to in 'this is a new card', 'this is an optional description.'
|
31
35
|
|
32
36
|
Using aliases work well, for example:
|
33
|
-
$ alias inbox="trellor todo
|
37
|
+
$ alias inbox="trellor todo inbox"
|
34
38
|
$ inbox # prints cards in todo.inbox
|
35
39
|
$ inbox 'new card' # creates a new card in todo.inbox
|
36
40
|
|
41
|
+
Starting with version 2, a webapp is run in the background. Making the connection to
|
42
|
+
Trello resulted in over half the time to run a command. The local webapp pays
|
43
|
+
this cost only once.
|
44
|
+
|
45
|
+
|
37
46
|
## Development
|
38
47
|
|
39
48
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/cli.rb
CHANGED
@@ -9,6 +9,16 @@ module Trellor
|
|
9
9
|
version "trellor #{VERSION}"
|
10
10
|
opt :cache, 'Cache (or re-cache)', short: '-c'
|
11
11
|
opt :verbose, 'Run verbosely', short: '-v'
|
12
|
+
opt :webapi, 'Run webapi', short: '-w'
|
13
|
+
opt :slowtrellor, 'Make own connection rather than using webapi', short: '-s'
|
14
|
+
end
|
15
|
+
|
16
|
+
if webapi?
|
17
|
+
puts 'webapi'
|
18
|
+
require_relative 'webapi'
|
19
|
+
run TrellorWebapi
|
20
|
+
puts 'done?'
|
21
|
+
sleep 10
|
12
22
|
end
|
13
23
|
|
14
24
|
if cache?
|
@@ -24,7 +34,16 @@ module Trellor
|
|
24
34
|
def self.trellor
|
25
35
|
unless @trellor
|
26
36
|
verbose_log('creating Trellor instance')
|
27
|
-
@trellor =
|
37
|
+
@trellor = if @opts[:slowtrellor]
|
38
|
+
verbose_log('using local (slower) trellor')
|
39
|
+
Trellor.new
|
40
|
+
else
|
41
|
+
verbose_log('using webapi')
|
42
|
+
require_relative 'web_trellor'
|
43
|
+
web = WebTrellor.new
|
44
|
+
web.ensure_webapp_is_running
|
45
|
+
web
|
46
|
+
end
|
28
47
|
@trellor.be_verbose = true if @opts[:verbose]
|
29
48
|
end
|
30
49
|
@trellor
|
@@ -69,18 +88,22 @@ module Trellor
|
|
69
88
|
verbose_log "card_name", card_name
|
70
89
|
if board_name.nil?
|
71
90
|
puts "Boards:", '-'*50
|
72
|
-
trellor.
|
91
|
+
trellor.board_names.each{ |name| puts name }
|
92
|
+
# trellor.boards.each{ |board| puts board.name }
|
73
93
|
else
|
74
94
|
if list_name.nil?
|
75
|
-
board = trellor.board(board_name)
|
76
|
-
puts "Board: #{
|
77
|
-
|
95
|
+
# board = trellor.board(board_name)
|
96
|
+
puts "Board: #{board_name}", '-'*50
|
97
|
+
trellor.list_names(board_name).each{ |name| puts name }
|
98
|
+
# board.lists.each{ |list| puts list.name }
|
78
99
|
elsif card_name.nil?
|
79
|
-
list = trellor.list(board_name, list_name)
|
80
|
-
puts "List: #{
|
81
|
-
|
100
|
+
# list = trellor.list(board_name, list_name)
|
101
|
+
puts "List: #{board_name}.#{list_name}", '-'*50
|
102
|
+
trellor.card_names(board_name, list_name).each{ |name| puts name }
|
103
|
+
# list.cards.each{ |card| puts card.name }
|
82
104
|
else
|
83
|
-
trellor.create_card(board_name, list_name, card_name, descript)
|
105
|
+
card_names = trellor.create_card(board_name, list_name, card_name, descript)
|
106
|
+
card_names.each{ |name| puts name }
|
84
107
|
end
|
85
108
|
end
|
86
109
|
end
|
@@ -89,6 +112,10 @@ module Trellor
|
|
89
112
|
$stderr.puts(" ****** #{args.inspect}") if @opts[:verbose]
|
90
113
|
end
|
91
114
|
|
115
|
+
def self.webapi?
|
116
|
+
@opts[:webapi]
|
117
|
+
end
|
118
|
+
|
92
119
|
def self.cache?
|
93
120
|
@opts[:cache]
|
94
121
|
end
|
data/lib/trellor.rb
CHANGED
@@ -7,6 +7,14 @@ module Trellor
|
|
7
7
|
class Trellor
|
8
8
|
attr_accessor :be_verbose
|
9
9
|
|
10
|
+
def self.singleton
|
11
|
+
unless @singleton
|
12
|
+
puts 'getting singleton'
|
13
|
+
@singleton = self.new
|
14
|
+
end
|
15
|
+
@singleton
|
16
|
+
end
|
17
|
+
|
10
18
|
def client(key=ENV['TRELLOR_KEY'], token=ENV['TRELLOR_TOKEN'])
|
11
19
|
@client ||= connect(key, token)
|
12
20
|
end
|
@@ -28,6 +36,29 @@ module Trellor
|
|
28
36
|
@user ||= client.find(:members, ENV['TRELLOR_USERNAME'])
|
29
37
|
end
|
30
38
|
|
39
|
+
def board_names
|
40
|
+
boards.collect{ |board| board.name }.sort_by{|name| name.downcase}
|
41
|
+
end
|
42
|
+
def list_names(board_name)
|
43
|
+
board(board_name).lists.collect{ |list| list.name }.sort_by{|name| name.downcase}
|
44
|
+
end
|
45
|
+
def card_names(board_name, list_name)
|
46
|
+
list(board_name, list_name).cards.collect{ |card| card.name }
|
47
|
+
end
|
48
|
+
def create_card(board_name, list_name, name, descript=nil)
|
49
|
+
card = Trello::Card.new
|
50
|
+
card.client = client
|
51
|
+
card.list_id = list(board_name, list_name).id
|
52
|
+
card.name = name
|
53
|
+
card.desc = descript if descript
|
54
|
+
card.save
|
55
|
+
card_names(board_name, list_name)
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
|
31
62
|
def boards
|
32
63
|
verbose_log('getting boards') unless @boards
|
33
64
|
@boards ||= user.boards.select{ |b| !b.closed? }
|
@@ -62,15 +93,6 @@ module Trellor
|
|
62
93
|
card.name==card_name
|
63
94
|
end
|
64
95
|
end
|
65
|
-
|
66
|
-
def create_card(board_name, list_name, name, descript=nil)
|
67
|
-
card = Trello::Card.new
|
68
|
-
card.client = client
|
69
|
-
card.list_id = list(board_name, list_name).id
|
70
|
-
card.name = name
|
71
|
-
card.desc = descript if descript
|
72
|
-
card.save
|
73
|
-
end
|
74
96
|
end
|
75
97
|
end
|
76
98
|
|
data/lib/trellor/version.rb
CHANGED
data/lib/web_trellor.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
# TODO: show card descriptions
|
2
|
+
|
3
|
+
require 'trello'
|
4
|
+
require 'net/http'
|
5
|
+
require_relative "trellor/version"
|
6
|
+
|
7
|
+
module Trellor
|
8
|
+
class WebTrellor
|
9
|
+
attr_accessor :be_verbose
|
10
|
+
|
11
|
+
def ensure_webapp_is_running
|
12
|
+
fail unless VERSION == get_version
|
13
|
+
rescue
|
14
|
+
puts "The background webapp wasn't running. Will run it now."
|
15
|
+
cmd = "ruby lib/webapi.rb &> /dev/null"
|
16
|
+
job1 = fork do
|
17
|
+
exec cmd
|
18
|
+
end
|
19
|
+
Process.detach(job1)
|
20
|
+
sleep 0.5
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_version
|
24
|
+
response = get_http('/version')
|
25
|
+
response.body
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_http(url, timeout=nil)
|
29
|
+
uri = URI("#{site}#{url}")
|
30
|
+
http = Net::HTTP.new uri.host, uri.port
|
31
|
+
http.open_timeout = default_open_timeout
|
32
|
+
http.read_timeout = timeout || default_read_timeout
|
33
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
34
|
+
# request.basic_auth 'trellor', password if password
|
35
|
+
http.request(request)
|
36
|
+
rescue Exception => e
|
37
|
+
$stderr.puts "ERROR in get_http(#{url})"
|
38
|
+
raise e
|
39
|
+
end
|
40
|
+
|
41
|
+
def default_open_timeout
|
42
|
+
60
|
43
|
+
end
|
44
|
+
|
45
|
+
def post_http(url, data, timeout=nil)
|
46
|
+
uri = URI("#{site}#{url}")
|
47
|
+
http = Net::HTTP.new uri.host, uri.port
|
48
|
+
http.open_timeout = default_open_timeout
|
49
|
+
http.read_timeout = timeout || default_read_timeout
|
50
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
51
|
+
# request.basic_auth 'trellor', password if password
|
52
|
+
|
53
|
+
request.set_form_data data
|
54
|
+
http.request(request)
|
55
|
+
rescue Exception => e
|
56
|
+
$stderr.puts "ERROR in post_http(#{url})"
|
57
|
+
raise e
|
58
|
+
end
|
59
|
+
|
60
|
+
def default_open_timeout
|
61
|
+
@default_open_timeout ||= (ENV['TRELLOR_OPEN_TIMEOUT'] || 1).to_i
|
62
|
+
end
|
63
|
+
|
64
|
+
def default_read_timeout
|
65
|
+
@default_read_timeout = (ENV['TRELLOR_READ_TIMEOUT'] || 30).to_i
|
66
|
+
end
|
67
|
+
|
68
|
+
def site
|
69
|
+
"http://localhost:#{port}"
|
70
|
+
end
|
71
|
+
def port
|
72
|
+
4567
|
73
|
+
end
|
74
|
+
|
75
|
+
def verbose_log(*args)
|
76
|
+
$stderr.puts(" ****** #{args.inspect}") if be_verbose
|
77
|
+
end
|
78
|
+
|
79
|
+
def user()
|
80
|
+
verbose_log('username', ENV['TRELLOR_USERNAME'])
|
81
|
+
@user ||= client.find(:members, ENV['TRELLOR_USERNAME'])
|
82
|
+
end
|
83
|
+
|
84
|
+
def board_names
|
85
|
+
verbose_log('getting boards') unless @boards
|
86
|
+
@boards = JSON.parse(get_http('/boards').body)
|
87
|
+
#@boards ||= user.boards.select{ |b| !b.closed? }
|
88
|
+
end
|
89
|
+
|
90
|
+
def list_names(board_name)
|
91
|
+
JSON.parse(get_http("/boards/#{board_name}/lists").body)
|
92
|
+
end
|
93
|
+
|
94
|
+
def card_names(board_name, list_name)
|
95
|
+
JSON.parse(get_http("/boards/#{board_name}/lists/#{list_name}/cards").body)
|
96
|
+
end
|
97
|
+
|
98
|
+
def create_card(board_name, list_name, name, descript=nil)
|
99
|
+
JSON.parse(post_http("/boards/#{board_name}/lists/#{list_name}/cards", {card_name: name}).body)
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
def board(name)
|
107
|
+
boards # to get verbose log ordering correct
|
108
|
+
verbose_log('getting board', name)
|
109
|
+
name = name.downcase
|
110
|
+
boards.detect{ |board| board.name.downcase.start_with?(name) }
|
111
|
+
end
|
112
|
+
|
113
|
+
def list(board_name, list_name)
|
114
|
+
this_board = board(board_name)
|
115
|
+
verbose_log(' getting list', board_name, list_name)
|
116
|
+
list_name = list_name.downcase
|
117
|
+
this_board.lists.detect do |list|
|
118
|
+
list.name.downcase.start_with?(list_name)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def cards(board_name, list_name)
|
123
|
+
verbose_log(' getting cards for', board_name, list_name)
|
124
|
+
list(board_name, list_name).cards
|
125
|
+
end
|
126
|
+
|
127
|
+
def card(board_name, list_name, card_name)
|
128
|
+
list(board_name, list_name).cards.detect do |card|
|
129
|
+
card.name==card_name
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
data/lib/webapi.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
require 'json'
|
3
|
+
require_relative 'trellor/version'
|
4
|
+
require_relative 'trellor'
|
5
|
+
|
6
|
+
module Trellor
|
7
|
+
class TrellorWebapi < Sinatra::Base
|
8
|
+
get '/' do
|
9
|
+
"Hello, world!"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def trellor
|
15
|
+
Trellor::Trellor.singleton
|
16
|
+
end
|
17
|
+
|
18
|
+
get '/version' do
|
19
|
+
Trellor::VERSION
|
20
|
+
end
|
21
|
+
|
22
|
+
get '/boards' do
|
23
|
+
boards = trellor.board_names
|
24
|
+
boards.to_json
|
25
|
+
end
|
26
|
+
|
27
|
+
get '/boards/:board_name/lists' do |board_name|
|
28
|
+
lists = trellor.list_names(board_name)
|
29
|
+
lists.to_json
|
30
|
+
end
|
31
|
+
|
32
|
+
get '/boards/:board_name/lists/:list_name/cards' do |board_name, list_name|
|
33
|
+
cards = trellor.list(board_name,list_name).cards.collect{ |card| card.name }
|
34
|
+
cards.to_json
|
35
|
+
end
|
36
|
+
|
37
|
+
get '/bbboards/:board_name/lists/:list_name/cards/:card_name' do
|
38
|
+
card = trellor.list(params['board_name'],params['list_name'],params['card_name'])
|
39
|
+
card.to_json
|
40
|
+
end
|
41
|
+
|
42
|
+
post '/boards/:board_name/lists/:list_name/cards' do |board_name, list_name|
|
43
|
+
card = Trello::Card.new
|
44
|
+
card.client = trellor.client
|
45
|
+
card.list_id = trellor.list(board_name,list_name).id
|
46
|
+
card.name = params['card_name']
|
47
|
+
card.save
|
48
|
+
|
49
|
+
cards = trellor.list(board_name,list_name).cards.collect{ |c| c.name }
|
50
|
+
cards.to_json
|
51
|
+
end
|
52
|
+
|
data/trellor.gemspec
CHANGED
@@ -21,6 +21,9 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.add_dependency 'ruby-trello'
|
23
23
|
spec.add_dependency 'trollop'
|
24
|
+
# for webapi.rb only. Wonder if there is a way to make it a dependency only
|
25
|
+
# when it is used?
|
26
|
+
spec.add_dependency 'sinatra'
|
24
27
|
|
25
28
|
spec.add_development_dependency "bundler", "~> 1.10"
|
26
29
|
spec.add_development_dependency "rake", "~> 10.0"
|
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:
|
4
|
+
version: 2.0.0
|
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-
|
11
|
+
date: 2015-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-trello
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sinatra
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,6 +114,8 @@ files:
|
|
100
114
|
- lib/cli.rb
|
101
115
|
- lib/trellor.rb
|
102
116
|
- lib/trellor/version.rb
|
117
|
+
- lib/web_trellor.rb
|
118
|
+
- lib/webapi.rb
|
103
119
|
- trellor.gemspec
|
104
120
|
homepage: ''
|
105
121
|
licenses:
|