trellor 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: