trollolo 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +21 -2
  3. data/.rubocop_todo.yml +105 -270
  4. data/CHANGELOG.md +10 -0
  5. data/CONTRIBUTING.md +6 -4
  6. data/Gemfile +1 -1
  7. data/README.md +10 -1
  8. data/Rakefile +4 -4
  9. data/bin/trollolo +2 -2
  10. data/lib/backup.rb +21 -23
  11. data/lib/burndown_chart.rb +46 -49
  12. data/lib/burndown_data.rb +21 -21
  13. data/lib/card.rb +23 -32
  14. data/lib/checklist.rb +13 -1
  15. data/lib/cli.rb +105 -110
  16. data/lib/column.rb +11 -10
  17. data/lib/empty_column.rb +2 -2
  18. data/lib/scrum/backlog_mover.rb +3 -3
  19. data/lib/scrum/card_type_detection.rb +1 -1
  20. data/lib/scrum/creator.rb +7 -7
  21. data/lib/scrum/prioritizer.rb +1 -1
  22. data/lib/scrum/sprint_board.rb +4 -4
  23. data/lib/scrum/sprint_cleaner.rb +3 -3
  24. data/lib/scrum/sprint_planning_board.rb +2 -4
  25. data/lib/scrum_board.rb +3 -3
  26. data/lib/settings.rb +29 -27
  27. data/lib/trello_service.rb +1 -1
  28. data/lib/trello_wrapper.rb +9 -9
  29. data/lib/version.rb +1 -1
  30. data/spec/data/card.json +19 -0
  31. data/spec/data/trollolorc +3 -0
  32. data/spec/integration/command_line_spec.rb +14 -14
  33. data/spec/integration/create_burndown_spec.rb +25 -25
  34. data/spec/integration/integration_spec_helper.rb +1 -1
  35. data/spec/integration/wrapper/credentials_input_wrapper +7 -11
  36. data/spec/integration/wrapper/empty_config_trollolo_wrapper +2 -2
  37. data/spec/integration/wrapper/trollolo_wrapper +2 -2
  38. data/spec/unit/backup_spec.rb +14 -14
  39. data/spec/unit/burndown_chart_spec.rb +176 -184
  40. data/spec/unit/burndown_data_spec.rb +21 -23
  41. data/spec/unit/card_spec.rb +38 -24
  42. data/spec/unit/cli_spec.rb +57 -57
  43. data/spec/unit/empty_column_spec.rb +1 -1
  44. data/spec/unit/retrieve_data_spec.rb +13 -13
  45. data/spec/unit/scrum/backlog_mover_spec.rb +8 -8
  46. data/spec/unit/scrum/card_type_detection_spec.rb +12 -12
  47. data/spec/unit/scrum/creator_spec.rb +8 -8
  48. data/spec/unit/scrum/prioritizer_spec.rb +19 -19
  49. data/spec/unit/scrum/priority_name_spec.rb +16 -16
  50. data/spec/unit/scrum/sprint_board_spec.rb +3 -3
  51. data/spec/unit/scrum/sprint_cleaner_spec.rb +15 -15
  52. data/spec/unit/scrum/sprint_planning_board_spec.rb +2 -2
  53. data/spec/unit/scrum_board_spec.rb +56 -56
  54. data/spec/unit/settings_spec.rb +23 -23
  55. data/spec/unit/spec_helper.rb +3 -3
  56. data/spec/unit/support/test_data_operations.rb +4 -0
  57. data/spec/unit/support/update_webmock_data +9 -11
  58. data/spec/unit/support/vcr.rb +3 -3
  59. data/spec/unit/support/webmocks.rb +21 -12
  60. data/spec/unit/trello_wrapper_spec.rb +40 -29
  61. data/trollolo.gemspec +3 -3
  62. metadata +8 -5
@@ -4,58 +4,58 @@ describe Settings do
4
4
 
5
5
  include GivenFilesystemSpecHelpers
6
6
 
7
- context "given config file" do
7
+ context 'given config file' do
8
8
  before(:each) do
9
9
  @settings = Settings.new( File.expand_path('../../data/trollolorc', __FILE__) )
