ora-dev-tools 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ module JIRADiff
2
+ PROGRAM_NAME = "JIRADiff"
3
+ VERSION = "0.2.3"
4
+ end
@@ -0,0 +1,68 @@
1
+ require "devtools"
2
+
3
+ module JIRADiff
4
+ class OptParse
5
+
6
+ def self.default_options
7
+ {
8
+ debug: false,
9
+ directory: ".",
10
+ dryrun: false,
11
+ master: "master",
12
+ source: [],
13
+ verbose: true
14
+ }
15
+ end
16
+
17
+ def self.parse(argv_opts = [], unit_testing = false)
18
+ opt_parse = DevTools::OptParse.new({ name: PROGRAM_NAME,
19
+ version: VERSION,
20
+ testing: unit_testing,
21
+ defaults: default_options })
22
+
23
+ parser = opt_parse.parser
24
+
25
+ parser.banner = "Usage: #{DevTools::PROGRAM} [OPTIONS]"
26
+
27
+ parser.separator ""
28
+ parser.separator "[OPTIONS]"
29
+
30
+ parser.separator ""
31
+ parser.separator "Specific Options:"
32
+
33
+ parser.on("-d", "--directory DIR", "Use DIR as our source directory") do |dir|
34
+ dir = File.expand_path(dir.strip)
35
+ if Dir.exist?(dir)
36
+ Options.directory = dir
37
+ else
38
+ raise ArgumentError, "ENOEXIST: Directory does not exist -> #{dir}"
39
+ end
40
+ end
41
+
42
+ parser.on("-m", "--master BRANCH", "Specify a master branch (default: master)") { |m| Options.master = m }
43
+ parser.on("-s", "--source BRANCH",
44
+ "Use BRANCH as the source to compare against (may be used more than once)") do |branch|
45
+ Options.source << branch unless Options.source.include?(branch)
46
+ end
47
+
48
+ parser.separator ""
49
+ parser.separator "Common Options:"
50
+
51
+ parser.parse!(argv_opts)
52
+
53
+ validate_options(Options)
54
+ end
55
+
56
+ def self.validate_options(opts)
57
+ if opts.source.include?(opts.master)
58
+ raise RuntimeError, "Source branches cannot include the master branch"
59
+ end
60
+
61
+ opts.source = ["develop"] if opts.source.empty?
62
+ opts.master = "master" if opts.master.nil? || opts.master.strip == ""
63
+
64
+ opts
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,122 @@
1
+ require 'jira_diff/story'
2
+ require 'jira_diff/git'
3
+
4
+ module JIRADiff
5
+ class Stories
6
+
7
+ def initialize(opts = Options.defaults)
8
+ @branches = _get_branches(opts[:master], opts[:source])
9
+ @directory = opts[:directory] || '.'
10
+ @includes = _get_includes(opts.includes)
11
+ @options = opts
12
+ @stories = opts[:stories] || {}
13
+
14
+ _get_stories if @stories == {}
15
+ end
16
+
17
+ attr_accessor :branches, :directory
18
+ attr_reader :stories, :includes
19
+
20
+ alias dir directory
21
+
22
+ def each
23
+ @stories.values.each do |stories|
24
+ stories.each { |story| yield story }
25
+ end
26
+ end
27
+
28
+ def source
29
+ @branches[1, @branches.size]
30
+ end
31
+
32
+ def add_include(story)
33
+ @includes << story
34
+ end
35
+
36
+ def includes=(file)
37
+ @includes = _get_includes(file)
38
+ end
39
+
40
+ def master
41
+ @branches[0]
42
+ end
43
+
44
+ def master=(new_master)
45
+ @stories[master] = []
46
+ @branches[0] = new_master
47
+ _get_stories(new_master)
48
+ end
49
+
50
+ def shas
51
+ source.map do |branch|
52
+ stories[branch].map { |s| s.sha }
53
+ end.flatten.reverse
54
+ end
55
+
56
+ def source_stories
57
+ story_index = {}
58
+
59
+ source.each do |branch|
60
+ stories[branch].each { |s| story_index[s.sha] = s }
61
+ end
62
+
63
+ story_index.values
64
+ end
65
+
66
+ def add_story(branch, story)
67
+ (@stories[branch] ||= []).push story
68
+ end
69
+
70
+ def find(branch, sha)
71
+ raise ArgumentError, "Invalid environment #{branch}" unless @branches.include?(branch)
72
+
73
+ @stories[branch].each { |story| return true if story.sha == sha }
74
+
75
+ false
76
+ end
77
+
78
+ def diff
79
+ stories = []
80
+ opts = @options
81
+
82
+ source_stories.each do |story|
83
+ stories << story unless find(master, story.sha)
84
+ end
85
+
86
+ opts.source = ['diff']
87
+ opts.stories = {'diff' => stories.flatten}
88
+ Stories.new opts
89
+ end
90
+
91
+ private
92
+
93
+ def _get_branches(master, sources)
94
+ branches = [] << (master.nil? ? 'master' : master)
95
+ branches << (sources.empty? ? ['develop'] : sources)
96
+ branches.flatten
97
+ end
98
+
99
+ def _get_includes(includes_file)
100
+ lines = []
101
+ if includes_file && File.exist?(includes_file)
102
+ File.open(includes_file, 'r') do |f|
103
+ f.each_line { |line| lines << $1 if line =~ /(\w+\-\d+)/ }
104
+ end
105
+ end
106
+ lines
107
+ end
108
+
109
+ def _get_stories(branches = @branches)
110
+ git = Git.new(@directory)
111
+
112
+ branches.to_a.each do |branch|
113
+ puts "checking #{branch}" if @options.debug
114
+ git.log(branch).each do |line|
115
+ add_story branch, Story.new(line)
116
+ end
117
+ end
118
+ end
119
+
120
+ end
121
+ end
122
+
@@ -0,0 +1,53 @@
1
+ module JIRADiff
2
+
3
+ class Story
4
+ def initialize( story )
5
+ unless story =~ /\S+|\S+/
6
+ raise ArgumentError, "story must follow 'SHA|description' format"
7
+ end
8
+
9
+ @sha, @description = story.split('|')
10
+
11
+ raise ArgumentError if @sha.nil? || @description.nil?
12
+ end
13
+ attr_reader :sha
14
+
15
+ def split_story( description = @description )
16
+ raise RuntimeError 'description cannot be blank' unless description
17
+
18
+ stories = []
19
+ story_pattern = /\[?(((SRMPRT|OSMCLOUD)\-\d+)|NO-JIRA)\]?[,:\-\s]+\s*(.*)$/
20
+ line = description.match(story_pattern)
21
+
22
+ if line.nil? # did not find a JIRA ticket pattern
23
+ stories.push 'NO-JIRA'
24
+ desc = description.strip
25
+ else
26
+ stories.push line.captures[0]
27
+ desc = line.captures[3].strip
28
+ end
29
+
30
+ # Perform recursion if there are multiple tickets in the description
31
+ if desc =~ story_pattern
32
+ new_story, new_desc = split_story desc
33
+ stories.push new_story
34
+ desc = new_desc
35
+ end
36
+
37
+ [stories.flatten, desc]
38
+ end
39
+
40
+ def tickets
41
+ (split_story)[0]
42
+ end
43
+
44
+ def desc
45
+ (split_story)[1]
46
+ end
47
+
48
+ def to_s
49
+ '[%07.07s] %s - %s' % [sha, tickets.join(', '), desc]
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,4 @@
1
+ require "devtools"
2
+ require "pr_list/globals"
3
+ require "pr_list/options"
4
+ require "pr_list/pull_requests"
@@ -0,0 +1,6 @@
1
+ module DevTools
2
+ module PRlist
3
+ IDENT = "PRlist"
4
+ VERSION = "0.1.0"
5
+ end
6
+ end
@@ -0,0 +1,55 @@
1
+
2
+ module DevTools
3
+ module PRlist
4
+ class OptParse
5
+
6
+ def self.default_options
7
+ {
8
+ markdown: false,
9
+ queue: false
10
+ }
11
+ end
12
+
13
+ def self.validate_options
14
+ raise RuntimeError, "Missing configuration file" if Options.nil?
15
+ raise RuntimeError, "Missing authentication token" if Options.token.nil?
16
+ raise RuntimeError, "No repositories provided" if Options.repos.empty?
17
+ end
18
+
19
+ def self.parse(argv_opts = [], unit_testing = false)
20
+ opt_parse = DevTools::OptParse.new({ name: IDENT,
21
+ version: VERSION,
22
+ defaults: default_options,
23
+ testing: unit_testing })
24
+
25
+ parser = opt_parse.parser
26
+
27
+ parser.banner = "Usage: #{DevTools::PROGRAM} [OPTIONS]"
28
+
29
+ parser.separator ""
30
+ parser.separator "[OPTIONS]"
31
+
32
+ parser.on "-m", "--markdown", "Outputs in markdown friendly format" do
33
+ Options.markdown = true
34
+ end
35
+
36
+ parser.on "--[no-]queue", "filters PRs into a queue list for QA (default)" do |opt|
37
+ Options.queue = opt
38
+ end
39
+
40
+ parser.separator ""
41
+ parser.separator "Common Options:"
42
+
43
+ parser.parse!(argv_opts)
44
+
45
+ validate_options unless unit_testing
46
+
47
+ Options
48
+ end
49
+
50
+ def self.label_values
51
+ Options.labels.keys.map { |k| Options.labels[k] }.flatten.compact
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,87 @@
1
+ require "octokit"
2
+
3
+ module DevTools
4
+ module PRlist
5
+ class PullRequest
6
+ attr_reader :issue
7
+
8
+ def method_missing(method_sym, *arguments, &block)
9
+ @issue.respond_to?(method_sym) ? @issue.send(method_sym, *arguments, &block) : super
10
+ end
11
+
12
+ def respond_to_missing?(method_name, include_private = false)
13
+ @issue.respond_to?(method_name.to_sym) || super
14
+ end
15
+
16
+ def initialize(issue)
17
+ @issue ||= issue
18
+ end
19
+
20
+ def date
21
+ @issue.created_at
22
+ end
23
+
24
+ def has_label?(filter_by)
25
+ labels.any? { |label| [filter_by].flatten.map{ |l| l.downcase.strip }.include?(label.downcase.strip) }
26
+ end
27
+
28
+ def labels
29
+ @issue.labels.map { |l| l.name }
30
+ end
31
+
32
+ def repo(opt = {})
33
+ opt[:short] = false unless opt.has_key?(:short)
34
+
35
+ /repos\/(\w*\/?(.*))$/.match(@issue.repository_url)[opt[:short] ? 2 : 1]
36
+ end
37
+ end
38
+
39
+ class PullRequests
40
+ attr_reader :pulls
41
+
42
+ def initialize(token = nil, repos = [])
43
+ @pulls ||= []
44
+ @github ||= __authenticate token
45
+
46
+ repos.each { |repo| load!(repo) } if authorized?
47
+ end
48
+
49
+ def authorized?
50
+ return !@github.nil?
51
+ end
52
+
53
+ def auth!(token)
54
+ @github = __authenticate token
55
+ end
56
+
57
+ def load!(repo)
58
+ raise NoAuthError, "You must authorized with github using #auth first" unless authorized?
59
+
60
+ @github.issues(repo).each do |issue|
61
+ __load_issue issue if issue.pull_request?
62
+ end
63
+ end
64
+
65
+ def by_date
66
+ sorted_pulls = @pulls.sort_by { |pr| pr.date }
67
+
68
+ block_given? ? sorted_pulls.each { |pr| yield pr } : sorted_pulls
69
+ end
70
+
71
+ def repos
72
+ @pulls.collect { |pr| pr.repo }.uniq
73
+ end
74
+
75
+ private
76
+
77
+ def __load_issue(issue)
78
+ @pulls.push PullRequest.new issue
79
+ end
80
+
81
+ def __authenticate(token)
82
+ token ? Octokit::Client.new(access_token: token) : nil
83
+ end
84
+
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,3 @@
1
+ require "devtools"
2
+ require "runtest/globals"
3
+ require "runtest/options"
@@ -0,0 +1,4 @@
1
+ module RunTest
2
+ PROGRAM_NAME = "RunTest"
3
+ VERSION = "1.2.2"
4
+ end
@@ -0,0 +1,100 @@
1
+ module RunTest
2
+ class OptParse
3
+ def self.default_options
4
+ {
5
+ basedir: "src/js",
6
+ changed: false,
7
+ commands: Config::Options.new,
8
+ jest: true,
9
+ mocha: true,
10
+ verbose: 0
11
+ }
12
+ end
13
+
14
+ #
15
+ # Return a structure describing the Options.
16
+ #
17
+ def self.parse(args, unit_testing=false)
18
+ # The Options specified on the command line will be collected in *Options*.
19
+ # We set default values here.
20
+ opt_parse = DevTools::OptParse.new({ name: PROGRAM_NAME,
21
+ version: VERSION,
22
+ defaults: default_options,
23
+ testing: unit_testing })
24
+
25
+ opt_parse.default_options(Options.commands, {
26
+ diff: "git diff --name-only develop src/js | egrep \".js$\"",
27
+ jest: "$(npm bin)/jest",
28
+ jest_full: "npm run test:jest",
29
+ mocha: "$(npm bin)/mocha --require src/js/util/test-dom.js --compilers js:babel-core/register",
30
+ mocha_full: "npm run test:mocha"
31
+ })
32
+
33
+ parser = opt_parse.parser
34
+
35
+ parser.banner = "Usage: #{DevTools::PROGRAM} [OPTIONS] [PATTERN]"
36
+ parser.banner += "\n\nWhere [PATTERN] is any full or partial filename."
37
+ parser.banner += " All tests matching this filename pattern will be run."
38
+
39
+ parser.separator ""
40
+ parser.separator "[OPTIONS]"
41
+
42
+ parser.separator ""
43
+ parser.separator "Specific Options:"
44
+
45
+ # Base directory
46
+ parser.on("-b", "--basedir DIR", "Specify the base directory to search for tests (DEFAULT: '#{Options.basedir}')") do |dir|
47
+ Options.basedir = dir
48
+ end
49
+
50
+ # Changed switch
51
+ parser.on("-c", "--changed", "Run specs for any files that have recently been modified") do
52
+ Options.changed = true
53
+ end
54
+
55
+ parser.separator ""
56
+ parser.separator "Test Runners:"
57
+
58
+ parser.on("-j", "--[no-]jest", "Only/Don't run Jest tests") do |jest|
59
+ Options.jest = true; Options.mocha = false
60
+ (Options.jest = false; Options.mocha = true) unless jest
61
+ end
62
+
63
+ parser.on("-m", "--[no-]mocha", "Only/Don't run Mocha tests") do |mocha|
64
+ Options.jest = false; Options.mocha = true
65
+ (Options.jest = true; Options.mocha = false) unless mocha
66
+ end
67
+
68
+ parser.separator ""
69
+ parser.separator "Test Commands:"
70
+
71
+ parser.on("--diff-cmd CMD", "Overwrite git diff command: '#{Options.commands.diff}'") do |cmd|
72
+ Options.commands.diff = cmd
73
+ end
74
+
75
+ parser.on("--jest-cmd CMD", "Overwrite Jest command: '#{Options.commands.jest}'") do |cmd|
76
+ Options.commands.jest = cmd
77
+ end
78
+
79
+ parser.on("--jest-full-cmd CMD", "Overwrite Jest full-suite command: '#{Options.commands.jest_full}'") do |cmd|
80
+ Options.commands.jest_full = cmd
81
+ end
82
+
83
+ parser.on("--mocha-cmd CMD", "Overwrite Mocha command: '#{Options.commands.mocha}'") do |cmd|
84
+ Options.commands.mocha = cmd
85
+ end
86
+
87
+ parser.on("--mocha-full-cmd CMD", "Overwrite Mocha command: '#{Options.commands.mocha_full}'") do |cmd|
88
+ Options.commands.mocha_full = cmd
89
+ end
90
+
91
+ parser.separator ""
92
+ parser.separator "Common Options:"
93
+
94
+ parser.parse!(args)
95
+
96
+ return Options
97
+ end
98
+ end # class OptParse
99
+ end # module RunTest
100
+