lionel_richie 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MDg0NzdjY2E1ZDRiMzVhNzVjYzU2ZTdhNjhjZmZkMTc0MjFjYmUyZQ==
5
+ data.tar.gz: !binary |-
6
+ OGUwOTllMjkzYzhlNDVlZGQ5Yzk5YmU3N2YzYjIwZTBjNDhjMjk2Yw==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ODUwNThhNDBmZTE1NTcyMTcyMWIzNWU3NTVlZmQ2ZDg1N2VhZDE2ZWRjNTY5
10
+ M2M5YWE4YmRhOTVlYjE2Y2FmNGNjYzBiMTEzZThmYjgxYWJmN2EzY2RkMTNk
11
+ NTQ0ZWRhZDdmM2ExZmY0NzE4MmZjMzIwNzU0MzdiYzM3ZTBlMzQ=
12
+ data.tar.gz: !binary |-
13
+ NjU5ZWE1Mjk5ZTAzNTY4NTMzZTQwMDFmMDMwN2I4OWEzMjk4ZjAxYzhiYmY4
14
+ ZjBhN2MxMzhlMzZiOTdmZDViOWMyMzViM2M0MmYzNmJjOWNhMDRiMWE5MWU5
15
+ YzcyMTI2ZTA3OTNhNDRiZTg5ZTNiYzA4NTZkZTk5NjE2MTQwNWE=
data/bin/lionel CHANGED
@@ -4,7 +4,12 @@
4
4
  # https://twitter.com/mitchellh/status/283014103189053442
5
5
  Signal.trap("INT") { exit 1 }
6
6
 
7
- require 'lionel_richie'
7
+ begin
8
+ require 'lionel_richie'
9
+ rescue LoadError
10
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
11
+ require 'lionel_richie'
12
+ end
8
13
 
9
14
  # Output message to $stderr, prefixed with the program name
10
15
  def pute(*args)
@@ -3,6 +3,7 @@ require 'trello'
3
3
  require 'google_drive'
4
4
  require 'launchy'
5
5
  require 'thor'
6
+ require 'logger'
6
7
  require 'lionel/version'
7
8
  require 'lionel/cli'
8
9
  require 'lionel/configuration'
@@ -15,4 +16,15 @@ require 'lionel/trello_authentication'
15
16
  require 'lionel/google_authentication'
16
17
 
17
18
  module Lionel
19
+ extend self
20
+ attr_accessor :logger
21
+
22
+ def logger=(logger)
23
+ logger.formatter = proc do |severity, datetime, progname, msg|
24
+ "[#{datetime}][#{severity}]: #{msg}\n"
25
+ end
26
+ @logger = logger
27
+ end
18
28
  end
29
+
30
+ Lionel.logger = Logger.new(STDOUT)
@@ -1,6 +1,5 @@
1
1
  module Lionel
2
2
  class CLI < Thor
3
-
4
3
  desc "authorize PROVIDER", "Allows application to request user authorization for provider (google|trello)"
5
4
  method_option "new-client", :aliases => "-n", :type => :boolean,
6
5
  :default => false, :desc => "Set new google client credentials."
@@ -43,8 +42,9 @@ module Lionel
43
42
  method_option "trello-board-id", :aliases => "-t", :type => :string, :default => nil, :desc => "Specify the source Trello board id."
44
43
  method_option "google-doc-id", :aliases => "-g", :type => :string, :default => nil, :desc => "Specify the target Google doc id."
45
44
  method_option "save", :aliases => "-c", :type => :string, :default => true, :desc => "Save the command line ids as the default configuration."
45
+ method_option "filter", :aliases => "-f", :type => :string, :default => 'open-lists', :desc => "Possible values: open-cards, open-lists."
46
46
  def export
47
- export = Lionel::Export.new
47
+ export = Lionel::Export.new(options)
48
48
 
49
49
  if options['google-doc-id']
50
50
  export.google_doc_id = options['google-doc-id']
@@ -60,19 +60,26 @@ module Lionel
60
60
 
61
61
  export.save_configuration if options['save']
62
62
 
