pickler 0.2.0 → 0.2.1

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.
@@ -28,7 +28,8 @@ feature's body. Keep this in mind when entering stories into Pivotal Tracker.
28
28
  pickler pull
29
29
 
30
30
  Download all well formed stories (basically, any story with "Scenario:" in the
31
- body) to the features/ directory.
31
+ body) that are not in the "unstarted" or "unscheduled" state to the features/
32
+ directory.
32
33
 
33
34
  pickler push
34
35
 
@@ -53,6 +54,12 @@ too).
53
54
 
54
55
  Push a given feature and change its state to finished.
55
56
 
57
+ pickler install-vim-plugin [<directory>]
58
+
59
+ Installs the Vim plugin to <directory>, or ~/.vim/plugin. This plugin
60
+ currently only provides omnicomplete (CTRL-X, CTRL-O) of feature ids in Git
61
+ commit messages.
62
+
56
63
  pickler --help
57
64
 
58
65
  Full list of commands.
@@ -441,6 +441,26 @@ Requires launchy (gem install launchy).
441
441
  end
442
442
  end
443
443
 
444
+ command :install_vim_plugin do
445
+ banner_arguments "[directory]"
446
+ summary "install pickler.vim"
447
+
448
+ process do |*argv|
449
+ source = File.expand_path('../../../plugin/pickler.vim', __FILE__)
450
+ require 'fileutils'
451
+ directory = argv.first ||
452
+ if RUBY_PLATFORM =~ /win/i
453
+ "#{ENV['USERPROFILE']}/vimfiles/plugin"
454
+ else
455
+ File.expand_path('~/.vim/plugin')
456
+ end
457
+ FileUtils.mkdir_p(directory)
458
+ FileUtils.cp(source, directory)
459
+ puts "Installed to #{directory}/pickler.vim."
460
+ puts "Be sure to keep it up to date!"
461
+ end
462
+ end
463
+
444
464
  def initialize(argv)
445
465
  @argv = argv
446
466
  end
@@ -23,7 +23,7 @@ class Pickler
23
23
  end
24
24
 
25
25
  def http
26
- unless @http
26
+ unless defined?(@http)
27
27
  if ssl?
28
28
  require 'net/https'
29
29
  @http = Net::HTTP.new(ADDRESS, Net::HTTP.https_default_port)
@@ -63,10 +63,12 @@ class Pickler
63
63
  end
64
64
 
65
65
  def project(id)
66
- Project.new(self,get_xml("/projects/#{id}")["project"])
66
+ Project.new(self, lambda { get_xml("/projects/#{id}")["project"] }, id)
67
67
  end
68
68
 
69
69
  class Abstract
70
+ attr_reader :attributes
71
+
70
72
  def initialize(attributes = {})
71
73
  @attributes = {}
72
74
  (attributes || {}).each do |k,v|
@@ -81,14 +83,14 @@ class Pickler
81
83
 
82
84
  def self.reader(*methods)
83
85
  methods.each do |method|
84
- define_method(method) { @attributes[method.to_s] }
86
+ define_method(method) { attributes[method.to_s] }
85
87
  end
86
88
  end
87
89
 
88
90
  def self.date_reader(*methods)
89
91
  methods.each do |method|
90
92
  define_method(method) do
91
- value = @attributes[method.to_s]
93
+ value = attributes[method.to_s]
92
94
  value.kind_of?(String) ? Date.parse(value) : value
93
95
  end
94
96
  end
@@ -97,16 +99,16 @@ class Pickler
97
99
  def self.accessor(*methods)
98
100
  reader(*methods)
99
101
  methods.each do |method|
100
- define_method("#{method}=") { |v| @attributes[method.to_s] = v }
102
+ define_method("#{method}=") { |v| attributes[method.to_s] = v }
101
103
  end
102
104
  end
103
105
 
104
106
  def id
105
- id = @attributes['id'] and Integer(id)
107
+ id = attributes['id'] and Integer(id)
106
108
  end
107
109
 
108
110
  def to_xml
109
- Pickler.hash_to_xml(self.class.name.split('::').last.downcase, @attributes)
111
+ Pickler.hash_to_xml(self.class.name.split('::').last.downcase, attributes)
110
112
  end
111
113
 
112
114
  end
@@ -9,15 +9,15 @@ class Pickler
9
9
  end
10
10
 
11
11
  def start
12
- Date.parse(@attributes['start'].to_s)
12
+ Date.parse(attributes['start'].to_s)
13
13
  end
14
14
 
15
15
  def finish
16
- Date.parse(@attributes['finish'].to_s)
16
+ Date.parse(attributes['finish'].to_s)
17
17
  end
18
18
 
19
19
  def number
20
- @attributes['number'].to_i
20
+ attributes['number'].to_i
21
21
  end
22
22
  alias to_i number
23
23
 
@@ -30,7 +30,7 @@ class Pickler
30
30
  end
31
31
 
32
32
  def succ
33
- self.class.new(project, 'number' => number.succ.to_s, 'start' => @attributes['finish'], 'finish' => (finish + (finish - start)))
33
+ self.class.new(project, 'number' => number.succ.to_s, 'start' => attributes['finish'], 'finish' => (finish + (finish - start)))
34
34
  end
35
35
 
36
36
  def inspect
@@ -15,7 +15,7 @@ class Pickler
15
15
  end
16
16
 
17
17
  def to_xml
18
- Pickler.hash_to_xml(:note, @attributes)
18
+ Pickler.hash_to_xml(:note, attributes)
19
19
  end
20
20
 
21
21
  def inspect
@@ -5,13 +5,31 @@ class Pickler
5
5
  attr_reader :tracker
6
6
  reader :point_scale, :week_start_day, :name, :iteration_length
7
7
 
8
- def initialize(tracker, attributes = {})
8
+ def id
9
+ id = @id || attributes['id'] and Integer(id)
10
+ end
11
+
12
+ def attributes
13
+ unless defined?(@attributes)
14
+ self.class.superclass.instance_method(:initialize).bind(self).call(
15
+ @attributes_fetcher.call
16
+ )
17
+ end
18
+ @attributes
19
+ end
20
+
21
+ def initialize(tracker, attributes = {}, id = nil)
9
22
  @tracker = tracker
10
- super(attributes)
23
+ if id
24
+ @attributes_fetcher = attributes
25
+ @id = id
26
+ else
27
+ super(attributes)
28
+ end
11
29
  end
12
30
 
13
31
  def use_https?
14
- @attributes['use_https'].to_s == 'true'
32
+ attributes['use_https'].to_s == 'true'
15
33
  end
16
34
 
17
35
  def story(story_id)
@@ -14,7 +14,7 @@ class Pickler
14
14
  @project = project
15
15
  @labels = []
16
16
  super(attributes)
17
- @iteration = Iteration.new(project, @attributes["iteration"]) if @attributes["iteration"]
17
+ @iteration = Iteration.new(project, attributes["iteration"]) if attributes["iteration"]
18
18
  end
19
19
 
20
20
  def iteration
@@ -129,15 +129,15 @@ class Pickler
129
129
  end
130
130
 
131
131
  def notes
132
- [@attributes["notes"]].flatten.compact.map {|n| Note.new(self,n)}
132
+ [attributes["notes"]].flatten.compact.map {|n| Note.new(self,n)}
133
133
  end
134
134
 
135
135
  def estimate
136
- @attributes["estimate"].to_i < 0 ? nil : @attributes["estimate"]
136
+ attributes["estimate"].to_i < 0 ? nil : @attributes["estimate"]
137
137
  end
138
138
 
139
139
  def estimate=(value)
140
- @attributes["estimate"] = value.nil? ? -1 : value
140
+ attributes["estimate"] = value.nil? ? -1 : value
141
141
  end
142
142
 
143
143
  def suggested_basename(user_override = nil)
@@ -158,10 +158,10 @@ class Pickler
158
158
  end
159
159
 
160
160
  def to_xml(force_labels = true)
161
- hash = @attributes.reject do |k,v|
161
+ hash = attributes.reject do |k,v|
162
162
  !%w(current_state deadline description estimate name owned_by requested_by story_type).include?(k)
163
163
  end
164
- if force_labels || !id || normalize_labels(@attributes["labels"]) != labels
164
+ if force_labels || !id || normalize_labels(attributes["labels"]) != labels
165
165
  hash["labels"] = labels.join(", ")
166
166
  end
167
167
  Pickler.hash_to_xml(:story, hash)
@@ -171,7 +171,7 @@ class Pickler
171
171
  if id
172
172
  response = tracker.request_xml(:delete, "/projects/#{project.id}/stories/#{id}", "")
173
173
  raise Error, response["message"], caller if response["message"]
174
- @attributes["id"] = nil
174
+ attributes["id"] = nil
175
175
  self
176
176
  end
177
177
  end
@@ -1,13 +1,12 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "pickler"
3
- s.version = "0.2.0"
3
+ s.version = "0.2.1"
4
4
 
5
5
  s.summary = "PIvotal traCKer Liaison to cucumbER"
6
6
  s.description = "Synchronize between Cucumber and Pivotal Tracker"
7
7
  s.authors = ["Tim Pope"]
8
- s.email = "ruby@tpope.o"+'org'
8
+ s.email = "ruby@tpope.o"+'rg'
9
9
  s.homepage = "http://github.com/tpope/pickler"
10
- s.default_executable = "pickler"
11
10
  s.executables = ["pickler"]
12
11
  s.files = [
13
12
  "README.rdoc",
@@ -21,9 +20,11 @@ Gem::Specification.new do |s|
21
20
  "lib/pickler/tracker/project.rb",
22
21
  "lib/pickler/tracker/story.rb",
23
22
  "lib/pickler/tracker/iteration.rb",
24
- "lib/pickler/tracker/note.rb"
23
+ "lib/pickler/tracker/note.rb",
24
+ "plugin/pickler.vim",
25
25
  ]
26
26
  s.add_runtime_dependency("crack", [">= 0.1.8"])
27
+ s.add_development_dependency("rake", ["~> 0.9.2"])
27
28
  s.add_development_dependency("rspec", ["~> 2.0.0"])
28
29
  s.add_development_dependency("fakeweb", ["~> 1.3.0"])
29
30
  end
@@ -0,0 +1,26 @@
1
+ " pickler.vim - Pivotal Tracker omnicomplete
2
+ " Maintainer: Tim Pope <http://tpo.pe/>
3
+
4
+ if exists("g:loaded_pickler") || v:version < 700 || &cp
5
+ finish
6
+ endif
7
+ let g:loaded_pickler = 1
8
+
9
+ function! pickler#omnifunc(findstart,base)
10
+ if a:findstart
11
+ let existing = matchstr(getline('.')[0:col('.')-1],'#\d*$')
12
+ return col('.')-1-strlen(existing)
13
+ endif
14
+ let stories = split(system('pickler search --state=started'),"\n")
15
+ return map(stories,'{"word": "#".matchstr(v:val,"^\\d\\+"), "menu": matchstr(v:val,"^\\d\\+\\s*.. . \\zs.*")}')
16
+ endfunction
17
+
18
+ augroup pickler
19
+ autocmd!
20
+ autocmd BufRead *.git/COMMIT_EDITMSG
21
+ \ if filereadable(substitute(expand('<afile>'),'\.git.\w\+$','features/tracker.yml','')) |
22
+ \ setlocal omnifunc=pickler#omnifunc |
23
+ \ endif
24
+ augroup END
25
+
26
+ " vim:set ft=vim sw=2 sts=2:
metadata CHANGED
@@ -1,80 +1,67 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: pickler
3
- version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 2
9
- - 0
10
- version: 0.2.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Tim Pope
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-02-05 00:00:00 -05:00
19
- default_executable: pickler
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2011-08-26 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: crack
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &71238490 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 11
30
- segments:
31
- - 0
32
- - 1
33
- - 8
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
34
21
  version: 0.1.8
35
22
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: rspec
39
23
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *71238490
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &71238200 !ruby/object:Gem::Requirement
41
28
  none: false
42
- requirements:
29
+ requirements:
43
30
  - - ~>
44
- - !ruby/object:Gem::Version
45
- hash: 15
46
- segments:
47
- - 2
48
- - 0
49
- - 0
31
+ - !ruby/object:Gem::Version
32
+ version: 0.9.2
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *71238200
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &71237940 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
50
43
  version: 2.0.0
51
44
  type: :development
52
- version_requirements: *id002
53
- - !ruby/object:Gem::Dependency
54
- name: fakeweb
55
45
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
46
+ version_requirements: *71237940
47
+ - !ruby/object:Gem::Dependency
48
+ name: fakeweb
49
+ requirement: &71237640 !ruby/object:Gem::Requirement
57
50
  none: false
58
- requirements:
51
+ requirements:
59
52
  - - ~>
60
- - !ruby/object:Gem::Version
61
- hash: 27
62
- segments:
63
- - 1
64
- - 3
65
- - 0
53
+ - !ruby/object:Gem::Version
66
54
  version: 1.3.0
67
55
  type: :development
68
- version_requirements: *id003
56
+ prerelease: false
57
+ version_requirements: *71237640
69
58
  description: Synchronize between Cucumber and Pivotal Tracker
70
- email: ruby@tpope.oorg
71
- executables:
59
+ email: ruby@tpope.org
60
+ executables:
72
61
  - pickler
73
62
  extensions: []
74
-
75
63
  extra_rdoc_files: []
76
-
77
- files:
64
+ files:
78
65
  - README.rdoc
79
66
  - MIT-LICENSE
80
67
  - pickler.gemspec
@@ -87,39 +74,29 @@ files:
87
74
  - lib/pickler/tracker/story.rb
88
75
  - lib/pickler/tracker/iteration.rb
89
76
  - lib/pickler/tracker/note.rb
90
- has_rdoc: true
77
+ - plugin/pickler.vim
91
78
  homepage: http://github.com/tpope/pickler
92
79
  licenses: []
93
-
94
80
  post_install_message:
95
81
  rdoc_options: []
96
-
97
- require_paths:
82
+ require_paths:
98
83
  - lib
99
- required_ruby_version: !ruby/object:Gem::Requirement
84
+ required_ruby_version: !ruby/object:Gem::Requirement
100
85
  none: false
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- hash: 3
105
- segments:
106
- - 0
107
- version: "0"
108
- required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
91
  none: false
110
- requirements:
111
- - - ">="
112
- - !ruby/object:Gem::Version
113
- hash: 3
114
- segments:
115
- - 0
116
- version: "0"
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
117
96
  requirements: []
118
-
119
97
  rubyforge_project:
120
- rubygems_version: 1.3.7
98
+ rubygems_version: 1.8.6
121
99
  signing_key:
122
100
  specification_version: 3
123
101
  summary: PIvotal traCKer Liaison to cucumbER
124
102
  test_files: []
125
-