pivotal-github 1.1.3 → 1.1.4
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.
- checksums.yaml +4 -4
 - data/README.md +1 -3
 - data/lib/pivotal-github/story_accept.rb +29 -15
 - data/lib/pivotal-github/version.rb +1 -1
 - data/spec/commands/story_accept_spec.rb +7 -15
 - metadata +1 -1
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 790d9af1927198ccaa10a814e1b55e7ac8297427
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 19ac915287456c91a30b2186738a12a83cc49b7e
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 66d8f52e653b9a08848bbc01937cab720d7a37db2367ea8ee0bb94af683ab7673893c3d890dc768fda4aa9ce6e0ca17aa634b36f4781b46759fcc734e5818372
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: ede4d84d31bc6c87cf7fadf9c151106c9002d8d99322989077cf80e30ce1ed61ee8fb0516bc7f30dba47b00c13d11adcac9b3c43e426779b23e64fcb5dd6c5be
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -132,8 +132,6 @@ As with `git story-merge`, by default `git story-pull-request` exits with a warn 
     | 
|
| 
       132 
132 
     | 
    
         | 
| 
       133 
133 
     | 
    
         
             
            The purpose of `git story-accept` is to accept stories that have been merged into `master`, so by default it works only on the master branch. This requirement can be overridden by the `--override` option.
         
     | 
| 
       134 
134 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
            In order to avoid reading the entire Git log every time it's run, by default `git story-accept` stops immediately after finding a story that has already been accepted. The assumption is that `git story-accept` is run immediately after merging a pull request into a master branch that is always up-to-date, so that there are no delivered but unaccepted stories further down in the log.
         
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
       137 
135 
     | 
    
         
             
            `git story-accept` requires the existence of `.api_token` and `.project_id` files containing the Pivotal Tracker API token and project id, respectively. The user is prompted to create them if they are not present. (They aren't read from the command line using `gets` due to an incompatibility with options passing.)
         
     | 
| 
       138 
136 
     | 
    
         | 
| 
       139 
137 
     | 
    
         
             
            #### Options
         
     | 
| 
         @@ -141,8 +139,8 @@ In order to avoid reading the entire Git log every time it's run, by default `gi 
     | 
|
| 
       141 
139 
     | 
    
         
             
                Usage: git story-accept [options]
         
     | 
| 
       142 
140 
     | 
    
         
             
                    -o, --override                   override master branch requirement
         
     | 
| 
       143 
141 
     | 
    
         
             
                    -q, --quiet                      suppress display of accepted story ids
         
     | 
| 
       144 
     | 
    
         
            -
                    -a, --all                        process all stories (entire log)
         
     | 
| 
       145 
142 
     | 
    
         
             
                    -h, --help                       this usage guide
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
       146 
144 
     | 
    
         
             
            ### story-open
         
     | 
| 
       147 
145 
     | 
    
         | 
| 
       148 
146 
     | 
    
         
             
            The `story-open` command (no `git`) opens the current story in the default browser (OS X–only):
         
     | 
| 
         @@ -16,9 +16,6 @@ class StoryAccept < Command 
     | 
|
| 
       16 
16 
     | 
    
         
             
                  opts.on("-q", "--quiet", "suppress display of accepted story ids") do |opt|
         
     | 
| 
       17 
17 
     | 
    
         
             
                    self.options.quiet = opt
         
     | 
| 
       18 
18 
     | 
    
         
             
                  end
         
     | 
| 
       19 
     | 
    
         
            -
                  opts.on("-a", "--all", "process all stories (entire log)") do |opt|
         
     | 
| 
       20 
     | 
    
         
            -
                    self.options.all = opt
         
     | 
| 
       21 
     | 
    
         
            -
                  end
         
     | 
| 
       22 
19 
     | 
    
         
             
                  opts.on_tail("-h", "--help", "this usage guide") do
         
     | 
| 
       23 
20 
     | 
    
         
             
                    puts opts.to_s; exit 0
         
     | 
| 
       24 
21 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -32,24 +29,38 @@ class StoryAccept < Command 
     | 
|
| 
       32 
29 
     | 
    
         
             
              end
         
     | 
| 
       33 
30 
     | 
    
         | 
| 
       34 
31 
     | 
    
         
             
              # Returns the ids to accept.
         
     | 
| 
       35 
     | 
    
         
            -
              #  
     | 
| 
       36 
     | 
    
         
            -
              #  
     | 
| 
      
 32 
     | 
    
         
            +
              # The stories to accept are the set intersection of the delivered stories
         
     | 
| 
      
 33 
     | 
    
         
            +
              # according to the Git log and according to Pivotal Tracker.
         
     | 
| 
       37 
34 
     | 
    
         
             
              def ids_to_accept
         
     | 
| 
       38 
     | 
    
         
            -
                 
     | 
| 
      
 35 
     | 
    
         
            +
                git_log_delivered_story_ids & pivotal_tracker_delivered_story_ids
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              # Returns the ids of delivered stories according to the Git log.
         
     | 
| 
      
 39 
     | 
    
         
            +
              # These ids are of the form [Delivers #<story id>] or
         
     | 
| 
      
 40 
     | 
    
         
            +
              # [Delivers #<story id> #<another story id>]. The difference is handled
         
     | 
| 
      
 41 
     | 
    
         
            +
              # by the delivered_ids method.
         
     | 
| 
      
 42 
     | 
    
         
            +
              def git_log_delivered_story_ids
         
     | 
| 
      
 43 
     | 
    
         
            +
                delivered_lines = `git log | egrep '\\[Deliver(s|ed) #'`.split("\n").uniq
         
     | 
| 
       39 
44 
     | 
    
         
             
                delivered_lines.inject([]) do |accept, line|
         
     | 
| 
       40 
     | 
    
         
            -
                  delivered_ids(line) 
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
      
 45 
     | 
    
         
            +
                  accept << delivered_ids(line)
         
     | 
| 
      
 46 
     | 
    
         
            +
                end.uniq
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
              # Returns the ids of delivered stories according to Pivotal Tracker.
         
     | 
| 
      
 50 
     | 
    
         
            +
              def pivotal_tracker_delivered_story_ids
         
     | 
| 
      
 51 
     | 
    
         
            +
                data = { 'X-TrackerToken' => api_token,
         
     | 
| 
      
 52 
     | 
    
         
            +
                         'Content-type'   => "application/xml" }
         
     | 
| 
      
 53 
     | 
    
         
            +
                uri = URI.parse("#{project_uri}/stories?filter=state%3Adelivered")
         
     | 
| 
      
 54 
     | 
    
         
            +
                response = Net::HTTP.start(uri.host, uri.port) do |http|
         
     | 
| 
      
 55 
     | 
    
         
            +
                  http.get(uri.path, data)
         
     | 
| 
       46 
56 
     | 
    
         
             
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
                Nokogiri::XML(response.body).css('id').map(&:content)
         
     | 
| 
       47 
58 
     | 
    
         
             
              end
         
     | 
| 
       48 
59 
     | 
    
         | 
| 
       49 
60 
     | 
    
         
             
              # Returns true if a story has already been accepted.
         
     | 
| 
       50 
61 
     | 
    
         
             
              def already_accepted?(story_id)
         
     | 
| 
       51 
62 
     | 
    
         
             
                data = { 'X-TrackerToken' => api_token,
         
     | 
| 
       52 
     | 
    
         
            -
                         'Content-type' 
     | 
| 
      
 63 
     | 
    
         
            +
                         'Content-type'   => "application/xml" }
         
     | 
| 
       53 
64 
     | 
    
         
             
                uri = story_uri(story_id)
         
     | 
| 
       54 
65 
     | 
    
         
             
                response = Net::HTTP.start(uri.host, uri.port) do |http|
         
     | 
| 
       55 
66 
     | 
    
         
             
                  http.get(uri.path, data)
         
     | 
| 
         @@ -122,8 +133,11 @@ class StoryAccept < Command 
     | 
|
| 
       122 
133 
     | 
    
         
             
                  'http://www.pivotaltracker.com/services/v3'
         
     | 
| 
       123 
134 
     | 
    
         
             
                end
         
     | 
| 
       124 
135 
     | 
    
         | 
| 
      
 136 
     | 
    
         
            +
                def project_uri
         
     | 
| 
      
 137 
     | 
    
         
            +
                  URI.parse("#{api_base}/projects/#{project_id}")
         
     | 
| 
      
 138 
     | 
    
         
            +
                end
         
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
       125 
140 
     | 
    
         
             
                def story_uri(story_id)
         
     | 
| 
       126 
     | 
    
         
            -
                   
     | 
| 
       127 
     | 
    
         
            -
                  URI.parse(uri)
         
     | 
| 
      
 141 
     | 
    
         
            +
                  URI.parse("#{project_uri}/stories/#{story_id}")
         
     | 
| 
       128 
142 
     | 
    
         
             
                end
         
     | 
| 
       129 
143 
     | 
    
         
             
            end
         
     | 
| 
         @@ -5,7 +5,10 @@ describe StoryAccept do 
     | 
|
| 
       5 
5 
     | 
    
         
             
              let(:command) { StoryAccept.new(['-o', '-a']) }
         
     | 
| 
       6 
6 
     | 
    
         
             
              before do
         
     | 
| 
       7 
7 
     | 
    
         
             
                command.stub(:story_branch).and_return('62831853-tau-manifesto')
         
     | 
| 
       8 
     | 
    
         
            -
                command.stub(: 
     | 
| 
      
 8 
     | 
    
         
            +
                command.stub(:git_log_delivered_story_ids).
         
     | 
| 
      
 9 
     | 
    
         
            +
                        and_return(%w[51204529 51106181 50566167 50566179 60566178])
         
     | 
| 
      
 10 
     | 
    
         
            +
                command.stub(:pivotal_tracker_delivered_story_ids).
         
     | 
| 
      
 11 
     | 
    
         
            +
                        and_return(%w[51204529 51106181 50566167 50566178])
         
     | 
| 
       9 
12 
     | 
    
         
             
              end
         
     | 
| 
       10 
13 
     | 
    
         
             
              subject { command }
         
     | 
| 
       11 
14 
     | 
    
         | 
| 
         @@ -19,6 +22,9 @@ describe StoryAccept do 
     | 
|
| 
       19 
22 
     | 
    
         
             
                it { should include("51204529") }
         
     | 
| 
       20 
23 
     | 
    
         
             
                it { should include("51106181") }
         
     | 
| 
       21 
24 
     | 
    
         
             
                it { should include("50566167") }
         
     | 
| 
      
 25 
     | 
    
         
            +
                it { should_not include("50566178") }
         
     | 
| 
      
 26 
     | 
    
         
            +
                it { should_not include("50566178") }
         
     | 
| 
      
 27 
     | 
    
         
            +
                it { should_not include("60566178") }
         
     | 
| 
       22 
28 
     | 
    
         | 
| 
       23 
29 
     | 
    
         
             
                it "should not have duplicate ids" do
         
     | 
| 
       24 
30 
     | 
    
         
             
                  expect(ids).to eq ids.uniq
         
     | 
| 
         @@ -39,18 +45,4 @@ describe StoryAccept do 
     | 
|
| 
       39 
45 
     | 
    
         
             
                  command.run!
         
     | 
| 
       40 
46 
     | 
    
         
             
                end
         
     | 
| 
       41 
47 
     | 
    
         
             
              end
         
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
              describe "when stopping upon reading the first accepted id" do
         
     | 
| 
       44 
     | 
    
         
            -
                let(:command) { StoryAccept.new(['-o']) }
         
     | 
| 
       45 
     | 
    
         
            -
                before do
         
     | 
| 
       46 
     | 
    
         
            -
                  command.stub(:story_branch).and_return('62831853-tau-manifesto')
         
     | 
| 
       47 
     | 
    
         
            -
                  command.stub(:already_accepted?).and_return(false)
         
     | 
| 
       48 
     | 
    
         
            -
                  command.stub(:already_accepted?).with("50566167").and_return(true)
         
     | 
| 
       49 
     | 
    
         
            -
                end
         
     | 
| 
       50 
     | 
    
         
            -
                subject { command }
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                its(:ids_to_accept) { should include("51204529") }
         
     | 
| 
       53 
     | 
    
         
            -
                its(:ids_to_accept) { should include("51106181") }
         
     | 
| 
       54 
     | 
    
         
            -
                its(:ids_to_accept) { should_not include("50566167") }
         
     | 
| 
       55 
     | 
    
         
            -
              end
         
     | 
| 
       56 
48 
     | 
    
         
             
            end
         
     |