63
- export.authenticate
63
+ begin
64
+ export.authenticate
65
+ rescue GoogleDrive::Error, GoogleDrive::AuthenticationError
66
+ @google_attempts ||= 0
67
+ @google_attempts += 1
68
+ Lionel::GoogleAuthentication.new.refresh
69
+ if @google_attempts < 2
70
+ retry
71
+ else
72
+ invoke :authorize, ['google']
73
+ end
74
+ rescue Trello::Error, Trello::InvalidAccessToken
75
+ invoke :authorize, ['trello']
76
+ end
64
77
 
65
78
  welcome = "Trello? Is it me you're looking for?"
66
79
  say welcome
67
80
  say '=' * welcome.size
68
81
 
69
- export.download
70
-
71
- if options['print']
72
- export.rows.each { |row| say row }
73
- else
74
- export.upload
75
- end
82
+ export.process
76
83
  end
77
84
 
78
85
  end
@@ -42,7 +42,7 @@ module Lionel
42
42
  def load_data
43
43
  load_file
44
44
  rescue Errno::ENOENT
45
- puts "Couldn't load file, falling back to ENV"
45
+ Lionel.logger.info "Couldn't load file, falling back to ENV"
46
46
  default_data
47
47
  end
48
48
 
@@ -2,8 +2,14 @@ module Lionel
2
2
  class Export
3
3
  include Configurable
4
4
 
5
+ attr_reader :options
6
+
5
7
  config_accessor :google_doc_id, :trello_board_id
6
8
 
9
+ def initialize(options = {})
10
+ @options = options
11
+ end
12
+
7
13
  def data