10
10
  end
11
11
 
12
- it "is not verbose by default" do
12
+ it 'is not verbose by default' do
13
13
  expect(@settings.verbose).to be false
14
14
  end
15
15
 
16
- it "reads config file" do
17
- expect(@settings.developer_public_key).to eq "mykey"
18
- expect(@settings.member_token).to eq "mytoken"
16
+ it 'reads config file' do
17
+ expect(@settings.developer_public_key).to eq 'mykey'
18
+ expect(@settings.member_token).to eq 'mytoken'
19
19
  end
20
20
 
21
- context "#scrum" do
22
- context "when setting is missing" do
21
+ context '#scrum' do
22
+ context 'when setting is missing' do
23
23
  before do
24
24
  @settings = Settings.new( File.expand_path('../../data/trollolorc_with_board_aliases', __FILE__) )
25
25
  end
26
- it "returns default settings" do
27
- expect(@settings.scrum["board_names"]).to eq({"planning" => "Planning Board", "sprint" => "Sprint Board"})
26
+ it 'returns default settings' do
27
+ expect(@settings.scrum['board_names']).to eq('planning' => 'Planning Board', 'sprint' => 'Sprint Board')
28
28
  end
29
29
  end
30
30
 
31
- context "when setting does exist" do
32
- it "returns name" do
33
- expect(@settings.scrum["board_names"]["sprint"]).to eq("Sprint Board")
34
- expect(@settings.scrum.board_names["planning"]).to eq("Planning Board")
31
+ context 'when setting does exist' do
32
+ it 'returns name' do
33
+ expect(@settings.scrum['board_names']['sprint']).to eq('Sprint Board')
34
+ expect(@settings.scrum.board_names['planning']).to eq('Planning Board')
35
35
  end
36
36
  end
37
37
  end
38
38
 
39
- context "#board_aliases" do
40
- context "when aliases do not exist" do
41
- it "returns an empty Hash" do
39
+ context '#board_aliases' do
40
+ context 'when aliases do not exist' do
41
+ it 'returns an empty Hash' do
42
42
  expect(@settings.board_aliases).to eq({})
43
43
  end
44
44
  end
45
45
 
46
- context "when mapping exists" do
46
+ context 'when mapping exists' do
47
47
  before do
48
48
  @settings = Settings.new( File.expand_path('../../data/trollolorc_with_board_aliases', __FILE__) )
49
49
  end
50
50
 
51
- it "returns the mapping" do
52
- expect(@settings.board_aliases).to eq({"MyTrelloBoard" => "53186e8391ef8671265eba9d"})
51
+ it 'returns the mapping' do
52
+ expect(@settings.board_aliases).to eq('MyTrelloBoard' => '53186e8391ef8671265eba9d')
53
53
  end
54
54
  end
55
55
  end
56
56
  end
57
57
 
58
- context "non-existent config file" do
58
+ context 'non-existent config file' do
59
59
  use_given_filesystem
60
60
 
61
61
  before(:each) do
@@ -63,9 +63,9 @@ describe Settings do
63
63
  @settings = Settings.new(@config_file)
64
64
  end
65
65
 
66
- it "saves config file" do
67
- @settings.developer_public_key = "mypublickey"
68
- @settings.member_token = "mymembertoken"
66
+ it 'saves config file' do
67
+ @settings.developer_public_key = 'mypublickey'
68
+ @settings.member_token = 'mymembertoken'
69
69
  @settings.save_config
70
70
 
71
71
  expect(File.read(@config_file)).to eq "---\ndeveloper_public_key: mypublickey\nmember_token: mymembertoken\n"
@@ -1,13 +1,13 @@
1
- require "simplecov"
1
+ require 'simplecov'
2
2
  SimpleCov.start
3
3
  require_relative '../../lib/trollolo'
4
4
  require 'given_filesystem/spec_helpers'
5
5
  require 'webmock/rspec'
6
6
  require 'byebug'
7
7
  require 'pry'
8
- WebMock.disable_net_connect!(:allow => "codeclimate.com")
8
+ WebMock.disable_net_connect!(allow: 'codeclimate.com')
9
9
 
