jira_issues 0.0.5

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0af8344be54c308755deaef573df770550958f08
4
+ data.tar.gz: ce0407b9febb0021dc0d0bbb3e26332ddb80f7ca
5
+ SHA512:
6
+ metadata.gz: '079475baa0fba8868c81fc19b995b87af975d3563b3208c2c66c24f795ce46bacbc747d0119138a53c3cd6b50f0737f0614f9960ab9352e3eebd5697106c81d8'
7
+ data.tar.gz: bc6b091d7ec1e8d7e639dd9b7873c2b1b561cbee88e2561317d7764d5ecf6d424743f45bcaa18340ed5fcb3efce76704d2900e83c53bc93f61e068bbe5a528f5
@@ -0,0 +1,7 @@
1
+ require 'jira_issues/jira_adapter'
2
+ require 'jira_issues/jira_workflow'
3
+ require 'jira_issues/jira_query'
4
+ require 'jira_issues/jira_issues_stats'
5
+ require 'jira_issues/jira_issues_navigator'
6
+ require 'jira_issues/jira_issue_mapper'
7
+ require 'jira_issues/jql_lib'
@@ -0,0 +1,32 @@
1
+ require 'jira-ruby'
2
+
3
+ module JiraIssues
4
+ class JiraAdapter
5
+ def create_task(task)
6
+ issue = client.Issue.build
7
+ issue.save(task.print)
8
+ end
9
+
10
+ def available?
11
+ response = client.get('/')
12
+ response.code == '200'
13
+ end
14
+
15
+ def jql(jql_query, fields)
16
+ client.Issue.jql(jql_query, fields)
17
+ end
18
+
19
+ private
20
+
21
+ def client
22
+ @client = JIRA::Client.new(
23
+ username: ENV['JIRA_USERNAME'],
24
+ password: ENV['JIRA_PASSWORD'],
25
+ site: ENV['JIRA_URL'],
26
+ context_path: '',
27
+ auth_type: :basic,
28
+ read_timeout: 120
29
+ )
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,31 @@
1
+ module JiraIssues
2
+ class JiraIssueMapper
3
+ # WIP
4
+ # ATM mapper serialises issue to JSON
5
+ # We might consider using objects
6
+
7
+ def call(issue)
8
+ status = decode_status(issue)
9
+ {
10
+ key: issue.key,
11
+ type: issue.issuetype.name,
12
+ priority: issue.priority.name,
13
+ status: status,
14
+ #description: i.description,
15
+ summary: issue.summary,
16
+ created_date: issue.created,
17
+ closed_date: issue.resolutiondate
18
+ }
19
+ end
20
+
21
+ private
22
+
23
+ def decode_status(issue)
24
+ JiraIssues::JiraWorkflow.issue_status_for_name(project_key(issue),issue.status.name)
25
+ end
26
+
27
+ def project_key(issue)
28
+ issue.key.split('-').first
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,50 @@
1
+ module JiraIssues
2
+ class JiraIssuesNavigator
3
+ include JiraIssues::JiraIssueStats
4
+
5
+ def initialize(issues)
6
+ @issues = issues
7
+ end
8
+
9
+ def issues
10
+ @issues
11
+ end
12
+
13
+ def all
14
+ JiraIssuesNavigator.new @issues
15
+ end
16
+
17
+ def open
18
+ JiraIssuesNavigator.new @issues.select {|i| i[:status] == JiraWorkflow::OPEN}
19
+ end
20
+
21
+ def blocked
22
+ JiraIssuesNavigator.new @issues.select {|i| i[:status] == JiraWorkflow::BLOCKED}
23
+ end
24
+
25
+ def in_progress
26
+ JiraIssuesNavigator.new @issues.select {|i| i[:status] == JiraWorkflow::IN_PROGRESS}
27
+ end
28
+
29
+ def closed
30
+ JiraIssuesNavigator.new @issues.select {|i| i[:status] == JiraWorkflow::CLOSED}
31
+ end
32
+
33
+ def with_status(status: selected_status)
34
+ JiraIssuesNavigator.new @issues.select {|i| i[:status] == @issue_states[selected_status]}
35
+ end
36
+
37
+ #aliases
38
+ def todo
39
+ open
40
+ end
41
+
42
+ def done
43
+ closed
44
+ end
45
+
46
+ def ip
47
+ in_progress
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,11 @@
1
+ module JiraIssues
2
+ module JiraIssueStats
3
+ def created_by_week
4
+ @issues.map { |i| { key: i[:key], week_created: Date.parse(i[:created_date]).beginning_of_week } }.group_by { |x| x[:week_created] }.map { |k, v| [k, v.count] }.to_h.sort
5
+ end
6
+
7
+ def closed_by_week
8
+ @issues.select { |i| !i[:closed_date].nil? }.map { |i| { key: i[:key], week_closed: Date.parse(i[:closed_date]).beginning_of_week } }.group_by { |x| x[:week_closed]}.map { |k, v| [k, v.count] }.to_h.sort
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ # @author Filip Jakubowski
2
+ module JiraIssues
3
+ class JiraQuery
4
+ # Creates new Query object
5
+ # and sets the maximum number of issues returned by Query
6
+ # @param max_results [Integer] maximum number of issues returned by query
7
+ def initialize(max_results = 1000)
8
+ @query_max_results = max_results
9
+ end
10
+
11
+ # Handles a JQL Request and returns JiraIssueavigator for that query
12
+ # @param query [String]
13
+ # @return [JiraIssueNavigator] with those requests
14
+ def jql_query(query)
15
+ result = adapter.jql(query, fields:[:description, :summary, :created, :status, :issuetype, :priority, :resolutiondate], max_results: @query_max_results)
16
+ JiraIssuesNavigator.new(result.map{|i| JiraIssueMapper.new.call(i) })
17
+ end
18
+
19
+ private
20
+ # Provides adapter that connects to JIRA
21
+ # @return [JiraAdapter] with those requests
22
+ def adapter
23
+ @adapter ||= JiraIssues::JiraAdapter.new
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,32 @@
1
+ #@author Filip Jakubowski
2
+ module JiraIssues
3
+ class JiraWorkflow
4
+ OPEN = 'Open'
5
+ IN_PROGRESS = 'InProgress'
6
+ BLOCKED = 'Blocked'
7
+ CLOSED = 'Closed'
8
+ # This is WIP
9
+ # This class should be able to map and unify:
10
+ # - statuses
11
+ # - workflows
12
+ # - transitions
13
+ # ATM - we will work onlu on defailt issue names
14
+
15
+ def self.issue_status_for_name(project_key, status_name)
16
+ {
17
+ 'Backlog' => OPEN,
18
+ 'Open' => OPEN,
19
+ 'To Do' => OPEN,
20
+ 'Blocked' => BLOCKED,
21
+ 'In Progress' => IN_PROGRESS,
22
+ 'Specification' => IN_PROGRESS,
23
+ 'Done' => CLOSED,
24
+ 'Closed' => CLOSED,
25
+ 'Resolved' => CLOSED,
26
+ }.fetch(status_name)
27
+ rescue KeyError => e
28
+ p "You have issue with custom - if you want mapping to be configurable please contact me #{Gem.loaded_specs["jira_issues"].metadata.fetch('source_code_uri')}"
29
+ raise e
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,11 @@
1
+ module JiraIssues
2
+ class JqlLib
3
+ def self.my_issues
4
+ "assignee = currentUser()"
5
+ end
6
+
7
+ def self.issues_for_user(user)
8
+ "assignee = #{user}"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe JiraIssues do
4
+ it "filter issues" do
5
+ issue_nav = Object.new
6
+ allow(issue_nav).to receive(:jql_query) {
7
+ issues = [
8
+ {:key=>"PR-100", :type=>"Task", :priority=>"Major", :status=>"Open", :summary=>"Clean kitchen", :created_date=>"2017-12-28T13:30:30.000+0000", :closed_date=>"2017-12-28T13:30:30.000+0000"},
9
+ {:key=>"PR-101", :type=>"Task", :priority=>"Major", :status=>"InProgress", :summary=>"Walk a dog", :created_date=>"2017-12-07T15:46:22.000+0000", :closed_date=>nil},
10
+ {:key=>"PR-102", :type=>"Task", :priority=>"Critical", :status=>"Closed", :summary=>"Pack bagpack", :created_date=>"2017-12-21T11:15:38.000+0000", :closed_date=>"2017-12-27T13:45:06.000+0000"},
11
+ {:key=>"PR-102", :type=>"Task", :priority=>"Critical", :status=>"Closed", :summary=>"Pay bills", :created_date=>"2017-12-21T11:15:38.000+0000", :closed_date=>"2017-12-27T13:45:06.000+0000"}
12
+ ]
13
+ JiraIssues::JiraIssuesNavigator.new(issues)
14
+ }
15
+
16
+ jn = issue_nav.jql_query 'project = "Project" and ( created > -40d )'
17
+ expect(jn.done.issues.count).to eq(2)
18
+ expect(jn.open.issues.count).to eq(1)
19
+ expect(jn.in_progress.issues.count).to eq(1)
20
+ expect(jn.open.issues.first[:priority]).to eq("Major")
21
+
22
+ expect(jn.created_by_week.count).to eq(3)
23
+ expect(jn.closed_by_week.count).to eq(1)
24
+ end
25
+
26
+ it "translates workfow steps" do
27
+ expect(JiraIssues::JiraWorkflow.issue_status_for_name('PR','Open')).to eq(JiraIssues::JiraWorkflow::OPEN)
28
+ expect(JiraIssues::JiraWorkflow.issue_status_for_name('PR','In Progress')).to eq(JiraIssues::JiraWorkflow::IN_PROGRESS)
29
+ expect(JiraIssues::JiraWorkflow.issue_status_for_name('PR','Done')).to eq(JiraIssues::JiraWorkflow::CLOSED)
30
+ end
31
+ end
@@ -0,0 +1,11 @@
1
+ require 'rspec'
2
+ require 'jira_issues'
3
+
4
+ require 'coveralls'
5
+ Coveralls.wear!
6
+
7
+ require 'simplecov'
8
+ SimpleCov.start
9
+
10
+ require 'codecov'
11
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jira_issues
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ platform: ruby
6
+ authors:
7
+ - Filip Jakubowski-Drzrwiecki
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-12-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jira-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '12.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '12.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.7'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.7'
55
+ description: Jira Issues gem that supports quering and filtering data for external
56
+ reporting and integrations.
57
+ email:
58
+ - don.o.phelippe@gmail.com
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - lib/jira_issues.rb
64
+ - lib/jira_issues/jira_adapter.rb
65
+ - lib/jira_issues/jira_issue_mapper.rb
66
+ - lib/jira_issues/jira_issues_navigator.rb
67
+ - lib/jira_issues/jira_issues_stats.rb
68
+ - lib/jira_issues/jira_query.rb
69
+ - lib/jira_issues/jira_workflow.rb
70
+ - lib/jira_issues/jql_lib.rb
71
+ - spec/jira_issues_spec.rb
72
+ - spec/spec_helper.rb
73
+ homepage: https://github.com/filipjakubowski
74
+ licenses:
75
+ - MIT
76
+ metadata:
77
+ source_code_uri: https://github.com/filipjakubowski/jira_issues
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project: jira_issues
94
+ rubygems_version: 2.6.14
95
+ signing_key:
96
+ specification_version: 4
97
+ summary: Jira Issues
98
+ test_files: []