8
14
  {
9
15
  trello_board_id: trello_board_id,
@@ -16,17 +22,18 @@ module Lionel
16
22
  end
17
23
 
18
24
  def cards
19
- cards ||= [].tap do |c|
20
- # iterate over active lists rather
21
- # than retrieving all historical cards;
22
- # trello api returns association proxy
23
- # that does not respond to "flatten"
24
- board.lists.each do |list|
25
- list.cards.each do |card|
26
- c << card
27
- end
28
- end
29
- end.map { |c| Lionel::ProxyCard.new(c) }
25
+ # iterate over active lists rather
26
+ # than retrieving all historical cards;
27
+ # trello api returns association proxy
28
+ # that does not respond to "flatten"
29
+ @cards ||= begin
30
+ case options.fetch('filter', 'open-lists')
31
+ when 'open-cards'
32
+ retrieve_open_cards
33
+ when 'open-lists'
34
+ retrieve_open_cards_in_open_lists
35
+ end.map { |c| Lionel::ProxyCard.new(c) }
36
+ end
30
37
  end
31
38
 
32
39
  def spreadsheet
@@ -34,11 +41,21 @@ module Lionel
34
41
  end
35
42
 
36
43
  def worksheet
37
- @worksheet ||= Lionel::ProxyWorksheet.new(spreadsheet.worksheets[0])
44
+ @worksheet ||= get_worksheet
45
+ end
46
+
47
+ def process
48
+ download
49
+
50
+ if options['print']
51
+ rows.each { |row| Lionel.logger.info row.inspect }
52
+ else
53
+ upload
54
+ end
38
55
  end
39
56
 
40
57
  def download
41
- puts "Exporting trello board '#{board.name}' (#{trello_board_id}) to " + "google doc '#{spreadsheet.title}' (#{google_doc_id})"
58
+ Lionel.logger.info "Exporting trello board '#{board.name}' (#{trello_board_id}) to " + "google doc '#{spreadsheet.title}' (#{google_doc_id})"
42
59
 
43
60
  start_row = 2
44
61
  rows = worksheet.size
@@ -62,25 +79,11 @@ module Lionel
62
79
  end
63
80
 
64
81
  card_rows.each do |row, card|
65
- Timeout.timeout(5) { sync_row(row, card) }
66
- end
67
- end
68
-
69
- class CardMap
70
- include Enumerable
71
-
72
- attr_reader :cards, :worksheet
73
-
74
- def initialize(cards, worksheet)
75
- @cards, @worksheet = cards, worksheet
76
- end
77
-
78
- def each(&block)
79
- card_rows.each(&block)
80
- end
81
-
82
- def card_rows
83
- @card_rows ||= {}.tap do |map|
82
+ begin
83
+ Timeout.timeout(5) { sync_row(row, card) }
84
+ rescue Timeout::Error, Trello::Error => e
85
+ Lionel.logger.warn e.inspect
86
+ Lionel.logger.warn card.inspect
84
87
  end
85
88
  end
86
89
  end
@@ -94,7 +97,7 @@ module Lionel
94
97
  end
95
98
 
96
99
  def sync_row(row, card)
97
- puts "row[#{row}] : #{card.name}"
100
+ Lionel.logger.info "row[#{row}] = #{card.name}"
98
101
 
99
102
  worksheet["B",row] = card.id
100
103
 
@@ -133,17 +136,23 @@ module Lionel
133
136
 
134
137
  # Due Date
135
138
  worksheet["M",row] = card.due_date
136
-
137
- rescue Trello::Error => e
138
- puts e.inspect
139
- puts card.inspect
140
139
  end
141
140
 
142
141
  def authenticate
143
142
  return if @authenticated
143
+ authenticate_trello
144
+ authenticate_google
145
+ @authenticated
146
+ end
147
+
148
+ def authenticate_trello
144
149
  trello_session.configure
150
+ @board = Trello::Board.find(trello_board_id)
151
+ end
152
+
153
+ def authenticate_google
145
154
  google_session
146
- @authenticated
155
+ @worksheet = Lionel::ProxyWorksheet.new(spreadsheet.worksheets[0])
147
156
  end
148
157
 
149
158
  def google_session
@@ -154,5 +163,38 @@ module Lionel
154
163
  @trello_session ||= TrelloAuthentication.new
155
164
  end
156
165
 
166
+ def retrieve_open_cards
167
+ board.cards(filter: :open)
168
+ end
169
+
170
+ def retrieve_open_cards_in_open_lists
171
+ [].tap do |c|
172
+ board.lists(filter: :open).each do |list|
173
+ list.cards(filter: :open).each do |card|
174
+ c << card
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+ class CardMap
181
+ include Enumerable
182
+
183
+ attr_reader :cards, :worksheet
184
+
185
+ def initialize(cards, worksheet)
186
+ @cards, @worksheet = cards, worksheet
187
+ end
188
+
189
+ def each(&block)
190
+ card_rows.each(&block)
191
+ end
192
+
193
+ def card_rows
194
+ @card_rows ||= {}.tap do |map|
195
+ end
196
+ end
197
+ end
198
+
157
199
  end
158
200
  end
@@ -1,3 +1,3 @@
1
1
  module Lionel
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lionel_richie
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
5
- prerelease:
4
+ version: 0.1.5
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ross Kaffenberger
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-07-15 00:00:00.000000000 Z
11
+ date: 2013-08-19 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: ruby-trello
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: google_drive
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ! '>='
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: yajl-ruby
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ! '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: thor
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ! '>='
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ! '>='
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: launchy
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ! '>='
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ! '>='
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: bundler
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ~>
108
95
  - !ruby/object:Gem::Version
@@ -110,7 +97,6 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: rspec
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ! '>='
116
102
  - !ruby/object:Gem::Version
@@ -118,7 +104,6 @@ dependencies:
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ! '>='
124
109
  - !ruby/object:Gem::Version
@@ -126,7 +111,6 @@ dependencies:
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: guard-rspec
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
115
  - - ! '>='
132
116
  - !ruby/object:Gem::Version
@@ -134,7 +118,6 @@ dependencies:
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
122
  - - ! '>='
140
123
  - !ruby/object:Gem::Version
@@ -176,27 +159,26 @@ files:
176
159
  homepage: ''
177
160
  licenses:
178
161
  - MIT
162
+ metadata: {}
179
163
  post_install_message:
180
164
  rdoc_options: []
181
165
  require_paths:
182
166
  - lib
183
167
  required_ruby_version: !ruby/object:Gem::Requirement
184
- none: false
185
168
  requirements:
186
169
  - - ! '>='
187
170
  - !ruby/object:Gem::Version
188
171
  version: '0'
189
172
  required_rubygems_version: !ruby/object:Gem::Requirement
190
- none: false
191
173
  requirements:
192
174
  - - ! '>='
193
175
  - !ruby/object:Gem::Version
194
176
  version: '0'
195
177
  requirements: []
196
178
  rubyforge_project:
197
- rubygems_version: 1.8.25
179
+ rubygems_version: 2.0.5
198
180
  signing_key:
199
- specification_version: 3
181
+ specification_version: 4
200
182
  summary: Export Trello to Google Docs
201
183
  test_files:
202
184
  - spec/lib/lionel/export_spec.rb