pivo_flow 0.3.3 → 0.3.7

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.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # PivoFlow
2
2
 
3
- [![Build Status](https://secure.travis-ci.org/hybridgroup/taskmapper.png?branch=master)](http://travis-ci.org/hybridgroup/taskmapper)
3
+ [![Build Status](https://secure.travis-ci.org/lubieniebieski/pivo_flow.png?branch=master)](http://travis-ci.org/lubieniebieski/pivo_flow)
4
4
 
5
5
  PivoFlow let's you choose the story from Pivotal Tracker you are currently working on. Intended for all the people, who doesn't like feature-branch approach or are "merdżuj - nie pier*ol"-theory enthusiasts.
6
6
 
@@ -55,8 +55,9 @@ This gem installs a `pepare-commit-msg` hook by adding a reference to `pf-prepar
55
55
  * select story
56
56
  * read the story description
57
57
  * accept or back to story selection
58
- * **TODO** `pf info` displaying info about current task, it's comments and all the available data
59
- * **TODO** `pf help`
58
+ * `pf info` displaying info about current task
59
+ * `pf --help` and other options via OptionParser
60
+ * comments and tasks in a single-story view
60
61
 
61
62
  ### 0.2
62
63
 
@@ -6,7 +6,7 @@ module PivoFlow
6
6
  # * installing git hook
7
7
 
8
8
  class Base
9
-
9
+ attr_reader :options
10
10
  # Git repository directory
11
11
  GIT_DIR = '.git'
12
12
  # Keys used by gem in git config, with corresponding questions which are
@@ -21,11 +21,7 @@ module PivoFlow
21
21
  @options = options
22
22
  @current_dir = Dir.pwd
23
23
 
24
- # exit if no git repo found
25
- unless File.directory?(File.join(@current_dir, GIT_DIR))
26
- puts("no GIT (#{GIT_DIR}) directory found")
27
- exit(1)
28
- end
24
+ raise PivoFlow::Errors::NoGitRepoFound, "No git repository found" unless git_directory_present?
29
25
 
30
26
  # paths
31
27
  @git_dir = File.join(@current_dir, GIT_DIR)
@@ -45,11 +41,14 @@ module PivoFlow
45
41
  !File.executable?(@git_hook_path) || !File.read(@git_hook_path).match(/#{@pf_git_hook_name} \$1/)
46
42
  end
47
43
 
44
+ def git_directory_present?
45
+ File.directory?(File.join(@current_dir, GIT_DIR))
46
+ end
47
+
48
48
  # Install git hook
49
49
  # Copy hook to <tt>.git/hooks</tt> directory and add a reference to this
50
50
  # executable file within <tt>prepare-commit-msg</tt> hook (it may be
51
51
  # helpful if user has his custom hooks)
52
-
53
52
  def install_git_hook
54
53
  puts "Installing prepare-commit-msg hook..."
55
54
  hook_path = File.join(File.dirname(__FILE__), '..', '..', 'bin', @pf_git_hook_name)
data/lib/pivo_flow/cli.rb CHANGED
@@ -11,11 +11,18 @@ module PivoFlow
11
11
  puts "\nkkthxbye!"
12
12
  return 0
13
13
  }
14
- return parse_argv(@args)
14
+ begin
15
+ return parse_argv(@args)
16
+ rescue *PivoFlow::Errors.exceptions => e
17
+ puts "[ERROR] #{e}"
18
+ return 1
19
+ end
15
20
  end
16
21
 
17
22
  private
18
23
 
24
+ # available commands
25
+
19
26
  def stories
20
27
  pivotal_object.show_stories
21
28
  end
@@ -46,10 +53,16 @@ module PivoFlow
46
53
  PivoFlow::Base.new.reconfig
47
54
  end
48
55
 
56
+ def info
57
+ pivotal_object.show_info
58
+ end
59
+
49
60
  def version
50
61
  puts PivoFlow::VERSION
51
62
  end
52
63
 
64
+ # additional methods
65
+
53
66
  def pivotal_object
54
67
  @pivotal_object ||= PivoFlow::Pivotal.new(@options)
55
68
  end
@@ -69,6 +82,7 @@ module PivoFlow
69
82
  opts.banner = "Usage: pf <COMMAND> [OPTIONS]\n"
70
83
  opts.separator "Commands"
71
84
  opts.separator " clear: clears STORY_ID from temp file"
85
+ opts.separator " info: shows info about current story"
72
86
  opts.separator " finish [STORY_ID]: finish story on Pivotal"
73
87
  opts.separator " reconfig: clears API_TOKEN and PROJECT_ID from git config"
74
88
  opts.separator " start <STORY_ID>: start a story of given ID"
@@ -87,11 +101,11 @@ module PivoFlow
87
101
  end
88
102
 
89
103
  opts.on("-t <API_TOKEN>", "--token <API_TOKEN>", "Sets Pivotal Tracker API TOKEN") do |api_token|
90
- @options[:api_token] = api_token
104
+ @options["api-token"] = api_token
91
105
  end
92
106
 
93
107
  opts.on("-p <PROJECT_ID>", "--project <PROJECT_ID>", Numeric, "Sets Pivotal Tracker PROJECT_ID") do |project_id|
94
- @options[:project_id] = project_id
108
+ @options["project-id"] = project_id
95
109
  end
96
110
 
97
111
  end
@@ -109,9 +123,11 @@ module PivoFlow
109
123
  stories
110
124
  when "finish"
111
125
  finish args[1]
126
+ when "info"
127
+ info
112
128
  when nil
113
129
  no_method_error
114
- puts opt_parser.summarize
130
+ puts opt_parser.to_s
115
131
  return 1
116
132
  else
117
133
  invalid_method_error
@@ -0,0 +1,11 @@
1
+ module PivoFlow
2
+ module Errors
3
+ exceptions_list = %w[ NoGitRepoFound UnsuccessfulPivotalConnection ]
4
+ exceptions_list.each { |e| const_set(e, Class.new(StandardError)) }
5
+
6
+ def self.exceptions
7
+ self.constants.map { |d| self.const_get(d) }
8
+ end
9
+
10
+ end
11
+ end
@@ -1,22 +1,20 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module PivoFlow
3
3
  class Pivotal < Base
4
-
5
4
  def run
6
5
  @story_id_file_name = ".pivotal_story_id"
7
6
  @story_id_tmp_path = File.join(@current_dir, "/tmp")
8
7
  @story_id_file_path = File.join(@story_id_tmp_path, @story_id_file_name)
9
8
 
10
- return 1 unless @options["api-token"] && @options["project-id"]
11
9
  PivotalTracker::Client.token = @options["api-token"]
12
10
  PivotalTracker::Client.use_ssl = true
13
11
 
14
12
  begin
15
13
  @options[:project] ||= PivotalTracker::Project.find(@options["project-id"])
16
- rescue RestClient::Unauthorized => e
17
- puts "[ERROR] Pivotal Tracker: #{e}\n"
18
- puts "[TIPS] It means that your configuration is wrong. You can reset your settings by running:\npf reconfig"
19
- exit(1)
14
+ rescue Exception => e
15
+ message = "Pivotal Tracker: #{e.message}\n" +
16
+ "[TIPS] It means that your configuration is wrong. You can reset your settings by running:\n\tpf reconfig"
17
+ raise PivoFlow::Errors::UnsuccessfulPivotalConnection, message
20
18
  end
21
19
 
22
20
  end
@@ -58,7 +56,7 @@ module PivoFlow
58
56
 
59
57
  def show_story story_id
60
58
  story = find_story(story_id)
61
- puts story_string(story, true)
59
+ show_info story
62
60
  proceed = ask_question "Do you want to start this story?"
63
61
  accepted_answers = %w[yes y sure ofc jup yep yup ja tak]
64
62
  if accepted_answers.include?(proceed.downcase)
@@ -68,8 +66,17 @@ module PivoFlow
68
66
  end
69
67
  end
70
68
 
69
+ def show_info story=nil
70
+ story = current_story if story.nil?
71
+ puts story_string(story, true)
72
+ puts "\n[TASKS]"
73
+ story.tasks.all.count.zero? ? puts(" no tasks") : print_tasks(story.tasks.all)
74
+ puts "\n[NOTES]"
75
+ story.notes.all.count.zero? ? puts(" no notes") : print_notes(story.notes.all)
76
+ end
77
+
71
78
  def find_story story_id
72
- story = project_stories.find { |p| p.id == story_id }
79
+ story = project_stories.find { |p| p.id == story_id.to_i }
73
80
  story.nil? ? @options[:project].stories.find(story_id) : story
74
81
  end
75
82
 
@@ -82,22 +89,40 @@ module PivoFlow
82
89
  estimate: estimate_points(story),
83
90
  owner: story_owner(story),
84
91
  description: story.description,
85
- labels: story.labels,
92
+ labels: story_labels(story),
86
93
  started: story.current_state == "started" ? "S" : "N"
87
94
  }
88
95
  if long
89
96
  "STORY %{started} %{story_type} [#%{story_id}]
90
- Name: %{name}
91
- Labels: %{labels}
92
- Owned by: %{owner}
97
+ Name: %{name}
98
+ Labels: %{labels}
99
+ Owned by: %{owner}
93
100
  Requested by: %{requested_by}
94
- Description: %{description}
95
- Estimate: %{estimate}" % vars
101
+ Description: %{description}
102
+ Estimate: %{estimate}" % vars
96
103
  else
97
104
  "[#%{story_id}] (%{started}) %{story_type} [%{estimate} pts.] %{owner} %{name}" % vars
98
105
  end
99
106
  end
100
107
 
108
+
109
+ def print_tasks tasks
110
+ tasks.each { |task| puts task_string(task) }
111
+ end
112
+
113
+ def print_notes notes
114
+ notes.each { |note| puts note_string(note) }
115
+ end
116
+
117
+ def note_string note
118
+ "\t[#{note.noted_at.to_time}] (#{note.author}) #{note.text}"
119
+ end
120
+
121
+ def task_string task
122
+ complete = task.complete ? "x" : " "
123
+ "\t[#{complete}] #{task.description}"
124
+ end
125
+
101
126
  def story_type_icon story
102
127
  case story.story_type
103
128
  when "feature" then "☆"
@@ -115,8 +140,12 @@ module PivoFlow
115
140
  story.owned_by.nil? ? "(--)" : "(#{initials(story.owned_by)})"
116
141
  end
117
142
 
143
+ def story_labels story
144
+ story.labels.nil? ? "" : story.labels.split(",").map{ |l| "##{l}" }.join(", ")
145
+ end
146
+
118
147
  def initials name
119
- name.split.map{ |n| n[0]}.join
148
+ name.split.map{ |n| n[0] }.join
120
149
  end
121
150
 
122
151
  def estimate_points story
@@ -1,3 +1,3 @@
1
1
  module PivoFlow
2
- VERSION = "0.3.3"
2
+ VERSION = "0.3.7"
3
3
  end
data/lib/pivo_flow.rb CHANGED
@@ -4,6 +4,7 @@ require 'highline'
4
4
  require 'fileutils'
5
5
  require 'pivotal-tracker'
6
6
 
7
+ require 'pivo_flow/errors'
7
8
  require 'pivo_flow/version'
8
9
  require 'pivo_flow/base'
9
10
  require 'pivo_flow/cli'
data/pivo_flow.gemspec CHANGED
@@ -18,8 +18,11 @@ Gem::Specification.new do |gem|
18
18
  gem.add_runtime_dependency "pivotal-tracker"
19
19
  gem.add_runtime_dependency "grit"
20
20
  gem.add_runtime_dependency "highline"
21
+
21
22
  gem.add_development_dependency "rspec"
22
23
  gem.add_development_dependency "simplecov"
23
24
  gem.add_development_dependency "rake"
25
+ gem.add_development_dependency "vcr"
26
+ gem.add_development_dependency "fakeweb"
24
27
 
25
28
  end
@@ -0,0 +1,84 @@
1
+ require "spec_helper"
2
+ require_relative './../../lib/pivo_flow/errors'
3
+ describe PivoFlow::Base do
4
+
5
+ let(:base) { PivoFlow::Base.new }
6
+
7
+ before do
8
+ PivoFlow::Base.any_instance.stub(:puts)
9
+ stub_git_config
10
+ stub_base_methods(PivoFlow::Base)
11
+ end
12
+
13
+ it "raises exception if it's outside of git repo" do
14
+ PivoFlow::Base.any_instance.stub(:git_directory_present?).and_return(false)
15
+ expect{base}.to raise_error(PivoFlow::Errors::NoGitRepoFound)
16
+ end
17
+
18
+ it "calls hook installation if it's needed" do
19
+ PivoFlow::Base.any_instance.stub(:git_hook_needed?).and_return(true)
20
+ PivoFlow::Base.any_instance.should_receive(:install_git_hook)
21
+ base
22
+ end
23
+
24
+ describe "pre commit hoook" do
25
+
26
+ let(:file_name) { ".git/hooks/prepare-commit-msg" }
27
+ let(:pf_file_name) { ".git/hooks/pf-prepare-commit-msg" }
28
+
29
+ before do
30
+ File.delete file_name if File.exists? file_name
31
+ base
32
+ end
33
+
34
+ it "creates an executable prepare-commit-msg file" do
35
+ base.install_git_hook
36
+ File.executable?(file_name).should be_true
37
+ end
38
+
39
+ it "creates an executable pf-prepare-commit-msg file" do
40
+ File.delete pf_file_name if File.exists? pf_file_name
41
+ base.install_git_hook
42
+ File.executable?(pf_file_name).should be_true
43
+ end
44
+
45
+ end
46
+
47
+ describe "parses git config" do
48
+
49
+ it "and returns project id" do
50
+ base.options["project-id"].should eq "123456"
51
+ end
52
+
53
+ it "and returns api token" do
54
+ base.options["api-token"].should eq "testtesttesttesttesttesttesttest"
55
+ end
56
+
57
+ it "returns user name" do
58
+ base.user_name.should eq "Adam Newman"
59
+ end
60
+
61
+ end
62
+
63
+ describe "adding configuration" do
64
+
65
+ before(:each) do
66
+ stub_git_config({
67
+ 'pivo-flow.api-token' => nil,
68
+ 'pivo-flow.project-id' => nil}
69
+ )
70
+ PivoFlow::Base.any_instance.stub(:git_config_ok?).and_return(false)
71
+
72
+ end
73
+
74
+ PivoFlow::Base::KEYS_AND_QUESTIONS.each do |key, value|
75
+ it "changes #{key} value" do
76
+ PivoFlow::Base.any_instance.stub(:ask_question).and_return(key)
77
+ new_key = key.split(".").last
78
+ base.options[new_key].should eq key
79
+ end
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -60,13 +60,13 @@ describe PivoFlow::Cli do
60
60
  end
61
61
 
62
62
  end
63
-
64
- it "should allow to execute given commands" do
65
- methods = [:stories, :start, :finish, :clear, :reconfig]
66
-
63
+ describe "should allow to run command named" do
64
+ methods = [:stories, :start, :info, :finish, :clear, :reconfig]
67
65
  methods.each do |method|
68
- PivoFlow::Cli.any_instance.stub(method)
69
- PivoFlow::Cli.new(method.to_s).go!.should eq 0
66
+ it "#{method.to_s}" do
67
+ PivoFlow::Cli.any_instance.stub(method)
68
+ PivoFlow::Cli.new(method.to_s).go!.should eq 0
69
+ end
70
70
  end
71
71
  end
72
72
 
@@ -0,0 +1,113 @@
1
+ require "spec_helper"
2
+
3
+ describe PivoFlow::Pivotal do
4
+
5
+ let(:pivotal) { PivoFlow::Pivotal.new }
6
+
7
+ before do
8
+ stub_git_config
9
+
10
+ stub_base_methods(PivoFlow::Pivotal)
11
+ end
12
+
13
+ describe "raises exception" do
14
+ it "when project id is incorrect" do
15
+ VCR.use_cassette(:pivotal_fetch_project_not_found) do
16
+ expect{pivotal.run}.to raise_error(PivoFlow::Errors::UnsuccessfulPivotalConnection)
17
+ end
18
+ end
19
+
20
+ it "when api-token is incorrect (unauthorized)" do
21
+ VCR.use_cassette(:pivotal_fetch_project_unauthorized) do
22
+ expect{pivotal.run}.to raise_error(PivoFlow::Errors::UnsuccessfulPivotalConnection)
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ describe "methods" do
29
+
30
+ before(:each) do
31
+ stub_pivotal_project
32
+ pivotal.run
33
+ end
34
+
35
+ it "fetches with correct id" do
36
+ pivotal.options[:project].id.should eq 123456
37
+ end
38
+
39
+ it "user_stories takes only stories owned by current user" do
40
+ pivotal.user_stories.should eq [@story_feature]
41
+ end
42
+
43
+ it "unasigned_stories takes only stories with no user" do
44
+ pivotal.unasigned_stories.should eq [@story_unassigned]
45
+ end
46
+
47
+ describe "start_story" do
48
+ before(:each) do
49
+ @story_feature.stub_chain(:update, :errors, :count).and_return(0)
50
+ @story_feature.should_receive(:update).with({ current_state: :started, owned_by: pivotal.user_name })
51
+ end
52
+
53
+ it "updates pivotal tracker" do
54
+ pivotal.start_story(@story_feature.id)
55
+ end
56
+
57
+ it "returns true on success" do
58
+ pivotal.start_story(@story_feature.id).should be_true
59
+ end
60
+
61
+ end
62
+
63
+ describe "current_story" do
64
+ before(:each) do
65
+ @users_story1 = PivotalTracker::Story.new(owned_by: pivotal.user_name, current_state: "started")
66
+ @users_story2 = PivotalTracker::Story.new(owned_by: pivotal.user_name, current_state: "started")
67
+ @users_story3 = PivotalTracker::Story.new(owned_by: pivotal.user_name, current_state: "unstarted")
68
+ @users_story4 = PivotalTracker::Story.new(owned_by: pivotal.user_name, current_state: "unstarted")
69
+ end
70
+
71
+
72
+ it "is the first of user's started stories" do
73
+ @project.stub_chain(:stories, :all).and_return([@users_story1, @users_story2])
74
+
75
+ pivotal.current_story.should eq @users_story1
76
+ end
77
+
78
+ it "is the first of user's stories if he has no started stories" do
79
+ @project.stub_chain(:stories, :all).and_return([@users_story3, @users_story4])
80
+
81
+ pivotal.current_story.should eq @users_story3
82
+ end
83
+
84
+ it "is nil if there is no stories assigned to user" do
85
+ @project.stub_chain(:stories, :all).and_return([])
86
+ pivotal.current_story.should be_nil
87
+ end
88
+
89
+ end
90
+
91
+ end
92
+
93
+ end
94
+
95
+ def stub_pivotal_project
96
+ @project = PivotalTracker::Project.new(id: 123456, name: "testproject")
97
+ @story_feature = PivotalTracker::Story.new(
98
+ id: 1,
99
+ url: "http://www.pivotaltracker.com/story/show/1",
100
+ created_at: DateTime.now,
101
+ project_id: 123456,
102
+ name: "story no 1",
103
+ description: "story description",
104
+ story_type: "feature",
105
+ estimate: 3,
106
+ current_state: "started",
107
+ requested_by: "Paul Newman",
108
+ owned_by: "Adam Newman",
109
+ labels: "first,second")
110
+ @story_unassigned = PivotalTracker::Story.new(owned_by: nil)
111
+ @project.stub_chain(:stories, :all).and_return([@story_feature, @story_unassigned])
112
+ PivotalTracker::Project.stub(:find).and_return(@project)
113
+ end
@@ -0,0 +1,69 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://www.pivotaltracker.com/services/v3/projects/123456
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ accept:
11
+ - ! '*/*; q=0.5, application/xml'
12
+ accept-encoding:
13
+ - gzip, deflate
14
+ x-trackertoken:
15
+ - !binary |-
16
+ dGVzdHRlc3R0ZXN0dGVzdHRlc3R0ZXN0dGVzdHRlc3Q=
17
+ content-type:
18
+ - application/xml
19
+ user-agent:
20
+ - Ruby
21
+ response:
22
+ status:
23
+ code: 404
24
+ message: !binary |-
25
+ Tm90IEZvdW5k
26
+ headers:
27
+ !binary "Y29udGVudC10eXBl":
28
+ - !binary |-
29
+ YXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04
30
+ !binary "dHJhbnNmZXItZW5jb2Rpbmc=":
31
+ - !binary |-
32
+ Y2h1bmtlZA==
33
+ !binary "Y29ubmVjdGlvbg==":
34
+ - !binary |-
35
+ Y2xvc2U=
36
+ !binary "c3RhdHVz":
37
+ - !binary |-
38
+ NDA0
39
+ !binary "eC1wb3dlcmVkLWJ5":
40
+ - !binary |-
41
+ UGh1c2lvbiBQYXNzZW5nZXIgKG1vZF9yYWlscy9tb2RfcmFjaykgMy4wLjE0
42
+ !binary "Y2FjaGUtY29udHJvbA==":
43
+ - !binary |-
44
+ bm8tY2FjaGU=
45
+ !binary "c2V0LWNvb2tpZQ==":
46
+ - !binary |-
47
+ dF9zZXNzaW9uPUJBaDdCem9QWlhod2FYSmxjMTloZEVsMU9nbFVhVzFsRFhN
48
+ ZUhJQ1dwbTdzQmpvZlFHMWhjbk5vWVd4ZmQybDBhRjkxZEdOZlkyOWxjbU5w
49
+ YjI1R09nOXpaWE56YVc5dVgybGtJaVUzWVRRNE9EYzRZV1JoTXpCbE4yWTBO
50
+ bVl6TkdSa1lqTmlNRFkyWTJJNU5nJTNEJTNELS1jYzA0MTQ4OTQ4ZDRmNGE2
51
+ ODBhOTcxNjdlMWFjZDEyNjliMzUyMDg3OyBwYXRoPS87IHNlY3VyZTsgSHR0
52
+ cE9ubHk=
53
+ !binary "c2VydmVy":
54
+ - !binary |-
55
+ bmdpbngvMS4yLjIgKyBQaHVzaW9uIFBhc3NlbmdlciAzLjAuMTQgKG1vZF9y
56
+ YWlscy9tb2RfcmFjayk=
57
+ !binary "Y29udGVudC1lbmNvZGluZw==":
58
+ - !binary |-
59
+ Z3ppcA==
60
+ body:
61
+ encoding: ASCII-8BIT
62
+ string: !binary |-
63
+ H4sIAAAAAAAAA7Oxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3VQoNcdO1
64
+ ULK347LJTS0uTkxPtQtKLc4vLUpOVcjLL1FIyy/NS7HRh8lxAQD8+cQBTQAA
65
+ AA==
66
+ http_version: !binary |-
67
+ MS4x
68
+ recorded_at: Sun, 12 Aug 2012 19:59:06 GMT
69
+ recorded_with: VCR 2.2.4
@@ -0,0 +1,50 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://www.pivotaltracker.com/services/v3/projects/123456
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ accept:
11
+ - ! '*/*; q=0.5, application/xml'
12
+ accept-encoding:
13
+ - gzip, deflate
14
+ x-trackertoken:
15
+ - !binary |-
16
+ dGVzdHRlc3R0ZXN0dGVzdHRlc3R0ZXN0dGVzdHRlc3Q=
17
+ content-type:
18
+ - application/xml
19
+ user-agent:
20
+ - Ruby
21
+ response:
22
+ status:
23
+ code: 401
24
+ message: Unauthorized
25
+ headers:
26
+ content-type:
27
+ - text/html; charset=utf-8
28
+ content-length:
29
+ - '15'
30
+ connection:
31
+ - close
32
+ status:
33
+ - '401'
34
+ x-powered-by:
35
+ - Phusion Passenger (mod_rails/mod_rack) 3.0.14
36
+ cache-control:
37
+ - no-cache
38
+ set-cookie:
39
+ - t_session=BAh7BzoPZXhwaXJlc19hdEl1OglUaW1lDXQeHIBq12cCBjofQG1hcnNoYWxfd2l0aF91dGNfY29lcmNpb25GOg9zZXNzaW9uX2lkIiU3MmQyNTA4MGE1OGE2M2JlNmFkMWZlMTY1ZTgzNjdkMg%3D%3D--ed2d695aaf7f6de6f4fdb6f7ce12548268b4a5c6;
40
+ path=/; secure; HttpOnly
41
+ server:
42
+ - nginx/1.2.2 + Phusion Passenger 3.0.14 (mod_rails/mod_rack)
43
+ body:
44
+ encoding: US-ASCII
45
+ string: ! 'Access denied.
46
+
47
+ '
48
+ http_version: '1.1'
49
+ recorded_at: Sun, 12 Aug 2012 20:00:38 GMT
50
+ recorded_with: VCR 2.2.4
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,29 @@
1
1
  require 'simplecov'
2
+
2
3
  SimpleCov.start
3
4
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
5
 
5
6
  require 'pivo_flow'
7
+ require 'vcr'
6
8
  require 'rspec'
7
9
 
10
+ VCR.configure do |c|
11
+ c.hook_into :fakeweb # or :fakeweb
12
+ c.cassette_library_dir = 'spec/pivo_flow/vcr_cassettes'
13
+ end
14
+
15
+ def stub_git_config(options = {})
16
+ git_options = {
17
+ "pivo-flow.api-token" => "testtesttesttesttesttesttesttest",
18
+ "pivo-flow.project-id" => "123456",
19
+ "user.name" => "Adam Newman"
20
+ }.merge options
21
+ Grit::Repo.stub!(:new).and_return mock('Grit::Repo', :config => git_options)
22
+
23
+ end
24
+
25
+ def stub_base_methods(klass)
26
+ klass.any_instance.stub(:git_hook_needed?).and_return(false)
27
+ klass.any_instance.stub(:git_directory_present?).and_return(true)
28
+ klass.any_instance.stub(:git_config_ok?).and_return(true)
29
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pivo_flow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-11 00:00:00.000000000 Z
12
+ date: 2012-08-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pivotal-tracker
@@ -107,6 +107,38 @@ dependencies:
107
107
  - - ! '>='
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: vcr
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: fakeweb
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
110
142
  description: Automated querying for pivotal stories, adding story id to commit message,
111
143
  etc.
112
144
  email:
@@ -129,10 +161,15 @@ files:
129
161
  - lib/pivo_flow.rb
130
162
  - lib/pivo_flow/base.rb
131
163
  - lib/pivo_flow/cli.rb
164
+ - lib/pivo_flow/errors.rb
132
165
  - lib/pivo_flow/pivotal.rb
133
166
  - lib/pivo_flow/version.rb
134
167
  - pivo_flow.gemspec
168
+ - spec/pivo_flow/base_spec.rb
135
169
  - spec/pivo_flow/cli_spec.rb
170
+ - spec/pivo_flow/pivotal_spec.rb
171
+ - spec/pivo_flow/vcr_cassettes/pivotal_fetch_project_not_found.yml
172
+ - spec/pivo_flow/vcr_cassettes/pivotal_fetch_project_unauthorized.yml
136
173
  - spec/spec_helper.rb
137
174
  homepage: https://github.com/lubieniebieski/pivo_flow
138
175
  licenses: []
@@ -159,6 +196,10 @@ signing_key:
159
196
  specification_version: 3
160
197
  summary: Simple pivotal tracker integration for day to day work with git
161
198
  test_files:
199
+ - spec/pivo_flow/base_spec.rb
162
200
  - spec/pivo_flow/cli_spec.rb
201
+ - spec/pivo_flow/pivotal_spec.rb
202
+ - spec/pivo_flow/vcr_cassettes/pivotal_fetch_project_not_found.yml
203
+ - spec/pivo_flow/vcr_cassettes/pivotal_fetch_project_unauthorized.yml
163
204
  - spec/spec_helper.rb
164
205
  has_rdoc: