pivotal-to-trello 0.1.2 → 0.2.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: f4eb4bfc61b49c49a3ff14337f7e2816505de9ba
4
- data.tar.gz: 0867d6cd6f87df13ed5fc67f743a71891ab4551a
3
+ metadata.gz: b07f7cf563cfd39dd77fea8ddea116c13442c800
4
+ data.tar.gz: d1a9f8d00c58de04c1e46bdff752fd32d0c1f482
5
5
  SHA512:
6
- metadata.gz: 5cf3a5598818af37390a4e48c4e8e608fdf411eee2befe6c63eb9af726791ba4cda5703f410a9204b732b64148998353483bf416904e557c0ef3a379c4c28224
7
- data.tar.gz: 3875769ce9abb1ff6babfeb9fcdc24d4fb7c5b14cae104acf0b7416cbc02fceb07f3f1e87bd20996db059145575ebf62e9864da6629d1f2bd71c6c369fb05b4c
6
+ metadata.gz: fe887375672d6a14d4c6ad9d534dd721f5ef1ee7c5d01702212ae05712eba40cbef054d9b3180fb5a2c42e543edc0ca09e9447d21dc3400410e041a1bf80e68e
7
+ data.tar.gz: 2795928fd620bf9243634b596bfd360d358a554bc15b8f522ba8ea46fc6887e985267b216e19dcdcf549609ef76376efbb25a453b480f8f93be8e44bce00d998
data/.rubocop.yml ADDED
@@ -0,0 +1,102 @@
1
+ # See example at https://github.com/bbatsov/rubocop/blob/master/config/default.yml
2
+ AllCops:
3
+ TargetRubyVersion: 2.2
4
+ Exclude:
5
+ - 'Gemfile'
6
+ - 'pivotal-to-trello.gemspec'
7
+
8
+ # Align the elements of a hash literal if they span more than one line.
9
+ AlignHash:
10
+ # Alignment of entries using hash rocket as separator. Valid values are:
11
+ #
12
+ # key - left alignment of keys
13
+ # 'a' => 2
14
+ # 'bb' => 3
15
+ # separator - alignment of hash rockets, keys are right aligned
16
+ # 'a' => 2
17
+ # 'bb' => 3
18
+ # table - left alignment of keys, hash rockets, and values
19
+ # 'a' => 2
20
+ # 'bb' => 3
21
+ EnforcedHashRocketStyle: table
22
+ # Alignment of entries using colon as separator. Valid values are:
23
+ #
24
+ # key - left alignment of keys
25
+ # a: 0
26
+ # bb: 1
27
+ # separator - alignment of colons, keys are right aligned
28
+ # a: 0
29
+ # bb: 1
30
+ # table - left alignment of keys and values
31
+ # a: 0
32
+ # bb: 1
33
+ EnforcedColonStyle: table
34
+
35
+ Documentation:
36
+ Enabled: false
37
+
38
+ EmptyLines:
39
+ Enabled: false
40
+
41
+ Layout/EmptyLinesAroundBlockBody:
42
+ Enabled: false
43
+
44
+ LineLength:
45
+ Max: 180
46
+
47
+ Metrics/AbcSize:
48
+ Enabled: true
49
+ Max: 40
50
+
51
+ Metrics/ClassLength:
52
+ Enabled: false
53
+ CountComments: false
54
+
55
+ Metrics/BlockLength:
56
+ Enabled: false
57
+ CountComments: false
58
+
59
+ Metrics/MethodLength:
60
+ Enabled: true
61
+ CountComments: false
62
+ Max: 25
63
+
64
+ ParameterLists:
65
+ Max: 7
66
+ CountKeywordArgs: true
67
+
68
+ SpaceInsideParens:
69
+ Enabled: false
70
+
71
+ SpaceBeforeFirstArg:
72
+ Enabled: false
73
+
74
+ Style/AndOr:
75
+ Enabled: false
76
+
77
+ Style/BlockComments:
78
+ Enabled: false
79
+
80
+ Style/BlockDelimiters:
81
+ Enabled: false
82
+
83
+ Style/ClassAndModuleChildren:
84
+ Enabled: true
85
+ EnforcedStyle: nested
86
+
87
+ Style/FrozenStringLiteralComment:
88
+ Enabled: false
89
+
90
+ Style/RedundantReturn:
91
+ Enabled: false
92
+
93
+ Style/TrailingCommaInArguments:
94
+ Enabled: true
95
+ EnforcedStyleForMultiline: comma
96
+
97
+ Style/TrailingCommaInLiteral:
98
+ Enabled: true
99
+ EnforcedStyleForMultiline: comma
100
+
101
+ Style/WordArray:
102
+ Enabled: false
data/Dockerfile ADDED
@@ -0,0 +1,24 @@
1
+ FROM ubuntu:14.04
2
+
3
+ MAINTAINER "Dave Perrett" https://github.com/Dockerfile
4
+
5
+ # Dependencies
6
+ RUN apt-get -y update &&\
7
+ apt-get install -y software-properties-common &&\
8
+ apt-add-repository ppa:brightbox/ruby-ng &&\
9
+ apt-get update -q
10
+
11
+ RUN apt-get install -y build-essential zlib1g-dev libxml2-dev \
12
+ ruby2.2 ruby2.2-dev &&\
13
+ gem install bundler --no-rdoc --no-ri
14
+
15
+ # Prepare
16
+ RUN mkdir /app
17
+ COPY . /app
18
+
19
+ # Install lean
20
+ RUN cd /app && bundle install --without development
21
+
22
+ # And run
23
+ WORKDIR /app
24
+ ENTRYPOINT ["bundle", "exec", "/app/bin/pivotal-to-trello"]
data/Gemfile CHANGED
@@ -1,11 +1,12 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
- gem 'highline', '>= 1.6.20'
4
- gem 'ruby-trello', '>= 1.1.0'
5
- gem 'pivotal-tracker', '>= 0.5.12'
3
+ gem 'highline', '~> 1.7.8'
4
+ gem 'ruby-trello', '~> 2.0.0'
5
+ gem 'pivotal-tracker', '~> 0.5.13'
6
6
 
