gplan 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 43c8051408d4828bfe25d3dffa8b618da215d17d
4
+ data.tar.gz: a06bb0ad26db3c187539255259abf0c3c50a5926
5
+ SHA512:
6
+ metadata.gz: 7a194113296b337a4489607b68d4c6d3563e77e5bec0935dd70934e167c54bc0584c645fa11ec4ca5e237482f645f20653300479b6e022b1dcdb8746cf82569f
7
+ data.tar.gz: fea17a6bce3a35c00ef5379c87ba614e23044d5a3e8131900d663bad35c96f857c2ac34facf51179817186879f36f6995785f61593c8f6d65e93786a1b87defd
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ [![Gem Version](https://badge.fury.io/rb/gplan.svg)](http://badge.fury.io/rb/gplan)
2
+
3
+ ## What is GPlan?
4
+
5
+ GPlan started out as a simple ruby script that parsed out ticket numbers
6
+ from any git log of the current branch compared to its production branch
7
+ and puts together release notes
8
+
9
+ As of right now, it does this by combining Github Pull Requests, Github Issues and Planbox Stories.
10
+
11
+ ## Installation
12
+
13
+ gem install gplan
14
+
15
+ # Create environment variables
16
+
17
+ This will be different on every OS, but for OSX, I did this...
18
+
19
+ sudo echo "
20
+ #for planbox
21
+ export PLANBOX_EMAIL=<EMAIL_ADDRESS>
22
+ export PLANBOX_TOKEN=<PASSWORD>
23
+ export GITHUB_USERNAME=<GITHUB_USERNAME>
24
+ export GITHUB_TOKEN=<GITHUB_TOKEN>" >> /etc/profile
25
+
26
+ # Configure Project
27
+
28
+ For any project you want to use this for, you will need to tell gplan what repository/branch to compare your current branch to. To do this, create a `.gplan` file in the repository's root with `<repo_name>/<branch_name>`. If one isn't set, a default of `production/master` is used.
29
+
30
+ echo "origin/master" > .gplan
31
+
32
+ OR
33
+
34
+ pass in a param that overrides this configuration. ie.. `gplan 98ih2h3583`
35
+
36
+ ## Usage
37
+
38
+ 1. cd to git project
39
+ 2. checkout the branch that you wish to get release notes for
40
+ 3. run `gplan`
41
+ 4. you should now get a list of the pattern
42
+
43
+ ```
44
+ ID:STATUS:TITLE:PROJECT_NAME:PROJECT_ALIAS:PR:TITLE
45
+ ...
46
+ ---- Unmatched PRs ----
47
+ ...
48
+ PR:TITLE
49
+ ```
50
+
51
+ Note: unmatched PRs are github pull requests that doesn't have a matching planbox story
52
+
53
+ ## Tests
54
+
55
+ To run tests:
56
+
57
+ rake test
58
+
59
+ or just
60
+
61
+ rake
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ require "rake/testtask"
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << "test"
5
+ t.test_files = FileList['test/**/*_test.rb']
6
+ t.verbose = true
7
+ # needed for VCR
8
+ ENV['GITHUB_TOKEN'] = '123'
9
+ ENV['GITHUB_USERNAME'] = 'test'
10
+ end
11
+
12
+ task :default => :test
data/bin/gplan CHANGED
@@ -2,109 +2,6 @@
2
2
  #
3
3
  # This script is used to find all of the planbox story numbers from the git log
4
4
 
5
- # This is just a neat way to require everything in the lib path
6
- require 'pathname'
7
- bin_path = Pathname.new(__FILE__).realpath
8
- $:.unshift File.expand_path('../../lib', bin_path)
9
- Dir[bin_path + '../../lib/*.rb'].each {|file| require file }
5
+ require_relative '../lib/gplan'
10
6
 
11
- include Printer
12
-
13
- PB_STORY_REGEX=/\[(?:fixes)? *#*([0-9]*)\]/i
14
- GH_PR_REGEX=/Merge pull request #(\d*)/i
15
-
16
- @repo_overide = ARGV.select{|i| i[/^(?!-)/]}.first
17
- @params = ARGV.select{|i| i[/^-/]}
18
- @PRINT_HTML = @params.include? "-h"
19
-
20
- @gh_release_array = []
21
- @pb_release_array = []
22
- @combined = []
23
-
24
- def combine_results
25
- @pb_release_array.each do |pb_story|
26
- @gh_release_array.each do |gh_pr|
27
- if gh_pr['pb_id'] and gh_pr['pb_id'].to_i == pb_story["id"]
28
- gh_pr.delete('id') # doing this so we don't overide the pb id
29
- pb_story = pb_story.merge gh_pr
30
- @gh_release_array.delete gh_pr
31
- break
32
- end
33
- end
34
- @combined << pb_story
35
- end
36
-
37
- # add the remaining unmatched PRs
38
- @gh_release_array.each do |gh_pr|
39
- @combined << gh_pr
40
- end
41
- end
42
-
43
- # used to pull story numbers from pull request titles
44
- def pull_pb_numbers_from_prs
45
- @gh_release_array.each do |gh_pr|
46
- pb_ids = gh_pr['title'].scan(PB_STORY_REGEX).flatten.uniq
47
- if !pb_ids.empty?
48
- gh_pr.merge!({"pb_id" => pb_ids.first.to_i}) # making an assumption that there is only 1 pb story number
49
- end
50
- end
51
- end
52
-
53
- def pull_dependency(story)
54
- return if story['blocks'].nil?
55
-
56
- # find dependency based on blocks
57
- story['blocks'].each do |block|
58
- if block.match(/(^(#+|\s+)?dependen(t|cy|cies|cys))/i)
59
- return block
60
- end
61
- end
62
-
63
- # else find dependency based on labels
64
- if story['labels'].to_s.match /Has Dependency/i
65
- return "has a dependency label"
66
- end
67
- return nil
68
- end
69
-
70
- def setup_repository
71
- if @repo_overide # allow you to pass in a SHA or remote/branch to target against. This can be useful when generating release notes after a deployment
72
- @target = @repo_overide
73
- else
74
- conf_file =Dir.pwd+"/.gplan"
75
- if File.exists?(conf_file)
76
- File.open(conf_file, "r") do |f|
77
- #target should be repository/branch
78
- @target = f.each_line.first.chomp
79
- end
80
- end
81
- end
82
- # Set the default branch if one is not set
83
- @target = "production/master" unless @target
84
- @repo = @target.split("/").first
85
- begin
86
- `git fetch #{@repo}`
87
- rescue
88
- puts "unable to fetch #{@repo}, checking git log anyways..."
89
- end
90
- end
91
-
92
- # MAIN
93
-
94
- setup_repository
95
- list= `git log #{@target}..`
96
-
97
- pb_story_ids = list.scan(PB_STORY_REGEX).flatten.uniq
98
- gh_pr_ids = list.scan(GH_PR_REGEX).flatten.uniq
99
-
100
- @gh_release_array = Github.new.get_release_notes_array gh_pr_ids
101
- @pb_release_array = Planbox.get_release_notes_array pb_story_ids
102
-
103
- pull_pb_numbers_from_prs
104
- combine_results
105
-
106
- if @PRINT_HTML
107
- Printer.html @combined
108
- else
109
- Printer.print @combined
110
- end
7
+ Gplan.new(ARGV).generate_release_notes
@@ -0,0 +1,161 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.github.com/repos/username/repo/issues/1?access_token=123
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - TheJefe
12
+ Content-Type:
13
+ - application/json
14
+ Accept:
15
+ - application/json
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - GitHub.com
23
+ Date:
24
+ - Sun, 05 Apr 2015 02:55:26 GMT
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Content-Length:
28
+ - '2282'
29
+ Status:
30
+ - 200 OK
31
+ X-Ratelimit-Limit:
32
+ - '5000'
33
+ X-Ratelimit-Remaining:
34
+ - '4984'
35
+ X-Ratelimit-Reset:
36
+ - '1428204696'
37
+ Cache-Control:
38
+ - private, max-age=60, s-maxage=60
39
+ Last-Modified:
40
+ - Fri, 03 Apr 2015 19:40:47 GMT
41
+ Etag:
42
+ - '"a1ab6d6b8c492b97d573ff676b8a2d4a"'
43
+ X-Oauth-Scopes:
44
+ - gist, repo
45
+ X-Accepted-Oauth-Scopes:
46
+ - ''
47
+ Vary:
48
+ - Accept, Authorization, Cookie, X-GitHub-OTP
49
+ - Accept-Encoding
50
+ X-Github-Media-Type:
51
+ - github.v3
52
+ X-Xss-Protection:
53
+ - 1; mode=block
54
+ X-Frame-Options:
55
+ - deny
56
+ Content-Security-Policy:
57
+ - default-src 'none'
58
+ Access-Control-Allow-Credentials:
59
+ - 'true'
60
+ Access-Control-Expose-Headers:
61
+ - ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset,
62
+ X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval
63
+ Access-Control-Allow-Origin:
64
+ - '*'
65
+ X-Github-Request-Id:
66
+ - 62EC2E61:6B93:43993F:5520A41E
67
+ Strict-Transport-Security:
68
+ - max-age=31536000; includeSubdomains; preload
69
+ X-Content-Type-Options:
70
+ - nosniff
71
+ X-Served-By:
72
+ - 7f48e2f7761567e923121f17538d7a6d
73
+ body:
74
+ encoding: UTF-8
75
+ string: '{"url":"https://api.github.com/repos/username/repo/issues/1","labels_url":"https://api.github.com/repos/username/repo/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/username/repo/issues/1/comments","events_url":"https://api.github.com/repos/username/repo/issues/1/events","html_url":"https://github.com/username/repo/pull/1","id":66143574,"number":1,"title":"
76
+ first pull request","user":{"login":"JohnSmith","id":1527103,"avatar_url":"https://avatars.githubusercontent.com/u/1527103?v=3","gravatar_id":"","url":"https://api.github.com/users/JohnSmith","html_url":"https://github.com/JohnSmith","followers_url":"https://api.github.com/users/JohnSmith/followers","following_url":"https://api.github.com/users/JohnSmith/following{/other_user}","gists_url":"https://api.github.com/users/JohnSmith/gists{/gist_id}","starred_url":"https://api.github.com/users/JohnSmith/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JohnSmith/subscriptions","organizations_url":"https://api.github.com/users/JohnSmith/orgs","repos_url":"https://api.github.com/users/JohnSmith/repos","events_url":"https://api.github.com/users/JohnSmith/events{/privacy}","received_events_url":"https://api.github.com/users/JohnSmith/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/username/repo/labels/Has%20Dependency","name":"Has
77
+ Dependency","color":"207de5"},{"url":"https://api.github.com/repos/username/repo/labels/in%20progress","name":"in
78
+ progress","color":"ededed"},{"url":"https://api.github.com/repos/username/repo/labels/WIP","name":"WIP","color":"eb6420"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":0,"created_at":"2015-04-03T13:08:40Z","updated_at":"2015-04-03T13:08:59Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/username/repo/pulls/1","html_url":"https://github.com/username/repo/pull/1","diff_url":"https://github.com/username/repo/pull/1.diff","patch_url":"https://github.com/username/repo/pull/1.patch"},"body":"Depends
79
+ on #2126 ","closed_by":null}'
80
+ http_version:
81
+ recorded_at: Sun, 05 Apr 2015 02:55:26 GMT
82
+ - request:
83
+ method: get
84
+ uri: https://api.github.com/repos/username/repo/issues/2?access_token=123
85
+ body:
86
+ encoding: US-ASCII
87
+ string: ''
88
+ headers:
89
+ User-Agent:
90
+ - TheJefe
91
+ Content-Type:
92
+ - application/json
93
+ Accept:
94
+ - application/json
95
+ response:
96
+ status:
97
+ code: 200
98
+ message: OK
99
+ headers:
100
+ Server:
101
+ - GitHub.com
102
+ Date:
103
+ - Sun, 05 Apr 2015 02:55:27 GMT
104
+ Content-Type:
105
+ - application/json; charset=utf-8
106
+ Content-Length:
107
+ - '2282'
108
+ Status:
109
+ - 200 OK
110
+ X-Ratelimit-Limit:
111
+ - '5000'
112
+ X-Ratelimit-Remaining:
113
+ - '4983'
114
+ X-Ratelimit-Reset:
115
+ - '1428204696'
116
+ Cache-Control:
117
+ - private, max-age=60, s-maxage=60
118
+ Last-Modified:
119
+ - Fri, 03 Apr 2015 19:40:47 GMT
120
+ Etag:
121
+ - '"a1ab6d6b8c492b97d573ff676b8a2d4a"'
122
+ X-Oauth-Scopes:
123
+ - gist, repo
124
+ X-Accepted-Oauth-Scopes:
125
+ - ''
126
+ Vary:
127
+ - Accept, Authorization, Cookie, X-GitHub-OTP
128
+ - Accept-Encoding
129
+ X-Github-Media-Type:
130
+ - github.v3
131
+ X-Xss-Protection:
132
+ - 1; mode=block
133
+ X-Frame-Options:
134
+ - deny
135
+ Content-Security-Policy:
136
+ - default-src 'none'
137
+ Access-Control-Allow-Credentials:
138
+ - 'true'
139
+ Access-Control-Expose-Headers:
140
+ - ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset,
141
+ X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval
142
+ Access-Control-Allow-Origin:
143
+ - '*'
144
+ X-Github-Request-Id:
145
+ - 62EC2E61:6B93:4399A5:5520A41F
146
+ Strict-Transport-Security:
147
+ - max-age=31536000; includeSubdomains; preload
148
+ X-Content-Type-Options:
149
+ - nosniff
150
+ X-Served-By:
151
+ - 5aeb3f30c9e3ef6ef7bcbcddfd9a68f7
152
+ body:
153
+ encoding: UTF-8
154
+ string: '{"url":"https://api.github.com/repos/username/repo/issues/2","labels_url":"https://api.github.com/repos/username/repo/issues/2/labels{/name}","comments_url":"https://api.github.com/repos/username/repo/issues/2/comments","events_url":"https://api.github.com/repos/username/repo/issues/2/events","html_url":"https://github.com/username/repo/pull/2","id":66143574,"number":2,"title":"
155
+ second pull request","user":{"login":"JohnSmith","id":1527103,"avatar_url":"https://avatars.githubusercontent.com/u/1527103?v=3","gravatar_id":"","url":"https://api.github.com/users/JohnSmith","html_url":"https://github.com/JohnSmith","followers_url":"https://api.github.com/users/JohnSmith/followers","following_url":"https://api.github.com/users/JohnSmith/following{/other_user}","gists_url":"https://api.github.com/users/JohnSmith/gists{/gist_id}","starred_url":"https://api.github.com/users/JohnSmith/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JohnSmith/subscriptions","organizations_url":"https://api.github.com/users/JohnSmith/orgs","repos_url":"https://api.github.com/users/JohnSmith/repos","events_url":"https://api.github.com/users/JohnSmith/events{/privacy}","received_events_url":"https://api.github.com/users/JohnSmith/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/username/repo/labels/Has%20Dependency","name":"Has
156
+ Dependency","color":"207de5"},{"url":"https://api.github.com/repos/username/repo/labels/in%20progress","name":"in
157
+ progress","color":"ededed"},{"url":"https://api.github.com/repos/username/repo/labels/WIP","name":"WIP","color":"eb6420"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":0,"created_at":"2015-04-03T13:08:40Z","updated_at":"2015-04-03T13:08:59Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/username/repo/pulls/2","html_url":"https://github.com/username/repo/pull/2","diff_url":"https://github.com/username/repo/pull/2.diff","patch_url":"https://github.com/username/repo/pull/2.patch"},"body":"## Depends
158
+ on #2126 ","closed_by":null}'
159
+ http_version:
160
+ recorded_at: Sun, 05 Apr 2015 02:55:26 GMT
161
+ recorded_with: VCR 2.9.3
data/gplan-0.1.3.gem ADDED
Binary file
data/gplan.gemspec ADDED
@@ -0,0 +1,19 @@
1
+ lib = File.expand_path('../lib/', __FILE__)
2
+ $:.unshift lib unless $:.include?(lib)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'gplan'
6
+ s.version = '0.1.3'
7
+ s.date = '2015-04-05'
8
+ s.authors = ["Jeff Koenig"]
9
+ s.email = 'jkoenig311@gmail.com'
10
+ s.homepage = 'https://github.com/el-jefe-/gplan'
11
+ s.summary = "Creates release notes from the git log and planbox"
12
+ s.description = "Creates release notes from the git log and planbox"
13
+ s.executables = ["gplan"]
14
+ s.files = `git ls-files`.split($\)
15
+ s.require_paths = ['lib']
16
+ s.add_runtime_dependency('httparty', "~> 0.13")
17
+ s.add_runtime_dependency('haml', "~> 4.0.5")
18
+ s.add_runtime_dependency('rake',"~> 10.4.2")
19
+ end
data/lib/gplan.rb ADDED
@@ -0,0 +1,90 @@
1
+ require 'printer'
2
+ require 'github'
3
+ require 'planbox'
4
+
5
+ PB_STORY_REGEX=/\[(?:fixes)? *#*([0-9]*)\]/i
6
+ GH_PR_REGEX=/Merge pull request #(\d*)/i
7
+
8
+ class Gplan
9
+
10
+ def initialize params
11
+ @params = params
12
+ @repo_overide = @params.select{|i| i[/^(?!-)/]}.first
13
+ @PRINT_HTML = @params.include? "-h"
14
+ @gh_release_array = []
15
+ @pb_release_array = []
16
+ @combined = []
17
+ end
18
+
19
+ def generate_release_notes
20
+ setup_repository
21
+ list= `git log #{@target}..`
22
+
23
+ pb_story_ids = list.scan(PB_STORY_REGEX).flatten.uniq
24
+ gh_pr_ids = list.scan(GH_PR_REGEX).flatten.uniq
25
+
26
+ @gh_release_array = Github.new.get_release_notes_array gh_pr_ids
27
+ @pb_release_array = Planbox.get_release_notes_array pb_story_ids
28
+
29
+ pull_pb_numbers_from_prs
30
+ combine_results
31
+
32
+ if @PRINT_HTML
33
+ Printer.new.html @combined
34
+ else
35
+ Printer.new.print @combined
36
+ end
37
+ end
38
+
39
+ def combine_results
40
+ @pb_release_array.each do |pb_story|
41
+ @gh_release_array.each do |gh_pr|
42
+ if gh_pr['pb_id'] and gh_pr['pb_id'].to_i == pb_story["id"]
43
+ gh_pr.delete('id') # doing this so we don't overide the pb id
44
+ pb_story = pb_story.merge gh_pr
45
+ @gh_release_array.delete gh_pr
46
+ break
47
+ end
48
+ end
49
+ @combined << pb_story
50
+ end
51
+
52
+ # add the remaining unmatched PRs
53
+ @gh_release_array.each do |gh_pr|
54
+ @combined << gh_pr
55
+ end
56
+ end
57
+
58
+ # used to pull story numbers from pull request titles
59
+ def pull_pb_numbers_from_prs
60
+ @gh_release_array.each do |gh_pr|
61
+ pb_ids = gh_pr['title'].scan(PB_STORY_REGEX).flatten.uniq
62
+ if !pb_ids.empty?
63
+ gh_pr.merge!({"pb_id" => pb_ids.first.to_i}) # making an assumption that there is only 1 pb story number
64
+ end
65
+ end
66
+ end
67
+
68
+ def setup_repository
69
+ if @repo_overide # allow you to pass in a SHA or remote/branch to target against. This can be useful when generating release notes after a deployment
70
+ @target = @repo_overide
71
+ else
72
+ conf_file =Dir.pwd+"/.gplan"
73
+ if File.exists?(conf_file)
74
+ File.open(conf_file, "r") do |f|
75
+ #target should be repository/branch
76
+ @target = f.each_line.first.chomp
77
+ end
78
+ end
79
+ end
80
+ # Set the default branch if one is not set
81
+ @target = "production/master" unless @target
82
+ @repo = @target.split("/").first
83
+ begin
84
+ `git fetch #{@repo}`
85
+ rescue
86
+ puts "unable to fetch #{@repo}, checking git log anyways..."
87
+ end
88
+ end
89
+
90
+ end
data/lib/printer.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'haml'
2
2
 
3
- module Printer
3
+ class Printer
4
4
 
5
5
  def html stories
6
6
  $stories = stories
@@ -21,7 +21,7 @@ module Printer
21
21
  release_notes += "PR:TITLE\n"
22
22
  end
23
23
 
24
- dependency = pull_dependency(story)
24
+ dependency = get_dependency(story)
25
25
  dependencies << "PR ##{story['number']}: " + dependency unless dependency.nil?
26
26
 
27
27
  line = ""
@@ -39,6 +39,25 @@ module Printer
39
39
  puts release_notes
40
40
  end
41
41
 
42
+ def get_dependency(story)
43
+
44
+ # find dependency based on blocks
45
+ unless story['blocks'].nil?
46
+ story['blocks'].each do |block|
47
+ if block.match(/(^(#+(\s+)?|\s+)?depend(s|ent|ency|encies|encys))/i)
48
+ return block
49
+ end
50
+ end
51
+ end
52
+
53
+ return if story['labels'].nil?
54
+ # else find dependency based on labels
55
+ if story['labels'].to_s.match /Has Dependency/i
56
+ return "has a dependency label"
57
+ end
58
+ return nil
59
+ end
60
+
42
61
  def planbox_info story
43
62
  "#{story['id']}:#{story['status']}:#{story['name']}:#{story['project_name']}:#{story['project_alias']}"
44
63
  end
@@ -23,7 +23,7 @@
23
23
  %td
24
24
  %a{href: story['html_url']}= story['number']
25
25
  %td= story['title']
26
- - block = pull_dependency(story)
26
+ - block = Printer.new.get_dependency(story)
27
27
  - next if block.nil?
28
28
  %td= block
29
29
 
@@ -50,6 +50,6 @@
50
50
  %td
51
51
  %a{href: issue['html_url']}= issue['number']
52
52
  %td= issue['milestone']['title'] if issue['milestone']
53
- - block = pull_dependency(story)
53
+ - block = Printer.new.get_dependency(story)
54
54
  - next if block.nil?
55
55
  %td= block
@@ -0,0 +1,43 @@
1
+ require 'test_helper'
2
+ require 'pry'
3
+
4
+ class ReleaseNotesTest < UnitTest
5
+ describe 'release notes' do
6
+
7
+ before do
8
+ github = Github.new
9
+ @stories = []
10
+ VCR.use_cassette("github_pull_requests") do
11
+ @stories = github.get_release_notes_array [1,2]
12
+ end
13
+ end
14
+
15
+ it 'can be printed to stdout' do
16
+ old_stdout = $stdout
17
+ $stdout = StringIO.new
18
+ Printer.new.print @stories
19
+ output = $stdout.string.split("\n")
20
+ $stdout = old_stdout
21
+ output.count.must_equal 12
22
+ output.last.must_equal "PR #2: Depends on #2126 "
23
+ end
24
+
25
+ it 'can be printed to an html file' do
26
+ output = Printer.new.html @stories
27
+ output.first.must_equal "<h2>Release notes</h2>"
28
+ output.count.must_equal 55
29
+ assert output.to_s.include? "Depends on #2126"
30
+ end
31
+ end
32
+
33
+ # Stubs to fake up repos and outputs
34
+ class Github < Github
35
+ def get_repo_name
36
+ 'username/repo'
37
+ end
38
+ end
39
+
40
+ def File.write file, release_notes
41
+ return release_notes.split("\n")
42
+ end
43
+ end
@@ -0,0 +1,15 @@
1
+ gem 'minitest'
2
+ gem 'vcr'
3
+
4
+ require 'minitest/autorun'
5
+ require 'gplan'
6
+ require 'printer'
7
+ require 'vcr'
8
+
9
+ VCR.configure do |config|
10
+ config.cassette_library_dir = "fixtures/vcr_cassettes"
11
+ config.hook_into :webmock # or :fakeweb
12
+ end
13
+
14
+ class UnitTest < MiniTest::Test
15
+ end
@@ -0,0 +1,81 @@
1
+ require 'test_helper'
2
+
3
+ class DependencyTest < UnitTest
4
+ describe 'dependencies' do
5
+
6
+ describe 'show blocks' do
7
+
8
+ match_words = %w(
9
+ depends
10
+ dependent
11
+ dependency
12
+ dependencies
13
+ dependencys
14
+ )
15
+
16
+ match_words.each do |word|
17
+ it 'starting with the word #{word}' do
18
+ dependency = "#{word}\n"+
19
+ "This is a dependency"
20
+ story = stub_story_with_block dependency
21
+ Printer.new.get_dependency(story).must_equal dependency
22
+ end
23
+ end
24
+
25
+ it 'starting with the word dependent' do
26
+ dependency = "Dependent on\n"+
27
+ "This is a dependency"
28
+ story = stub_story_with_block dependency
29
+ Printer.new.get_dependency(story).must_equal dependency
30
+ end
31
+
32
+ it 'starting with spaces then the word dependent' do
33
+ dependency = " Dependent on\n"+
34
+ "This is a dependency"
35
+ story = stub_story_with_block dependency
36
+ Printer.new.get_dependency(story).must_equal dependency
37
+ end
38
+
39
+ it 'with hashes and spaces at the beginning' do
40
+ dependency = "## Dependency\n"+
41
+ "This is a dependency"
42
+ story = stub_story_with_block dependency
43
+ Printer.new.get_dependency(story).must_equal dependency
44
+ end
45
+
46
+ end
47
+
48
+ describe 'dont show blocks' do
49
+ it 'when dependent is not the first word' do
50
+ dependency = "not Dependent\n"+
51
+ "This is NOT a dependency"
52
+ story = stub_story_with_block dependency
53
+ Printer.new.get_dependency(story).must_equal nil
54
+ end
55
+ end
56
+
57
+ describe 'dependency flag' do
58
+
59
+ it 'shown when no block is found' do
60
+ label = 'Has Dependency'
61
+ story = {
62
+ 'labels' => [ label ]
63
+ }
64
+ Printer.new.get_dependency(story).must_equal "has a dependency label"
65
+ end
66
+
67
+ it 'not shown when a block is found' do
68
+ dependency = "Dependency\n"+
69
+ "This is a dependency"
70
+ label = 'Has Dependency'
71
+ story = stub_story_with_block dependency
72
+ story['labels'] = [ label ]
73
+ Printer.new.get_dependency(story).must_equal dependency
74
+ end
75
+ end
76
+
77
+ def stub_story_with_block dependency
78
+ {'blocks' => [ dependency ]}
79
+ end
80
+ end
81
+ end
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gplan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
5
- prerelease:
4
+ version: 0.1.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jeff Koenig
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2015-03-31 00:00:00.000000000 Z
11
+ date: 2015-04-05 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: httparty
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
21
- version: 0.13.0
19
+ version: '0.13'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
29
- version: 0.13.0
26
+ version: '0.13'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: haml
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,11 +34,24 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
45
40
  version: 4.0.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 10.4.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 10.4.2
46
55
  description: Creates release notes from the git log and planbox
47
56
  email: jkoenig311@gmail.com
48
57
  executables:
@@ -50,35 +59,43 @@ executables:
50
59
  extensions: []
51
60
  extra_rdoc_files: []
52
61
  files:
62
+ - README.md
63
+ - Rakefile
53
64
  - bin/gplan
54
65
  - bin/releasenotes.html
66
+ - fixtures/vcr_cassettes/github_pull_requests.yml
67
+ - gplan-0.1.3.gem
68
+ - gplan.gemspec
55
69
  - lib/github.rb
70
+ - lib/gplan.rb
56
71
  - lib/planbox.rb
57
72
  - lib/printer.rb
58
73
  - templates/template.html.haml
74
+ - test/integration/release_notes_test.rb
75
+ - test/test_helper.rb
76
+ - test/unit/dependency_test.rb
59
77
  homepage: https://github.com/el-jefe-/gplan
60
78
  licenses: []
79
+ metadata: {}
61
80
  post_install_message:
62
81
  rdoc_options: []
63
82
  require_paths:
64
83
  - lib
65
84
  required_ruby_version: !ruby/object:Gem::Requirement
66
- none: false
67
85
  requirements:
68
86
  - - '>='
69
87
  - !ruby/object:Gem::Version
70
88
  version: '0'
71
89
  required_rubygems_version: !ruby/object:Gem::Requirement
72
- none: false
73
90
  requirements:
74
91
  - - '>='
75
92
  - !ruby/object:Gem::Version
76
93
  version: '0'
77
94
  requirements: []
78
95
  rubyforge_project:
79
- rubygems_version: 1.8.28
96
+ rubygems_version: 2.0.14
80
97
  signing_key:
81
- specification_version: 3
98
+ specification_version: 4
82
99
  summary: Creates release notes from the git log and planbox
83
100
  test_files: []
84
101
  has_rdoc: