pickler 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
-