7
7
  group :development do
8
8
  gem 'rspec', '>= 2.14.1'
9
9
  gem 'rdoc', '>= 4.1.1'
10
- gem 'jeweler', '>= 2.0.0'
10
+ gem 'jeweler', '>= 2.3.7'
11
+ gem 'rubocop', '>= 0.49.1'
11
12
  end
data/README.markdown CHANGED
@@ -1,7 +1,7 @@
1
1
  pivotal-to-trello [![Build Status](https://travis-ci.org/recurser/pivotal-to-trello.png?branch=master)](https://travis-ci.org/recurser/pivotal-to-trello)
2
2
  =================
3
3
 
4
- This gem provides a command for exporting a [Pivotal Tracker](https://www.pivotaltracker.com/) project to [Trello](https://trello.com/).
4
+ This repo provides a command for exporting a [Pivotal Tracker](https://www.pivotaltracker.com/) project to [Trello](https://trello.com/). The command is available as a gem or a docker container.
5
5
 
6
6
  Getting started
7
7
  ---------------
@@ -10,6 +10,12 @@ Getting started
10
10
 
11
11
  > gem install pivotal-to-trello
12
12
 
13
+ Or pull the container down using Docker:
14
+
15
+ > docker pull recurser/pivotal-to-trello
16
+
17
+ When using the docker container, substitute every occurance of `pivotal-to-tracker` with `sudo docker run -a -i recurser/pivotal-to-tracker`
18
+
13
19
  2. Run the importer:
14
20
 
15
21
  > pivotal-to-trello import --trello-key TRELLO_API_KEY --trello-token TRELLO_TOKEN --pivotal-token PIVOTAL_TOKEN
@@ -229,6 +235,9 @@ The Pivotal Tracker token can be found at the bottom of your [Pivotal profile pa
229
235
  Change history
230
236
  --------------
231
237
 
238
+ * **Version 0.2.0 (2017-08-10)** : Fix label creation, update gem dependencies, add checklist support (thanks @rikthevik!), add docker support (thanks @kennethkalmer!).
239
+ * **Version 0.1.2 (2014-01-13)** : Update version number in the gemspec.
240
+ * **Version 0.1.1 (2014-01-13)** : Specify gem dependencies.
232
241
  * **Version 0.1.0 (2014-01-13)** : Initial version.
233
242
 
234
243
  Bug Reports
@@ -257,4 +266,4 @@ Dave Perrett :: hello@daveperrett.com :: [@daveperrett](http://twitter.com/davep
257
266
  Copyright
258
267
  ---------
259
268
 
260
- Copyright (c) 2010 Dave Perrett. See [License](https://github.com/recurser/jquery-i18n/blob/master/LICENSE) for details.
269
+ Copyright (c) 2017 Dave Perrett. See [License](https://github.com/recurser/jquery-i18n/blob/master/LICENSE) for details.
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ begin
6
6
  Bundler.setup(:default, :development)
7
7
  rescue Bundler::BundlerError => e
8
8
  $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
9
+ $stderr.puts 'Run `bundle install` to install missing gems'
10
10
  exit e.status_code
11
11
  end
12
12
  require 'rake'
@@ -14,13 +14,13 @@ require 'rake'
14
14
  require 'jeweler'
15
15
  Jeweler::Tasks.new do |gem|
16
16
  # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
- gem.name = "pivotal-to-trello"
18
- gem.license = "MIT"
19
- gem.homepage = "http://github.com/recurser/pivotal-to-trello"
20
- gem.summary = %Q{Pivotal Tracker to Trello exporter}
21
- gem.description = %Q{Pulls stories from Pivotal Tracker and imports them into Trello}
22
- gem.email = "hello@daveperrett.com"
23
- gem.authors = ["Dave Perrett"]
17
+ gem.name = 'pivotal-to-trello'
18
+ gem.license = 'MIT'
19
+ gem.homepage = 'http://github.com/recurser/pivotal-to-trello'
20
+ gem.summary = %(Pivotal Tracker to Trello exporter)
21
+ gem.description = %(Pulls stories from Pivotal Tracker and imports them into Trello)
22
+ gem.email = 'hello@daveperrett.com'
23
+ gem.authors = ['Dave Perrett', 'Erik Frederiksen', 'Kenneth Kalmer']
24
24
  # dependencies defined in Gemfile
25
25
  end
26
26
  Jeweler::RubygemsDotOrgTasks.new
@@ -36,11 +36,11 @@ RSpec::Core::RakeTask.new(:rcov) do |spec|
36
36
  spec.rcov = true
37
37
  end
38
38
 
39
- task :default => :spec
39
+ task default: :spec
40
40
 
41
41
  require 'rdoc/task'
42
42
  Rake::RDocTask.new do |rdoc|
43
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
43
+ version = File.exist?('VERSION') ? File.read('VERSION') : ''
44
44
 
45
45
  rdoc.rdoc_dir = 'rdoc'
46
46
  rdoc.title = "pivotal-to-trello #{version}"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.2.0
@@ -13,4 +13,4 @@ module PivotalToTrello
13
13
  require 'pivotal_to_trello/pivotal_wrapper'
14
14
  require 'pivotal_to_trello/runner'
15
15
  require 'pivotal_to_trello/trello_wrapper'
16
- end
16
+ end
@@ -4,113 +4,121 @@ require 'highline/import'
4
4
  module PivotalToTrello
5
5
  # The core entry point of the gem, which handles the import process.
6
6
  class Core
7
-
8
7
  # Constructor
9
8
  def initialize(options = OpenStruct.new)
10
9
  @options = options
11
10
  end
12
11
 
13
- # Generates a film clip based on the given input audio file, and saves it
14
- # to the given output path.
12
+ # Imports a Pivotal project into Trello.
15
13
  def import!
16
14
  prompt_for_details
17
15
 
18
16
  puts "\nBeginning import..."
19
17
  pivotal.stories(options.pivotal_project_id).each do |story|
20
- list_id = label = nil
21
-
22
- if story.current_state == 'accepted'
23
- list_id = options.accepted_list_id
24
- elsif story.current_state == 'rejected'
25
- list_id = options.rejected_list_id
26
- elsif story.current_state == 'finished'
27
- list_id = options.finished_list_id
28
- elsif story.current_state == 'delivered'
29
- list_id = options.delivered_list_id
30
- elsif story.current_state == 'started'
31
- list_id = options.current_list_id
32
- elsif story.current_state == 'unscheduled'
33
- list_id = options.icebox_list_id
34
- elsif story.current_state == 'unstarted' && story.story_type == 'feature'
35
- list_id = options.feature_list_id
36
- elsif story.current_state == 'unstarted' && story.story_type == 'chore'
37
- list_id = options.chore_list_id
38
- elsif story.current_state == 'unstarted' && story.story_type == 'bug'
39
- list_id = options.bug_list_id
40
- elsif story.current_state == 'unstarted' && story.story_type == 'release'
41
- list_id = options.release_list_id
42
- else
43
- puts "Ignoring story #{story.id} - type is '#{story.story_type}', state is '#{story.current_state}'"
44
- end
45
-
46
- if story.story_type == 'bug' && options.bug_label
47
- label = options.bug_label
48
- elsif story.story_type == 'feature' && options.feature_label
49
- label = options.feature_label
50
- elsif story.story_type == 'chore' && options.chore_label
51
- label = options.chore_label
52
- elsif story.story_type == 'release' && options.release_label
53
- label = options.release_label
54
- end
18
+ list_id = get_list_id(story, options)
19
+ next unless list_id
55
20
 
56
- if list_id
57
- card = trello.create_card(list_id, story)
58
- trello.add_label(card, label) unless label.nil?
59
- end
21
+ card = trello.create_card(list_id, story)
22
+ label_color = get_label_color(story, options)
23
+ trello.add_label(card, story.story_type, label_color) unless label_color.nil?
60
24
  end
61
25
  end
62
26
 
63
27
  # Returns the options struct.
64
- def options
65
- @options
66
- end
28
+ attr_reader :options
67
29
 
68
30
  private
69
31
 
70
- # Prompts the user for details about the imort/export.
71
- def prompt_for_details
72
- options.pivotal_project_id = prompt_selection('Which Pivotal project would you like to export?', pivotal.project_choices)
73
- options.trello_board_id = prompt_selection('Which Trello board would you like to import into?', trello.board_choices)
74
- options.icebox_list_id = prompt_selection("Which Trello list would you like to put 'icebox' stories into?", trello.list_choices(options.trello_board_id))
75
- options.current_list_id = prompt_selection("Which Trello list would you like to put 'current' stories into?", trello.list_choices(options.trello_board_id))
76
- options.finished_list_id = prompt_selection("Which Trello list would you like to put 'finished' stories into?", trello.list_choices(options.trello_board_id))
77
- options.delivered_list_id = prompt_selection("Which Trello list would you like to put 'delivered' stories into?", trello.list_choices(options.trello_board_id))
78
- options.accepted_list_id = prompt_selection("Which Trello list would you like to put 'accepted' stories into?", trello.list_choices(options.trello_board_id))
79
- options.rejected_list_id = prompt_selection("Which Trello list would you like to put 'rejected' stories into?", trello.list_choices(options.trello_board_id))
80
- options.bug_list_id = prompt_selection("Which Trello list would you like to put 'backlog' bugs into?", trello.list_choices(options.trello_board_id))
81
- options.chore_list_id = prompt_selection("Which Trello list would you like to put 'backlog' chores into?", trello.list_choices(options.trello_board_id))
82
- options.feature_list_id = prompt_selection("Which Trello list would you like to put 'backlog' features into?", trello.list_choices(options.trello_board_id))
83
- options.release_list_id = prompt_selection("Which Trello list would you like to put 'backlog' releases into?", trello.list_choices(options.trello_board_id))
84
- options.bug_label = prompt_selection('What color would you like to label bugs with?', trello.label_choices)
85
- options.feature_label = prompt_selection('What color would you like to label features with?', trello.label_choices)
86
- options.chore_label = prompt_selection('What color would you like to label chores with?', trello.label_choices)
87
- options.release_label = prompt_selection('What color would you like to label releases with?', trello.label_choices)
32
+ # Returns the Trello list_id to import the given story into, based on the users input.
33
+ def get_list_id(story, options)
34
+ list_id = nil
35
+
36
+ if story.current_state == 'accepted'
37
+ list_id = options.accepted_list_id
38
+ elsif story.current_state == 'rejected'
39
+ list_id = options.rejected_list_id
40
+ elsif story.current_state == 'finished'
41
+ list_id = options.finished_list_id
42
+ elsif story.current_state == 'delivered'
43
+ list_id = options.delivered_list_id
44
+ elsif story.current_state == 'started'
45
+ list_id = options.current_list_id
46
+ elsif story.current_state == 'unscheduled'
47
+ list_id = options.icebox_list_id
48
+ elsif story.current_state == 'unstarted' && story.story_type == 'feature'
49
+ list_id = options.feature_list_id
50
+ elsif story.current_state == 'unstarted' && story.story_type == 'chore'
51
+ list_id = options.chore_list_id
52
+ elsif story.current_state == 'unstarted' && story.story_type == 'bug'
53
+ list_id = options.bug_list_id
54
+ elsif story.current_state == 'unstarted' && story.story_type == 'release'
55
+ list_id = options.release_list_id
56
+ else
57
+ puts "Ignoring story #{story.id} - type is '#{story.story_type}', state is '#{story.current_state}'"
88
58
  end
89
59
 
90
- # Prompts the user to select an option from the given list of choices.
91
- def prompt_selection(question, choices)
92
- say("\n#{question}")
93
- choose do |menu|
94
- menu.prompt = "Please select an option : "
95
-
96
- choices.each do |key, value|
97
- menu.choice value do
98
- return key
99
- end
100
- end
101
- end
60
+ list_id
61
+ end
102
62
 
63
+ # Returns the Trello label for the given story into, based on the users input.
64
+ def get_label_color(story, options)
65
+ label_color = nil
66
+
67
+ if story.story_type == 'bug' && options.bug_label
68
+ label_color = options.bug_label
69
+ elsif story.story_type == 'feature' && options.feature_label
70
+ label_color = options.feature_label
71
+ elsif story.story_type == 'chore' && options.chore_label
72
+ label_color = options.chore_label
73
+ elsif story.story_type == 'release' && options.release_label
74
+ label_color = options.release_label
103
75
  end
104
76
 
105
- # Returns an instance of the pivotal wrapper.
106
- def pivotal
107
- @pivotal ||= PivotalToTrello::PivotalWrapper.new(options.pivotal_token)
108
- end
77
+ label_color
78
+ end
79
+
80
+ # Prompts the user for details about the import/export.
81
+ def prompt_for_details
82
+ options.pivotal_project_id = prompt_selection('Which Pivotal project would you like to export?', pivotal.project_choices)
83
+ options.trello_board_id = prompt_selection('Which Trello board would you like to import into?', trello.board_choices)
84
+ options.icebox_list_id = prompt_selection("Which Trello list would you like to put 'icebox' stories into?", trello.list_choices(options.trello_board_id))
85
+ options.current_list_id = prompt_selection("Which Trello list would you like to put 'current' stories into?", trello.list_choices(options.trello_board_id))
86
+ options.finished_list_id = prompt_selection("Which Trello list would you like to put 'finished' stories into?", trello.list_choices(options.trello_board_id))
87
+ options.delivered_list_id = prompt_selection("Which Trello list would you like to put 'delivered' stories into?", trello.list_choices(options.trello_board_id))
88
+ options.accepted_list_id = prompt_selection("Which Trello list would you like to put 'accepted' stories into?", trello.list_choices(options.trello_board_id))
89
+ options.rejected_list_id = prompt_selection("Which Trello list would you like to put 'rejected' stories into?", trello.list_choices(options.trello_board_id))
90
+ options.bug_list_id = prompt_selection("Which Trello list would you like to put 'backlog' bugs into?", trello.list_choices(options.trello_board_id))
91
+ options.chore_list_id = prompt_selection("Which Trello list would you like to put 'backlog' chores into?", trello.list_choices(options.trello_board_id))
92
+ options.feature_list_id = prompt_selection("Which Trello list would you like to put 'backlog' features into?", trello.list_choices(options.trello_board_id))
93
+ options.release_list_id = prompt_selection("Which Trello list would you like to put 'backlog' releases into?", trello.list_choices(options.trello_board_id))
94
+ options.bug_label = prompt_selection('What color would you like to label bugs with?', trello.label_choices)
95
+ options.feature_label = prompt_selection('What color would you like to label features with?', trello.label_choices)
96
+ options.chore_label = prompt_selection('What color would you like to label chores with?', trello.label_choices)
97
+ options.release_label = prompt_selection('What color would you like to label releases with?', trello.label_choices)
98
+ end
109
99
 
110
- # Returns an instance of the trello wrapper.
111
- def trello
112
- @trello ||= PivotalToTrello::TrelloWrapper.new(options.trello_key, options.trello_token)
100
+ # Prompts the user to select an option from the given list of choices.
101
+ def prompt_selection(question, choices)
102
+ say("\n#{question}")
103
+ choose do |menu|
104
+ menu.prompt = 'Please select an option : '
105
+
106
+ choices.each do |key, value|
107
+ menu.choice value do
108
+ return key
109
+ end
110
+ end
113
111
  end
112
+ end
114
113
 
114
+ # Returns an instance of the pivotal wrapper.
115
+ def pivotal
116
+ @pivotal ||= PivotalToTrello::PivotalWrapper.new(options.pivotal_token)
117
+ end
118
+
119
+ # Returns an instance of the trello wrapper.
120
+ def trello
121
+ @trello ||= PivotalToTrello::TrelloWrapper.new(options.trello_key, options.trello_token)
122
+ end
115
123
  end
116
- end
124
+ end