10
- bin_path = File.expand_path( "../../../bin/", __FILE__ )
10
+ bin_path = File.expand_path( '../../../bin/', __FILE__ )
11
11
 
12
12
  if ENV['PATH'] !~ /#{bin_path}/
13
13
  ENV['PATH'] = bin_path + File::PATH_SEPARATOR + ENV['PATH']
@@ -5,3 +5,7 @@ end
5
5
  def dummy_settings
6
6
  Settings.new(File.expand_path('../../../data/trollolorc', __FILE__))
7
7
  end
8
+
9
+ def dummy_card_json
10
+ JSON.parse(File.read(File.expand_path('../../../data/card.json', __FILE__)))
11
+ end
@@ -1,24 +1,22 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "json"
3
+ require 'json'
4
4
 
5
- require_relative "webmocks"
5
+ require_relative 'webmocks'
6
6
 
7
- trollolo_bin = File.expand_path("../../../../bin/trollolo", __FILE__)
8
- spec_data_dir = File.expand_path("../../../data", __FILE__)
7
+ trollolo_bin = File.expand_path('../../../../bin/trollolo', __FILE__)
8
+ spec_data_dir = File.expand_path('../../../data', __FILE__)
9
9
 
10
- STDERR.puts "Updating web mock data"
10
+ STDERR.puts 'Updating web mock data'
11
11
 
12
12
  def scrub_file(file)
13
13
  json = JSON.parse(File.read(file))
14
- if json.is_a?(Hash) && json.has_key?("cards")
15
- json["cards"].each do |card|
16
- if card.has_key?("email")
17
- card["email"] = "trello@example.com"
18
- end
14
+ if json.is_a?(Hash) && json.key?('cards')
15
+ json['cards'].each do |card|
16
+ card['email'] = 'trello@example.com' if card.key?('email')
19
17
  end
20
18
  end
21
- File.open(file, "w") do |f|
19
+ File.open(file, 'w') do |f|
22
20
  f.write(JSON.pretty_generate(json))
23
21
  end
24
22
  end
@@ -1,12 +1,12 @@
1
1
  require 'vcr'
2
2
  VCR.configure do |config|
3
- config.cassette_library_dir = "spec/data/vcr"
3
+ config.cassette_library_dir = 'spec/data/vcr'
4
4
  config.hook_into :webmock
5
5
  end
6
6
 
7
7
  # example needs to use real_settings if vcr_record: true is used
8
8
  def real_settings
9
- config_path = ENV["TROLLOLO_CONFIG_PATH"] || File.expand_path("~/.trollolorc")
9
+ config_path = ENV['TROLLOLO_CONFIG_PATH'] || File.expand_path('~/.trollolorc')
10
10
  Settings.new(config_path)
11
11
  end
12
12
 
@@ -40,7 +40,7 @@ end
40
40
  RSpec.configure do |c|
41
41
  c.around do |example|
42
42
  if (cassette = example.metadata[:vcr])
43
- fail "you need to use real_settings to re-record vcr data" if real_settings_needed?(example)
43
+ raise 'you need to use real_settings to re-record vcr data' if real_settings_needed?(example)
44
44
  VCR.use_cassette(cassette, record: vcr_record_mode(example)) do
45
45
  example.run
46
46
  end
@@ -7,27 +7,36 @@ def webmock_mapping
7
7
  {
8
8
  path: 'boards/53186e8391ef8671265eba9d/lists',
9
9
  parameters: {
10
- "filter" => "open"
10
+ 'filter' => 'open'
11
11
  },
12
12
  file: 'lists.json'
13
13
  },
14
14
  {
15
15
  path: 'boards/53186e8391ef8671265eba9d',
16
16
  parameters: {
17
- "cards" => "open",
18
- "lists" => "open",
19
- "card_checklists" => "all"
17
+ 'cards' => 'open',
18
+ 'lists' => 'open',
19
+ 'card_checklists' => 'all'
20
20
  },
21
21
  file: 'full-board.json'
22
22
  },
23
23
  {
24
24
  path: 'boards/P4kJA4bE',
25
25
  parameters: {
26
- "cards" => "open",
27
- "lists" => "open",
28
- "card_checklists" => "all"
26
+ 'cards' => 'open',
27
+ 'lists' => 'open',
28
+ 'card_checklists' => 'all'
29
29
  },
30
30
  file: 'full-board-with-accepted.json'
31
+ },
32
+ {
33
+ path: 'boards/7Zar7bNm',
34
+ parameters: {
35
+ 'cards' => 'open',
36
+ 'lists' => 'open',
37
+ 'card_checklists' => 'all'
38
+ },
39
+ file: 'full-board.json'
31
40
  }
32
41
  ]
33
42
  end
@@ -40,22 +49,22 @@ def parameters_as_string(mapping, parameters = nil)
40
49
  end
41
50
  end
42
51
  if !parameters.empty?
43
- parameters_string = "?" + parameters.join("&")
52
+ parameters_string = '?' + parameters.join('&')
44
53
  else
45
- parameters_string = ""
54
+ parameters_string = ''
46
55
  end
47
56
  parameters_string
48
57
  end
49
58
 
50
59
  def mapping_url(mapping, parameters = nil)
51
- url = "https://api.trello.com/1/" + mapping[:path]
60
+ url = 'https://api.trello.com/1/' + mapping[:path]
52
61
  url += parameters_as_string(mapping, parameters)
53
62
  end
54
63
 
55
64
  def full_board_mock
56
65
  webmock_mapping.each do |mapping|
57
- url = mapping_url(mapping, [ "key=mykey", "token=mytoken" ])
66
+ url = mapping_url(mapping, [ 'key=mykey', 'token=mytoken' ])
58
67
  stub_request(:get, url)
59
- .to_return(:status => 200, :body => load_test_file(mapping[:file]))
68
+ .to_return(status: 200, body: load_test_file(mapping[:file]))
60
69
  end
61
70
  end
@@ -4,12 +4,12 @@ include GivenFilesystemSpecHelpers
4
4
 
5
5
  describe TrelloWrapper do
6
6
 
7
- let!(:settings){ double('settings', developer_public_key: "mykey", member_token: "mytoken") }
7
+ let!(:settings){ double('settings', developer_public_key: 'mykey', member_token: 'mytoken') }
8
8
  subject { described_class.new(settings) }
9
9
 
10
10
  before do
11
- stub_request(:get, "https://api.trello.com/1/boards/myboard?cards=open&key=mykey&lists=open&token=mytoken").
12
- to_return(:status => 200, :body => load_test_file("board.json"), :headers => {})
11
+ stub_request(:get, 'https://api.trello.com/1/boards/myboard?cards=open&key=mykey&lists=open&token=mytoken').
12
+ to_return(status: 200, body: load_test_file('board.json'), headers: {})
13
13
  full_board_mock
14
14
  end
15
15
 
@@ -30,26 +30,26 @@ describe TrelloWrapper do
30
30
  end
31
31
 
32
32
  it 'finds board via Trello' do
33
- subject.board("myboard")
33
+ subject.board('myboard')
34
34
  end
35
35
 
36
36
  it 'instantiate ScrumBoard with trello board and settings' do
37
37
  expect(ScrumBoard).to receive(:new).with(:board, subject.instance_variable_get(:@settings))
38
- subject.board("myboard")
38
+ subject.board('myboard')
39
39
  end
40
40
 
41
41
  it 'returns instance of a ScrumBoard' do
42
- expect(subject.board("myboard")).to be_instance_of(ScrumBoard)
42
+ expect(subject.board('myboard')).to be_instance_of(ScrumBoard)
43
43
  end
44
44
 
45
45
  it 'memoize board object' do
46
- expect(subject.board("myboard")).to be subject.board("myboard")
46
+ expect(subject.board('myboard')).to be subject.board('myboard')
47
47
  end
48
48
  end
49
49
 
50
50
  describe '#backup' do
51
51
  it 'raises an error for empty board id' do
52
- expect { subject.backup("") }.to raise_error(TrolloloError)
52
+ expect { subject.backup('') }.to raise_error(TrolloloError)
53
53
  end
54
54
 
55
55
  it 'raises an error for nil board id' do
@@ -70,7 +70,7 @@ describe TrelloWrapper do
70
70
  describe '#add_attachment' do
71
71
  use_given_filesystem
72
72
 
73
- it "uploads attachment" do
73
+ it 'uploads attachment' do
74
74
  srand(1) # Make sure multipart boundary is always the same
75
75
 
76
76
  card_body = <<EOT
@@ -80,26 +80,31 @@ describe TrelloWrapper do
80
80
  }
81
81
  EOT
82
82
 
83
- stub_request(:get, "https://api.trello.com/1/cards/123?key=mykey&token=mytoken").
84
- with(:headers => {'Accept' => '*/*; q=0.5, application/xml', 'Accept-Encoding' => 'gzip, deflate', 'User-Agent' => 'Ruby'}).
85
- to_return(:status => 200, :body => card_body, :headers => {})
83
+ stub_request(:get, 'https://api.trello.com/1/cards/123?key=mykey&token=mytoken').
84
+ with(headers: {'Accept' => '*/*; q=0.5, application/xml', 'Accept-Encoding' => 'gzip, deflate', 'User-Agent' => 'Ruby'}).
85
+ to_return(status: 200, body: card_body, headers: {})
86
86
 
87
- stub_request(:post, "https://api.trello.com/1/cards/123/attachments?key=mykey&token=mytoken").
88
- with(:headers => {'Accept' => '*/*; q=0.5, application/xml', 'Accept-Encoding' => 'gzip, deflate', 'Content-Length' => '188', 'Content-Type' => 'multipart/form-data; boundary=470924', 'User-Agent' => 'Ruby'}).
89
- to_return(:status => 200, :body => "", :headers => {})
87
+ headers = {'Accept' => '*/*; q=0.5, application/xml',
88
+ 'Accept-Encoding' => 'gzip, deflate',
89
+ 'Content-Length' => '188',
90
+ 'Content-Type' => 'multipart/form-data; boundary=470924',
91
+ 'User-Agent' => 'Ruby'}
90
92
 
91
- path = given_file("attachment-data")
93
+ stub_request(:post, 'https://api.trello.com/1/cards/123/attachments?key=mykey&token=mytoken').
94
+ with(headers: headers).to_return(status: 200, body: '', headers: {})
92
95
 
93
- subject.add_attachment("123", path)
96
+ path = given_file('attachment-data')
97
+
98
+ subject.add_attachment('123', path)
94
99
  end
95
100
  end
96
101
 
97
- describe "#make_cover" do
98
- let(:card_id) { "c133a484cff21c7a33ff031f" }
99
- let(:image_id) { "484cff21c7a33ff031f997a" }
100
- let(:image_name) { "passed.jpg" }
102
+ describe '#make_cover' do
103
+ let(:card_id) { 'c133a484cff21c7a33ff031f' }
104
+ let(:image_id) { '484cff21c7a33ff031f997a' }
105
+ let(:image_name) { 'passed.jpg' }
101
106
  let(:client) { double }
102
- let(:card_attachments_body) { <<-EOF
107
+ let(:card_attachments_body) do <<-EOF
103
108
  [
104
109
  {
105
110
  "id":"78d86ae7f25c748559b37ca",
@@ -111,23 +116,29 @@ EOT
111
116
  }
112
117
  ]
113
118
  EOF
114
- }
119
+ end
115
120
 
116
121
  before(:each) do
117
122
  stub_request(:get, "https://api.trello.com/1/cards/#{card_id}/attachments?fields=name&key=mykey&token=mytoken").
118
- with(:headers => {'Accept' => '*/*; q=0.5, application/xml', 'Accept-Encoding' => 'gzip, deflate', 'User-Agent' => 'Ruby'}).
119
- to_return(:status => 200, :body => card_attachments_body, :headers => {})
123
+ with(headers: {'Accept' => '*/*; q=0.5, application/xml', 'Accept-Encoding' => 'gzip, deflate', 'User-Agent' => 'Ruby'}).
124
+ to_return(status: 200, body: card_attachments_body, headers: {})
125
+ headers = {'Accept' => '*/*; q=0.5, application/xml',
126
+ 'Accept-Encoding' => 'gzip, deflate',
127
+ 'Content-Length' => '0',
128
+ 'Content-Type' => 'application/x-www-form-urlencoded',
129
+ 'User-Agent' => 'Ruby'}
130
+
120
131
  stub_request(:put, "https://api.trello.com/1/cards/#{card_id}/idAttachmentCover?key=mykey&token=mytoken&value=#{image_id}").
121
- with(:headers => {'Accept' => '*/*; q=0.5, application/xml', 'Accept-Encoding' => 'gzip, deflate', 'Content-Length' => '0', 'Content-Type' => 'application/x-www-form-urlencoded', 'User-Agent' => 'Ruby'})
132
+ with(headers: headers)
122
133
  end
123
134
 
124
- it "make the attachment with the file name passed.jpg the cover" do
135
+ it 'make the attachment with the file name passed.jpg the cover' do
125
136
  subject.make_cover(card_id, image_name)
126
137
  expect(WebMock).to have_requested(:put, "https://api.trello.com/1/cards/#{card_id}/idAttachmentCover?key=mykey&token=mytoken&value=#{image_id}")
127
138
  end
128
139
 
129
- it "shows an error if the file was not found in the attachment list" do
130
- expect { subject.make_cover(card_id, "non_existing_file.jpg") }.to raise_error(/non_existing_file.jpg/)
140
+ it 'shows an error if the file was not found in the attachment list' do
141
+ expect { subject.make_cover(card_id, 'non_existing_file.jpg') }.to raise_error(/non_existing_file.jpg/)
131
142
  end
132
143
  end
133
144
  end
@@ -4,7 +4,7 @@ require File.expand_path('../lib/version', __FILE__)
4
4
  Gem::Specification.new do |s|
5
5
  s.name = 'trollolo'
6
6
  s.version = Trollolo::VERSION
7
- s.license = 'GPL-3'
7
+ s.license = 'GPL-3.0'
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ['Cornelius Schumacher']
10
10
  s.email = ['cschum@suse.de']
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
12
12
  s.summary = 'Trello command line client'
13
13
  s.description = 'Trollolo is a command line tool to access Trello and support tasks like generation of burndown charts.'
14
14
 
15
- s.required_ruby_version = '>= 2.2'
15
+ s.required_ruby_version = ['>= 2.2.0', '< 2.4.2']
16
16
  s.required_rubygems_version = '>= 1.3.6'
17
17
  s.rubyforge_project = 'trollolo'
18
18
 
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.add_dependency 'ruby-trello', '~> 1.5.0'
21
21
 
22
22
  s.files = `git ls-files`.split("\n")
23
- s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
23
+ s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? Regexp.last_match(1) : nil}.compact
24
24
  s.require_path = 'lib'
25
25
 
26
26
  s.files += Dir['man/*.?'] # UNIX man pages
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trollolo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cornelius Schumacher
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-06 00:00:00.000000000 Z
11
+ date: 2018-01-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -171,7 +171,7 @@ files:
171
171
  - yes_ship_it.conf
172
172
  homepage: https://github.com/openSUSE/trollolo
173
173
  licenses:
174
- - GPL-3
174
+ - GPL-3.0
175
175
  metadata: {}
176
176
  post_install_message:
177
177
  rdoc_options: []
@@ -181,7 +181,10 @@ required_ruby_version: !ruby/object:Gem::Requirement
181
181
  requirements:
182
182
  - - ">="
183
183
  - !ruby/object:Gem::Version
184
- version: '2.2'
184
+ version: 2.2.0
185
+ - - "<"
186
+ - !ruby/object:Gem::Version
187
+ version: 2.4.2
185
188
  required_rubygems_version: !ruby/object:Gem::Requirement
186
189
  requirements:
187
190
  - - ">="
@@ -189,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
192
  version: 1.3.6
190
193
  requirements: []
191
194
  rubyforge_project: trollolo
192
- rubygems_version: 2.6.13
195
+ rubygems_version: 2.5.2.1
193
196
  signing_key:
194
197
  specification_version: 4
195
198
  summary: Trello command line client