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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f6ad82b34a2184354858178d296725d4ea60340b
4
- data.tar.gz: 525f1c518828eb15e59b929b0c7f5c5ef969903e
3
+ metadata.gz: a9a7abd7667991d513c5a1fc0f24ec51e63b7b80
4
+ data.tar.gz: 6cb3116624da44f20ef787abe4415dab26062b76
5
5
  SHA512:
6
- metadata.gz: 86aef3d5974ec8d1b93b366b012637d954570b509de2e3378b5ddd896e1d76caf51abc19e8a322e8584cd6f1265e588f01301e3eb8180caf07836099797bbcd8
7
- data.tar.gz: 008fbf2dafe1ae825b9d11467370838c866a37800a5bfab7decd69896e0cdc5aa2f00643086c546e09ff0ea8a157db85461eaf5a72afe223a154d3021afb7471
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 will match 'ToDo'
27
- $ trellor to.in # prints all card names in the list named 'in*' in board
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.in 'this is a new card', 'this is an optional description.'
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.inbox"
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 = Trellor.new
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.boards.each{ |board| puts board.name }
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: #{board.name}", '-'*50
77
- board.lists.each{ |list| puts list.name }
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: #{list.name}", '-'*50
81
- list.cards.each{ |card| puts card.name }
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
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  module Trellor
2
- VERSION = "1.0.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -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
+
@@ -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
+
@@ -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: 1.0.0
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-09-30 00:00:00.000000000 Z
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: