trello_dxy 1.0.2
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 +7 -0
- data/Gemfile +3 -0
- data/bin/trello_dxy +4 -0
- data/lib/trello_dxy.rb +9 -0
- data/lib/trello_dxy/cli.rb +4 -0
- data/lib/trello_dxy/cli/board.rb +1 -0
- data/lib/trello_dxy/cli/board/time.rb +57 -0
- data/lib/trello_dxy/cli/commands.rb +2 -0
- data/lib/trello_dxy/cli/commands/board.rb +13 -0
- data/lib/trello_dxy/cli/commands/shared.rb +24 -0
- data/lib/trello_dxy/cli/run.rb +50 -0
- data/lib/trello_dxy/errors.rb +5 -0
- data/lib/trello_dxy/formatters.rb +2 -0
- data/lib/trello_dxy/formatters/base.rb +22 -0
- data/lib/trello_dxy/formatters/board_for_url.rb +77 -0
- data/lib/trello_dxy/meta.rb +6 -0
- data/lib/trello_dxy/requests.rb +3 -0
- data/lib/trello_dxy/requests/board_for_url.rb +20 -0
- data/lib/trello_dxy/requests/shared.rb +51 -0
- data/lib/trello_dxy/templates/trello_dxy.erb +2 -0
- data/lib/trello_dxy/utils.rb +10 -0
- data/trello_dxy.gemspec +28 -0
- metadata +134 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ccd015e1ef9737e5006e220319cf34ec94a3c799
|
4
|
+
data.tar.gz: 60819ee9f7eea17abe069b973333b37570274a1a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f7dfd2ee6fdb1946766350885e58e76813355727d897241bedbadf4614ee79d7a961b01136c8dbd2f6824ad6600b33cc7cb72d66c46ba4d6b04df9a1f35c1e35
|
7
|
+
data.tar.gz: 063d07145d90c752358c25c2c12b7d31b82774c077f26822fb673ba1bf5eafbea88457b14ae593e8a575dec3ff28915ac9e5f88d87883e4e410338462d0ba286
|
data/Gemfile
ADDED
data/bin/trello_dxy
ADDED
data/lib/trello_dxy.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'trello_dxy/cli/board/time'
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module TrelloDXY
|
2
|
+
module CLI
|
3
|
+
module Board
|
4
|
+
class Time
|
5
|
+
def initialize
|
6
|
+
@options = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def run
|
10
|
+
option_parser.parse!
|
11
|
+
required_options
|
12
|
+
board = TrelloDXY::Requests::BoardForUrl.new.board(@options[:url])
|
13
|
+
cards = board_cards(board, @options[:closed])
|
14
|
+
puts TrelloDXY::Formatters::BoardForUrl.new(cards).output @options[:output]
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def board_cards(board, include_closed)
|
20
|
+
board.cards.select do |c|
|
21
|
+
closed = c.closed
|
22
|
+
!closed || (closed && include_closed)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def option_parser(options=@options)
|
27
|
+
OptionParser.new do |opts|
|
28
|
+
opts.banner = "Usage: trello_dxy board [time]"
|
29
|
+
opts.on("-u", "--url [URL]", "URL of Trello Board." ) do |o|
|
30
|
+
@options[:url] = o
|
31
|
+
end
|
32
|
+
opts.on("-c", "--closed", "Include closed cards." ) do |o|
|
33
|
+
@options[:closed] = o
|
34
|
+
end
|
35
|
+
opts.on("-o", "--output [OUTPUT]", "Output format [json|csv].") do |o|
|
36
|
+
@options[:output] = o
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def required_options
|
42
|
+
mandatory = [:url]
|
43
|
+
missing = mandatory.select { |param| @options[param].nil? }
|
44
|
+
unless missing.empty?
|
45
|
+
puts "Missing options: #{missing.join(', ')}"
|
46
|
+
puts option_parser
|
47
|
+
exit 1
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def help
|
52
|
+
puts option_parser.help
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module TrelloDXY
|
2
|
+
module CLI
|
3
|
+
module Commands
|
4
|
+
module Shared
|
5
|
+
def actions(obj = self)
|
6
|
+
(obj.methods - obj.class.superclass.instance_methods).sort - shared_methods
|
7
|
+
end
|
8
|
+
|
9
|
+
def shared_methods
|
10
|
+
TrelloDXY::CLI::Commands::Shared.instance_methods
|
11
|
+
end
|
12
|
+
|
13
|
+
def target_name
|
14
|
+
self.class.name.downcase.split('::').last
|
15
|
+
end
|
16
|
+
|
17
|
+
def help
|
18
|
+
puts "Valid commands for #{target_name}: #{actions.join(', ')}"
|
19
|
+
puts "For further help, append -h to sub command."
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module TrelloDXY
|
2
|
+
module CLI
|
3
|
+
class Run
|
4
|
+
def run
|
5
|
+
target = ARGV.shift
|
6
|
+
cmd = ARGV.shift || 'help'
|
7
|
+
case target
|
8
|
+
when *targets
|
9
|
+
target_object = CLI::Commands.const_get(target.capitalize).new
|
10
|
+
cmd = 'help' unless target_object.actions.include?(cmd.to_sym)
|
11
|
+
begin
|
12
|
+
target_object.send cmd
|
13
|
+
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
|
14
|
+
puts $!.to_s
|
15
|
+
puts optparse
|
16
|
+
exit 1
|
17
|
+
rescue Trello::Error => e
|
18
|
+
puts e.message
|
19
|
+
exit 1
|
20
|
+
rescue TrelloDXY::Errors => e
|
21
|
+
puts "error: #{e}"
|
22
|
+
exit 1
|
23
|
+
rescue NoMethodError => e
|
24
|
+
if e.message.match /SocketError/
|
25
|
+
puts 'Please connect to the internet to access Trello'
|
26
|
+
exit 1
|
27
|
+
else
|
28
|
+
raise e
|
29
|
+
end
|
30
|
+
end
|
31
|
+
when '-v'
|
32
|
+
puts TrelloDXY::Meta::VERSION
|
33
|
+
else
|
34
|
+
puts "Unkown target: '#{target}'." unless target == '-h'
|
35
|
+
puts "trello_dxy [#{targets.join('|')}] [command] OPTIONS"
|
36
|
+
puts "Append -h for help on specific target."
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def targets
|
43
|
+
klasses = TrelloDXY::CLI.constants.reject do |c|
|
44
|
+
( c == :Run ) || ( c == :Commands )
|
45
|
+
end
|
46
|
+
klasses.map { |k| k.to_s.downcase }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module TrelloDXY
|
2
|
+
module Formatters
|
3
|
+
class Base
|
4
|
+
def initialize(data)
|
5
|
+
@data = data
|
6
|
+
end
|
7
|
+
|
8
|
+
def output(format)
|
9
|
+
case format
|
10
|
+
when 'json'
|
11
|
+
self.to_json
|
12
|
+
else 'csv'
|
13
|
+
self.to_csv
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :data
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'csv'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module TrelloDXY
|
5
|
+
module Formatters
|
6
|
+
class BoardForUrl < Base
|
7
|
+
def to_csv
|
8
|
+
generate_csv(data)
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_json
|
12
|
+
generate_json(data)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def generate_csv(cards)
|
18
|
+
CSV.generate do |csv|
|
19
|
+
csv << ['Card Name', 'Estimated Time', 'Actual Time', 'Members']
|
20
|
+
cards.each do |card|
|
21
|
+
title, estimated_hours, actual_hours, members = get_relevant_data(card)
|
22
|
+
csv << [title, estimated_hours, actual_hours, members]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def generate_json(cards)
|
28
|
+
relevant_data = cards.map do |card|
|
29
|
+
title, estimated_hours, actual_hours, members = get_relevant_data(card)
|
30
|
+
{
|
31
|
+
'card_name': title,
|
32
|
+
'estimated_time': estimated_hours,
|
33
|
+
'actual_hours': actual_hours,
|
34
|
+
'members': members
|
35
|
+
}
|
36
|
+
end
|
37
|
+
JSON.pretty_generate(relevant_data)
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_relevant_data(card)
|
41
|
+
title = card.name.strip
|
42
|
+
estimated_hours, title = get_estimated_hours(title)
|
43
|
+
actual_hours, title = get_actual_hours(title)
|
44
|
+
members = get_members(card)
|
45
|
+
return title, estimated_hours, actual_hours, members
|
46
|
+
end
|
47
|
+
|
48
|
+
def get_estimated_hours(title)
|
49
|
+
estimated_hours = ''
|
50
|
+
if title[0] == '('
|
51
|
+
close_paren_index = title.index(')')
|
52
|
+
estimated_hours = title[1..close_paren_index - 1]
|
53
|
+
estimated_hours_parens = title[0..close_paren_index]
|
54
|
+
title = title.sub(estimated_hours_parens, '')
|
55
|
+
title = title.strip
|
56
|
+
end
|
57
|
+
return estimated_hours, title
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_actual_hours(title)
|
61
|
+
actual_hours = ''
|
62
|
+
if title[-1] == ']'
|
63
|
+
open_bracket_index = title.rindex('[')
|
64
|
+
actual_hours = title[open_bracket_index + 1..-2]
|
65
|
+
actual_hours_brackets = title[open_bracket_index..-1]
|
66
|
+
title = title.sub(actual_hours_brackets, '')
|
67
|
+
title = title.strip
|
68
|
+
end
|
69
|
+
return actual_hours, title
|
70
|
+
end
|
71
|
+
|
72
|
+
def get_members(card)
|
73
|
+
card.members.map { |member| member.full_name }.join(', ')
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module TrelloDXY
|
2
|
+
module Requests
|
3
|
+
class BoardForUrl
|
4
|
+
include Shared
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
connect_to_trello
|
8
|
+
end
|
9
|
+
|
10
|
+
def board(url)
|
11
|
+
board = Trello::Board.all.find { |board| board.url == url }
|
12
|
+
if board.nil?
|
13
|
+
puts 'The given board URL was not found'
|
14
|
+
exit 1
|
15
|
+
end
|
16
|
+
board
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'highline/import'
|
2
|
+
|
3
|
+
module TrelloDXY
|
4
|
+
module Requests
|
5
|
+
module Shared
|
6
|
+
def connect_to_trello
|
7
|
+
Trello.configure do |config|
|
8
|
+
config.developer_public_key = key
|
9
|
+
config.member_token = token
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def key
|
14
|
+
get_key 'TRELLO_DEVELOPER_PUBLIC_KEY'
|
15
|
+
end
|
16
|
+
|
17
|
+
def token
|
18
|
+
get_key 'TRELLO_MEMBER_TOKEN'
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_key(key_name)
|
22
|
+
make_dotfile
|
23
|
+
key = ''
|
24
|
+
File.open(ENV['HOME'] + '/.trello_dxy').read.each_line do |line|
|
25
|
+
if line.start_with? key_name
|
26
|
+
key = line.split('=').last.strip
|
27
|
+
end
|
28
|
+
end
|
29
|
+
key
|
30
|
+
end
|
31
|
+
|
32
|
+
def make_dotfile
|
33
|
+
current = {}
|
34
|
+
dotfile_path = ENV['HOME'] + '/.trello_dxy'
|
35
|
+
template_path = TrelloDXY::Utils.gem_libdir + '/templates/trello_dxy.erb'
|
36
|
+
if File.exist? dotfile_path
|
37
|
+
template = File.readlines(template_path)
|
38
|
+
env = File.readlines(dotfile_path).each do |line|
|
39
|
+
kv = line.chomp.split('=', 2)
|
40
|
+
current[kv[0]] = kv[1] unless kv[1].nil? || kv[1].empty?
|
41
|
+
end
|
42
|
+
end
|
43
|
+
trello_developer_public_key = current['TRELLO_DEVELOPER_PUBLIC_KEY'] || ask('Trello developer public key (visit https://trello.com/app-key): ')
|
44
|
+
trello_member_token = current['TRELLO_MEMBER_TOKEN'] || ask("Trello member token (visit https://trello.com/1/connect?key=#{trello_developer_public_key}&name=trello_dxy&response_type=token): ")
|
45
|
+
template_file = File.open(template_path, 'r').read
|
46
|
+
erb = ERB.new(template_file)
|
47
|
+
File.open(dotfile_path, 'w+') { |file| file.write(erb.result(binding)) }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module TrelloDXY
|
2
|
+
module Utils
|
3
|
+
def self.gem_libdir
|
4
|
+
t = ["#{File.dirname(File.expand_path($0))}/../lib/#{Meta::NAME}",
|
5
|
+
"#{Gem.dir}/gems/#{Meta::NAME}-#{Meta::VERSION}/lib/#{Meta::NAME}"]
|
6
|
+
t.each {|i| return i if File.readable?(i) }
|
7
|
+
raise "both paths are invalid: #{t}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
data/trello_dxy.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'trello_dxy/meta'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = 'trello_dxy'
|
8
|
+
gem.version = TrelloDXY::Meta::VERSION
|
9
|
+
gem.authors = ['Adam Gall']
|
10
|
+
gem.email = ['adam.gall@dxydoes.com']
|
11
|
+
gem.description = 'Trello for DXY Interface'
|
12
|
+
gem.summary = 'Output various data from Trello into a DXY friendly interface'
|
13
|
+
gem.homepage = 'https://git.dxydoes.com/dxy/trello_dxy'
|
14
|
+
gem.license = 'MIT'
|
15
|
+
|
16
|
+
gem.files = `git ls-files`.split($/)
|
17
|
+
gem.files -= gem.files.grep(%r{^\.})
|
18
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
19
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
20
|
+
gem.require_paths = ['lib']
|
21
|
+
gem.required_ruby_version = '>= 2.3.0'
|
22
|
+
|
23
|
+
gem.add_development_dependency 'rspec', '~> 3.4', '>=3.4.0'
|
24
|
+
gem.add_development_dependency 'rake', '~> 11.1', '>=11.1.2'
|
25
|
+
|
26
|
+
gem.add_runtime_dependency 'highline', '1.7.8'
|
27
|
+
gem.add_runtime_dependency 'ruby-trello', '1.4.1'
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: trello_dxy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Gall
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-04-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.4'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 3.4.0
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.4'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 3.4.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rake
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '11.1'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 11.1.2
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '11.1'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 11.1.2
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: highline
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - '='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 1.7.8
|
60
|
+
type: :runtime
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - '='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 1.7.8
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: ruby-trello
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - '='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 1.4.1
|
74
|
+
type: :runtime
|
75
|
+
prerelease: false
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - '='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 1.4.1
|
81
|
+
description: Trello for DXY Interface
|
82
|
+
email:
|
83
|
+
- adam.gall@dxydoes.com
|
84
|
+
executables:
|
85
|
+
- trello_dxy
|
86
|
+
extensions: []
|
87
|
+
extra_rdoc_files: []
|
88
|
+
files:
|
89
|
+
- Gemfile
|
90
|
+
- bin/trello_dxy
|
91
|
+
- lib/trello_dxy.rb
|
92
|
+
- lib/trello_dxy/cli.rb
|
93
|
+
- lib/trello_dxy/cli/board.rb
|
94
|
+
- lib/trello_dxy/cli/board/time.rb
|
95
|
+
- lib/trello_dxy/cli/commands.rb
|
96
|
+
- lib/trello_dxy/cli/commands/board.rb
|
97
|
+
- lib/trello_dxy/cli/commands/shared.rb
|
98
|
+
- lib/trello_dxy/cli/run.rb
|
99
|
+
- lib/trello_dxy/errors.rb
|
100
|
+
- lib/trello_dxy/formatters.rb
|
101
|
+
- lib/trello_dxy/formatters/base.rb
|
102
|
+
- lib/trello_dxy/formatters/board_for_url.rb
|
103
|
+
- lib/trello_dxy/meta.rb
|
104
|
+
- lib/trello_dxy/requests.rb
|
105
|
+
- lib/trello_dxy/requests/board_for_url.rb
|
106
|
+
- lib/trello_dxy/requests/shared.rb
|
107
|
+
- lib/trello_dxy/templates/trello_dxy.erb
|
108
|
+
- lib/trello_dxy/utils.rb
|
109
|
+
- trello_dxy.gemspec
|
110
|
+
homepage: https://git.dxydoes.com/dxy/trello_dxy
|
111
|
+
licenses:
|
112
|
+
- MIT
|
113
|
+
metadata: {}
|
114
|
+
post_install_message:
|
115
|
+
rdoc_options: []
|
116
|
+
require_paths:
|
117
|
+
- lib
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 2.3.0
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
requirements: []
|
129
|
+
rubyforge_project:
|
130
|
+
rubygems_version: 2.6.3
|
131
|
+
signing_key:
|
132
|
+
specification_version: 4
|
133
|
+
summary: Output various data from Trello into a DXY friendly interface
|
134
|
+
test_files: []
|