gplan 0.0.8 → 0.0.9

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.
Files changed (4) hide show
  1. data/bin/gplan +6 -37
  2. data/lib/github.rb +38 -21
  3. data/lib/printer.rb +62 -0
  4. metadata +4 -3
data/bin/gplan CHANGED
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
3
  # This script is used to find all of the planbox story numbers from the git log
4
- # For lesson-player it is dependent on lesson-player being in the directory name for the repo
5
4
 
5
+ # This is just a neat way to require everything in the lib path
6
6
  require 'pathname'
7
7
  bin_path = Pathname.new(__FILE__).realpath
8
8
  $:.unshift File.expand_path('../../lib', bin_path)
9
- require 'planbox'
10
- require 'github'
9
+ Dir[bin_path + '../../lib/*.rb'].each {|file| require file }
10
+
11
+ include Printer
11
12
 
12
13
  PB_STORY_REGEX=/\[(?:fixes)? *#*([0-9]*)\]/i
13
14
  GH_PR_REGEX=/Merge pull request #(\d*)/i
@@ -62,38 +63,6 @@ def pull_dependency(story)
62
63
  return nil
63
64
  end
64
65
 
65
- def print
66
- end_of_pbs = false
67
- release_notes = "ID:STATUS:TITLE:PROJECT_NAME:PROJECT_ALIAS:PR:TITLE\n"
68
- dependencies = []
69
- @combined.each do |story|
70
- if !end_of_pbs and story['name'].nil?
71
- end_of_pbs = true
72
- release_notes += "\n---- Unmatched PRs ----\n\n"
73
- release_notes += "PR:TITLE\n"
74
- end
75
-
76
- dependency = pull_dependency(story)
77
- dependencies << dependency unless dependency.nil?
78
-
79
- line = ""
80
- line += "#{story['id']}:#{story['status']}:#{story['name']}:#{story['project_name']}:#{story['project_alias']}" unless end_of_pbs
81
- line += ":#{story['number']}:#{story['title']}" unless story['number'].nil?
82
- release_notes += line + "\n"
83
- end
84
-
85
- # print dependency blocks
86
- unless dependencies.empty?
87
- release_notes += "\n---- Dependencies ----\n\n"
88
- dependencies.each do |dependency|
89
- release_notes += dependency
90
- release_notes += "\n"
91
- end
92
- end
93
-
94
- puts release_notes
95
- end
96
-
97
66
  def setup_repository
98
67
  if ARGV[0] # allow you to pass in a SHA or remote/branch to target against. This can be useful when generating release notes after a deployment
99
68
  @target = ARGV[0]
@@ -124,9 +93,9 @@ list= `git log #{@target}..`
124
93
  pb_story_ids = list.scan(PB_STORY_REGEX).flatten.uniq
125
94
  gh_pr_ids = list.scan(GH_PR_REGEX).flatten.uniq
126
95
 
127
- @gh_release_array = Github.get_release_notes_array gh_pr_ids
96
+ @gh_release_array = Github.new.get_release_notes_array gh_pr_ids
128
97
  @pb_release_array = Planbox.get_release_notes_array pb_story_ids
129
98
 
130
99
  pull_pb_numbers_from_prs
131
100
  combine_results
132
- print
101
+ Printer.print @combined
data/lib/github.rb CHANGED
@@ -1,62 +1,65 @@
1
1
  require 'httparty'
2
+ require 'pry'
2
3
 
3
4
  GITHUB_USERNAME=ENV['GITHUB_USERNAME']
4
5
  GITHUB_TOKEN=ENV['GITHUB_TOKEN']
5
6
  GITHUB_BASE_URL="https://api.github.com"
6
7
  HEADERS = {:headers => { 'User-Agent' => GITHUB_USERNAME, 'Content-Type' => 'application/json', 'Accept' => 'application/json'}}
7
8
 
8
- module Github
9
- include HTTParty
9
+ class Github
10
10
 
11
- @repo_name
12
- @app_name
13
-
14
- def self.check_environment
11
+ def check_environment
15
12
  if GITHUB_USERNAME == nil || GITHUB_TOKEN == nil
16
13
  raise "environment variables not set. Please check that you have the following set...\
17
14
  \nGITHUB_USERNAME\nGITHUB_TOKEN"
18
15
  end
19
16
  end
20
17
 
21
- def self.set_repo_info
18
+ def get_repo_name
22
19
  cmd = "git remote -v |grep origin"
23
20
  repo_info = `#{cmd}`
24
- @repo_name = repo_info.scan(/\:(.*)\//).uniq.flatten.first
25
- @app_name = repo_info.scan(/\/(.*)\.git/).uniq.flatten.first
21
+ repo_info.scan(/\:(.*\/.*)\.git/).uniq.flatten.first
26
22
  end
27
23
 
28
- def self.get_release_notes gh_pr_ids
24
+ def get_release_notes gh_pr_ids
29
25
  stories = get_release_notes_array gh_pr_ids
30
26
  result_string = format stories
31
27
  end
32
28
 
33
- def self.get_release_notes_array gh_pr_ids
29
+ def get_release_notes_array gh_pr_ids
34
30
  check_environment
35
- set_repo_info
36
- get_stories gh_pr_ids
31
+ repo_name = get_repo_name
32
+ get_stories repo_name, gh_pr_ids
37
33
  end
38
34
 
39
- def self.pulls_url(pr_id)
40
- "#{GITHUB_BASE_URL}/repos/#{@repo_name}/#{@app_name}/issues/#{pr_id}?access_token=#{GITHUB_TOKEN}"
35
+ def pulls_url(repo_name, pr_id)
36
+ "#{GITHUB_BASE_URL}/repos/#{repo_name}/issues/#{pr_id}?access_token=#{GITHUB_TOKEN}"
41
37
  end
42
38
 
43
- def self.get_story(pr_id)
44
- pr = self.get( pulls_url(pr_id), HEADERS ).parsed_response
39
+ def get_story(repo_name, pr_id = false)
40
+ # if story url like "user/repo_name#123"
41
+ unless pr_id
42
+ story = repo_name.split '#'
43
+ repo_name = story[0]
44
+ pr_id = story[1]
45
+ end
46
+ pr = HTTParty.get( pulls_url(repo_name, pr_id), HEADERS ).parsed_response
45
47
  return {"id" => story_id, "name" => "PR not found in github"} if pr.nil? || pr["code"] == "error"
48
+ pr = extract_linked_issues pr
46
49
  pr = extract_blocks pr
47
50
  end
48
51
 
49
- def self.get_stories(array_of_pr_ids)
52
+ def get_stories(repo_name, array_of_pr_ids)
50
53
  stories = []
51
54
  return [] unless array_of_pr_ids
52
55
  array_of_pr_ids.each do |id|
53
- stories<< get_story(id)
56
+ stories<< get_story(repo_name, id)
54
57
  end
55
58
  stories
56
59
  end
57
60
 
58
61
  # used to extract blocks of information from a PR body
59
- def self.extract_blocks(pr)
62
+ def extract_blocks(pr)
60
63
  body = pr['body']
61
64
  blocks = body.scan(/## ?((?:(?!##).)*)/m)
62
65
  return if blocks.nil?
@@ -68,8 +71,22 @@ module Github
68
71
  pr
69
72
  end
70
73
 
74
+ # used to extract linked issues from the description follow githubs linking issue linking matchers
75
+ def extract_linked_issues(pr)
76
+ body = pr['body']
77
+ regex = /(close|close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved)(\s)+((\w*\/\w*)?#(\d+))/im
78
+ linked_issues = body.scan(regex)
79
+ return if linked_issues.nil?
80
+
81
+ pr['linked_issues'] = []
82
+ linked_issues.each do |linked_issue|
83
+ pr['linked_issues'] << get_story(linked_issue[2]) unless linked_issue[2].nil?
84
+ end
85
+ pr
86
+ end
87
+
71
88
  # formats the output of stories
72
- def self.format(stories)
89
+ def format(stories)
73
90
  result_string = ""
74
91
  stories.each do |story|
75
92
  result_string += "#{story['number']}:"
data/lib/printer.rb ADDED
@@ -0,0 +1,62 @@
1
+ module Printer
2
+ def print stories
3
+ end_of_pbs = false
4
+ release_notes = "ID:STATUS:TITLE:PROJECT_NAME:PROJECT_ALIAS:PR:TITLE\n"
5
+ dependencies = []
6
+ stories.each do |story|
7
+ if !end_of_pbs and story['name'].nil?
8
+ end_of_pbs = true
9
+ release_notes += title "Unmatched PRs"
10
+ release_notes += "PR:TITLE\n"
11
+ end
12
+
13
+ dependency = pull_dependency(story)
14
+ dependencies << dependency unless dependency.nil?
15
+
16
+ line = ""
17
+ line += planbox_info story unless end_of_pbs
18
+ line += github_pr_info story unless story['number'].nil?
19
+
20
+ release_notes += line + "\n"
21
+ end
22
+
23
+ # print dependency blocks
24
+ unless dependencies.empty?
25
+ release_notes += include_dependencies dependencies
26
+ end
27
+
28
+ puts release_notes
29
+ end
30
+
31
+ def planbox_info story
32
+ "#{story['id']}:#{story['status']}:#{story['name']}:#{story['project_name']}:#{story['project_alias']}"
33
+ end
34
+
35
+ def github_pr_info story
36
+ line = ":#{story['number']}:#{story['title']}"
37
+ line += github_issue_info story if story['linked_issues']
38
+ line
39
+ end
40
+
41
+ def github_issue_info story
42
+ line = ""
43
+ story['linked_issues'].each do |issue|
44
+ line += ":ISSUE##{issue['number']}"
45
+ line +=":Milestone #{issue['milestone']['title']}" if issue['milestone']['title']
46
+ end
47
+ line
48
+ end
49
+
50
+ def include_dependencies dependencies
51
+ release_notes = title "Dependencies"
52
+ dependencies.each do |dependency|
53
+ release_notes += dependency
54
+ release_notes += "\n"
55
+ end
56
+ release_notes
57
+ end
58
+
59
+ def title text
60
+ "\n---- #{text} ----\n\n"
61
+ end
62
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gplan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
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: 2014-10-03 00:00:00.000000000 Z
12
+ date: 2015-02-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
@@ -37,7 +37,8 @@ files:
37
37
  - bin/gplan
38
38
  - lib/github.rb
39
39
  - lib/planbox.rb
40
- homepage: https://github.com/jkoenig311/gplan
40
+ - lib/printer.rb
41
+ homepage: https://github.com/el-jefe-/gplan
41
42
  licenses: []
42
43
  post_install_message:
43
44
  rdoc_options: []