jira-ruby 2.2.0 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/CI.yml +28 -0
- data/.github/workflows/codeql.yml +100 -0
- data/.github/workflows/rubocop.yml +18 -0
- data/.rubocop.yml +188 -0
- data/Gemfile +11 -3
- data/Guardfile +2 -0
- data/README.md +121 -20
- data/Rakefile +4 -5
- data/jira-ruby.gemspec +11 -17
- data/lib/jira/base.rb +37 -28
- data/lib/jira/base_factory.rb +4 -1
- data/lib/jira/client.rb +65 -46
- data/lib/jira/has_many_proxy.rb +4 -2
- data/lib/jira/http_client.rb +18 -13
- data/lib/jira/http_error.rb +4 -0
- data/lib/jira/jwt_client.rb +18 -42
- data/lib/jira/oauth_client.rb +6 -3
- data/lib/jira/railtie.rb +2 -0
- data/lib/jira/request_client.rb +5 -1
- data/lib/jira/resource/agile.rb +7 -9
- data/lib/jira/resource/applinks.rb +5 -3
- data/lib/jira/resource/attachment.rb +43 -3
- data/lib/jira/resource/board.rb +5 -3
- data/lib/jira/resource/board_configuration.rb +2 -0
- data/lib/jira/resource/comment.rb +2 -0
- data/lib/jira/resource/component.rb +2 -0
- data/lib/jira/resource/createmeta.rb +3 -1
- data/lib/jira/resource/field.rb +9 -4
- data/lib/jira/resource/filter.rb +2 -0
- data/lib/jira/resource/issue.rb +35 -44
- data/lib/jira/resource/issue_picker_suggestions.rb +4 -1
- data/lib/jira/resource/issue_picker_suggestions_issue.rb +2 -0
- data/lib/jira/resource/issuelink.rb +2 -0
- data/lib/jira/resource/issuelinktype.rb +2 -0
- data/lib/jira/resource/issuetype.rb +2 -0
- data/lib/jira/resource/priority.rb +2 -0
- data/lib/jira/resource/project.rb +4 -2
- data/lib/jira/resource/rapidview.rb +5 -3
- data/lib/jira/resource/remotelink.rb +2 -0
- data/lib/jira/resource/resolution.rb +2 -0
- data/lib/jira/resource/serverinfo.rb +2 -0
- data/lib/jira/resource/sprint.rb +14 -23
- data/lib/jira/resource/status.rb +7 -1
- data/lib/jira/resource/status_category.rb +10 -0
- data/lib/jira/resource/suggested_issue.rb +2 -0
- data/lib/jira/resource/transition.rb +2 -0
- data/lib/jira/resource/user.rb +3 -1
- data/lib/jira/resource/version.rb +2 -0
- data/lib/jira/resource/watcher.rb +2 -1
- data/lib/jira/resource/webhook.rb +4 -2
- data/lib/jira/resource/worklog.rb +3 -2
- data/lib/jira/version.rb +3 -1
- data/lib/jira-ruby.rb +5 -3
- data/lib/tasks/generate.rake +4 -2
- data/spec/data/files/short.txt +1 -0
- data/spec/integration/attachment_spec.rb +3 -3
- data/spec/integration/comment_spec.rb +8 -8
- data/spec/integration/component_spec.rb +7 -7
- data/spec/integration/field_spec.rb +3 -3
- data/spec/integration/issue_spec.rb +20 -16
- data/spec/integration/issuelinktype_spec.rb +3 -3
- data/spec/integration/issuetype_spec.rb +3 -3
- data/spec/integration/priority_spec.rb +3 -3
- data/spec/integration/project_spec.rb +7 -7
- data/spec/integration/rapidview_spec.rb +9 -9
- data/spec/integration/resolution_spec.rb +3 -3
- data/spec/integration/status_category_spec.rb +20 -0
- data/spec/integration/status_spec.rb +4 -8
- data/spec/integration/transition_spec.rb +2 -2
- data/spec/integration/user_spec.rb +22 -8
- data/spec/integration/version_spec.rb +7 -7
- data/spec/integration/watcher_spec.rb +17 -18
- data/spec/integration/webhook.rb +5 -4
- data/spec/integration/worklog_spec.rb +8 -8
- data/spec/jira/base_factory_spec.rb +2 -1
- data/spec/jira/base_spec.rb +55 -41
- data/spec/jira/client_spec.rb +48 -34
- data/spec/jira/has_many_proxy_spec.rb +3 -3
- data/spec/jira/http_client_spec.rb +98 -26
- data/spec/jira/http_error_spec.rb +2 -2
- data/spec/jira/oauth_client_spec.rb +30 -8
- data/spec/jira/request_client_spec.rb +4 -4
- data/spec/jira/resource/agile_spec.rb +28 -28
- data/spec/jira/resource/attachment_spec.rb +142 -52
- data/spec/jira/resource/board_spec.rb +21 -20
- data/spec/jira/resource/createmeta_spec.rb +48 -48
- data/spec/jira/resource/field_spec.rb +30 -12
- data/spec/jira/resource/filter_spec.rb +4 -4
- data/spec/jira/resource/issue_picker_suggestions_spec.rb +18 -18
- data/spec/jira/resource/issue_spec.rb +44 -38
- data/spec/jira/resource/jira_picker_suggestions_issue_spec.rb +3 -3
- data/spec/jira/resource/project_factory_spec.rb +3 -2
- data/spec/jira/resource/project_spec.rb +16 -16
- data/spec/jira/resource/sprint_spec.rb +70 -3
- data/spec/jira/resource/status_spec.rb +21 -0
- data/spec/jira/resource/user_factory_spec.rb +4 -4
- data/spec/jira/resource/worklog_spec.rb +3 -3
- data/spec/mock_responses/sprint/1.json +13 -0
- data/spec/mock_responses/status/1.json +8 -1
- data/spec/mock_responses/status.json +40 -5
- data/spec/mock_responses/statuscategory/1.json +7 -0
- data/spec/mock_responses/statuscategory.json +30 -0
- data/spec/mock_responses/{user_username=admin.json → user_accountId=1234567890abcdef01234567.json} +2 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/support/clients_helper.rb +3 -5
- data/spec/support/shared_examples/integration.rb +25 -28
- metadata +25 -257
- data/.travis.yml +0 -9
- data/example.rb +0 -232
- data/http-basic-example.rb +0 -113
- data/lib/jira/resource/sprint_report.rb +0 -8
- data/lib/jira/tasks.rb +0 -0
- data/spec/jira/jwt_uri_builder_spec.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce094c983bd1fe30eb23f7aa69fe2d1098e72d483e048a8195b7c1cdbbd61525
|
4
|
+
data.tar.gz: 25c34ab3ef66571e69e7a6ba48d53f640dfcd4366b92365493e7adbf28b81862
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 363e629f6830f245fc2a64e337dc1a8eecff9899721467e1cf8fb150e30ed23ab93ef7469ab1eaadfa8e6d600512b33bdeedb6a0510aff66fdaad3c94fe470fb
|
7
|
+
data.tar.gz: d04851879ce041793922c0d26f645f672246af8ab061f26daba8df7666a264db7ed60636fd8dcacce9256c721b227a8561d871b1b87b292a1871295ec77398a4
|
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
name: Bug report
|
3
|
+
about: Create a report to help us improve
|
4
|
+
title: ''
|
5
|
+
labels: Bug
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
**Describe the bug**
|
11
|
+
A clear and concise description of what the bug is.
|
12
|
+
|
13
|
+
**To Reproduce**
|
14
|
+
A runnable code example to reproduce the issue.
|
15
|
+
|
16
|
+
**Expected behavior**
|
17
|
+
A clear and concise description of what you expected to happen.
|
18
|
+
|
19
|
+
**Additional context**
|
20
|
+
Add any other context about the problem here.
|
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
name: Feature request
|
3
|
+
about: Suggest an idea for this project
|
4
|
+
title: ''
|
5
|
+
labels: Feature
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
**Is your feature request related to a problem? Please describe.**
|
11
|
+
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
12
|
+
|
13
|
+
**Describe the solution you'd like**
|
14
|
+
A clear and concise description of what you want to happen.
|
15
|
+
|
16
|
+
**Describe alternatives you've considered**
|
17
|
+
A clear and concise description of any alternative solutions or features you've considered.
|
18
|
+
|
19
|
+
**Additional context**
|
20
|
+
Add any other context about the feature request here.
|
@@ -0,0 +1,28 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
name: CI-tests
|
8
|
+
runs-on: ubuntu-latest
|
9
|
+
strategy:
|
10
|
+
fail-fast: false
|
11
|
+
matrix:
|
12
|
+
ruby:
|
13
|
+
- '3.3'
|
14
|
+
- '3.2'
|
15
|
+
- '3.1'
|
16
|
+
steps:
|
17
|
+
- uses: actions/checkout@v4
|
18
|
+
|
19
|
+
- name: Set up Ruby
|
20
|
+
uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: ${{ matrix.ruby }}
|
23
|
+
bundler-cache: true
|
24
|
+
|
25
|
+
- name: Run tests
|
26
|
+
run: |
|
27
|
+
bundle exec rake jira:generate_public_cert
|
28
|
+
bundle exec rake spec
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# For most projects, this workflow file will not need changing; you simply need
|
2
|
+
# to commit it to your repository.
|
3
|
+
#
|
4
|
+
# You may wish to alter this file to override the set of languages analyzed,
|
5
|
+
# or to provide custom queries or build logic.
|
6
|
+
#
|
7
|
+
# ******** NOTE ********
|
8
|
+
# We have attempted to detect the languages in your repository. Please check
|
9
|
+
# the `language` matrix defined below to confirm you have the correct set of
|
10
|
+
# supported CodeQL languages.
|
11
|
+
#
|
12
|
+
name: "CodeQL"
|
13
|
+
|
14
|
+
on:
|
15
|
+
push:
|
16
|
+
branches: [ "master" ]
|
17
|
+
paths-ignore:
|
18
|
+
- '**/*.md'
|
19
|
+
- 'http-basic-example.rb'
|
20
|
+
- 'example.rb'
|
21
|
+
pull_request:
|
22
|
+
branches: [ "master" ]
|
23
|
+
paths-ignore:
|
24
|
+
- '**/*.md'
|
25
|
+
- 'http-basic-example.rb'
|
26
|
+
- 'example.rb'
|
27
|
+
schedule:
|
28
|
+
- cron: '0 13 * * *'
|
29
|
+
|
30
|
+
jobs:
|
31
|
+
analyze:
|
32
|
+
name: Analyze (${{ matrix.language }})
|
33
|
+
# Runner size impacts CodeQL analysis time. To learn more, please see:
|
34
|
+
# - https://gh.io/recommended-hardware-resources-for-running-codeql
|
35
|
+
# - https://gh.io/supported-runners-and-hardware-resources
|
36
|
+
# - https://gh.io/using-larger-runners (GitHub.com only)
|
37
|
+
# Consider using larger runners or machines with greater resources for possible analysis time improvements.
|
38
|
+
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
|
39
|
+
timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}
|
40
|
+
permissions:
|
41
|
+
# required for all workflows
|
42
|
+
security-events: write
|
43
|
+
|
44
|
+
# required to fetch internal or private CodeQL packs
|
45
|
+
packages: read
|
46
|
+
|
47
|
+
# only required for workflows in private repositories
|
48
|
+
actions: read
|
49
|
+
contents: read
|
50
|
+
|
51
|
+
strategy:
|
52
|
+
fail-fast: false
|
53
|
+
matrix:
|
54
|
+
include:
|
55
|
+
- language: ruby
|
56
|
+
build-mode: none
|
57
|
+
# CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'
|
58
|
+
# Use `c-cpp` to analyze code written in C, C++ or both
|
59
|
+
# Use 'java-kotlin' to analyze code written in Java, Kotlin or both
|
60
|
+
# Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
|
61
|
+
# To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
|
62
|
+
# see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
|
63
|
+
# If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
|
64
|
+
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
|
65
|
+
steps:
|
66
|
+
- name: Checkout repository
|
67
|
+
uses: actions/checkout@v4
|
68
|
+
|
69
|
+
# Initializes the CodeQL tools for scanning.
|
70
|
+
- name: Initialize CodeQL
|
71
|
+
uses: github/codeql-action/init@v3
|
72
|
+
with:
|
73
|
+
languages: ${{ matrix.language }}
|
74
|
+
build-mode: ${{ matrix.build-mode }}
|
75
|
+
# If you wish to specify custom queries, you can do so here or in a config file.
|
76
|
+
# By default, queries listed here will override any specified in a config file.
|
77
|
+
# Prefix the list here with "+" to use these queries and those in the config file.
|
78
|
+
|
79
|
+
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
80
|
+
# queries: security-extended,security-and-quality
|
81
|
+
|
82
|
+
# If the analyze step fails for one of the languages you are analyzing with
|
83
|
+
# "We were unable to automatically build your code", modify the matrix above
|
84
|
+
# to set the build mode to "manual" for that language. Then modify this step
|
85
|
+
# to build your code.
|
86
|
+
# ℹ️ Command-line programs to run using the OS shell.
|
87
|
+
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
88
|
+
- if: matrix.build-mode == 'manual'
|
89
|
+
run: |
|
90
|
+
echo 'If you are using a "manual" build mode for one or more of the' \
|
91
|
+
'languages you are analyzing, replace this with the commands to build' \
|
92
|
+
'your code, for example:'
|
93
|
+
echo ' make bootstrap'
|
94
|
+
echo ' make release'
|
95
|
+
exit 1
|
96
|
+
|
97
|
+
- name: Perform CodeQL Analysis
|
98
|
+
uses: github/codeql-action/analyze@v3
|
99
|
+
with:
|
100
|
+
category: "/language:${{matrix.language}}"
|
@@ -0,0 +1,18 @@
|
|
1
|
+
name: Rubocop
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
rubocop:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
|
9
|
+
steps:
|
10
|
+
- uses: actions/checkout@v4
|
11
|
+
- name: Set up Ruby
|
12
|
+
uses: ruby/setup-ruby@v1
|
13
|
+
with:
|
14
|
+
ruby-version: '3.1'
|
15
|
+
bundler-cache: true
|
16
|
+
- name: Run rubocop
|
17
|
+
run: |
|
18
|
+
bundle exec rubocop --format github
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-rspec
|
3
|
+
|
4
|
+
AllCops:
|
5
|
+
Exclude:
|
6
|
+
- 'example.rb'
|
7
|
+
- 'http-basic-example.rb'
|
8
|
+
- 'vendor/**/*'
|
9
|
+
NewCops: enable
|
10
|
+
TargetRubyVersion: 3.1
|
11
|
+
|
12
|
+
Naming/FileName:
|
13
|
+
Exclude:
|
14
|
+
- 'lib/jira-ruby.rb'
|
15
|
+
|
16
|
+
Naming/MethodName:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
Style/Documentation:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
Style/FrozenStringLiteralComment:
|
23
|
+
Exclude:
|
24
|
+
- 'spec/**/*'
|
25
|
+
|
26
|
+
##
|
27
|
+
# Temporarily Disable
|
28
|
+
#
|
29
|
+
# We are going to disable these and fix in pull requests
|
30
|
+
##
|
31
|
+
Layout/ClosingHeredocIndentation:
|
32
|
+
Enabled: false
|
33
|
+
|
34
|
+
Layout/EmptyLineAfterGuardClause:
|
35
|
+
Enabled: false
|
36
|
+
|
37
|
+
Layout/EmptyLinesAroundMethodBody:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
Layout/HashAlignment:
|
41
|
+
Enabled: false
|
42
|
+
|
43
|
+
Layout/LineLength:
|
44
|
+
Enabled: false
|
45
|
+
|
46
|
+
Lint/ConstantDefinitionInBlock:
|
47
|
+
Enabled: false
|
48
|
+
|
49
|
+
Lint/EmptyClass:
|
50
|
+
Enabled: false
|
51
|
+
|
52
|
+
Lint/IneffectiveAccessModifier:
|
53
|
+
Enabled: false
|
54
|
+
|
55
|
+
Lint/MissingSuper:
|
56
|
+
Enabled: false
|
57
|
+
|
58
|
+
Lint/RedundantCopDisableDirective:
|
59
|
+
Enabled: false
|
60
|
+
|
61
|
+
Lint/UselessAssignment:
|
62
|
+
Enabled: false
|
63
|
+
|
64
|
+
Metrics/AbcSize:
|
65
|
+
Enabled: false
|
66
|
+
|
67
|
+
Metrics/ClassLength:
|
68
|
+
Enabled: false
|
69
|
+
|
70
|
+
Metrics/CyclomaticComplexity:
|
71
|
+
Enabled: false
|
72
|
+
|
73
|
+
Metrics/MethodLength:
|
74
|
+
Enabled: false
|
75
|
+
|
76
|
+
Metrics/PerceivedComplexity:
|
77
|
+
Enabled: false
|
78
|
+
|
79
|
+
Naming/AccessorMethodName:
|
80
|
+
Enabled: false
|
81
|
+
|
82
|
+
Naming/BlockForwarding:
|
83
|
+
Enabled: false
|
84
|
+
|
85
|
+
Naming/HeredocDelimiterNaming:
|
86
|
+
Enabled: false
|
87
|
+
|
88
|
+
Naming/PredicateName:
|
89
|
+
Enabled: false
|
90
|
+
|
91
|
+
Naming/VariableNumber:
|
92
|
+
Enabled: false
|
93
|
+
|
94
|
+
RSpec/AnyInstance:
|
95
|
+
Enabled: false
|
96
|
+
|
97
|
+
RSpec/BeEq:
|
98
|
+
Enabled: false
|
99
|
+
|
100
|
+
RSpec/ContextWording:
|
101
|
+
Enabled: false
|
102
|
+
|
103
|
+
RSpec/ExampleLength:
|
104
|
+
Enabled: false
|
105
|
+
|
106
|
+
RSpec/ExpectInHook:
|
107
|
+
Enabled: false
|
108
|
+
|
109
|
+
RSpec/IndexedLet:
|
110
|
+
Enabled: false
|
111
|
+
|
112
|
+
RSpec/InstanceVariable:
|
113
|
+
Enabled: false
|
114
|
+
|
115
|
+
RSpec/LeakyConstantDeclaration:
|
116
|
+
Enabled: false
|
117
|
+
|
118
|
+
RSpec/MessageChain:
|
119
|
+
Enabled: false
|
120
|
+
|
121
|
+
RSpec/MessageSpies:
|
122
|
+
Enabled: false
|
123
|
+
|
124
|
+
RSpec/MultipleExpectations:
|
125
|
+
Enabled: false
|
126
|
+
|
127
|
+
RSpec/MultipleMemoizedHelpers:
|
128
|
+
Enabled: false
|
129
|
+
|
130
|
+
RSpec/NamedSubject:
|
131
|
+
Enabled: false
|
132
|
+
|
133
|
+
RSpec/NestedGroups:
|
134
|
+
Enabled: false
|
135
|
+
|
136
|
+
RSpec/NoExpectationExample:
|
137
|
+
Enabled: false
|
138
|
+
|
139
|
+
RSpec/PredicateMatcher:
|
140
|
+
Enabled: false
|
141
|
+
|
142
|
+
RSpec/ReceiveMessages:
|
143
|
+
Enabled: false
|
144
|
+
|
145
|
+
RSpec/RepeatedSubjectCall:
|
146
|
+
Enabled: false
|
147
|
+
|
148
|
+
RSpec/SpecFilePathFormat:
|
149
|
+
Enabled: false
|
150
|
+
|
151
|
+
RSpec/SpecFilePathSuffix:
|
152
|
+
Enabled: false
|
153
|
+
|
154
|
+
RSpec/StubbedMock:
|
155
|
+
Enabled: false
|
156
|
+
|
157
|
+
RSpec/SubjectStub:
|
158
|
+
Enabled: false
|
159
|
+
|
160
|
+
RSpec/VerifiedDoubleReference:
|
161
|
+
Enabled: false
|
162
|
+
|
163
|
+
RSpec/VerifiedDoubles:
|
164
|
+
Enabled: false
|
165
|
+
|
166
|
+
Security/Open:
|
167
|
+
Enabled: false
|
168
|
+
|
169
|
+
Style/ArgumentsForwarding:
|
170
|
+
Enabled: false
|
171
|
+
|
172
|
+
Style/CaseEquality:
|
173
|
+
Enabled: false
|
174
|
+
|
175
|
+
Style/ClassAndModuleChildren:
|
176
|
+
Enabled: false
|
177
|
+
|
178
|
+
Style/MissingRespondToMissing:
|
179
|
+
Enabled: false
|
180
|
+
|
181
|
+
Style/OpenStructUse:
|
182
|
+
Enabled: false
|
183
|
+
|
184
|
+
Style/OptionalBooleanParameter:
|
185
|
+
Enabled: false
|
186
|
+
|
187
|
+
Style/SymbolProc:
|
188
|
+
Enabled: false
|
data/Gemfile
CHANGED
@@ -1,13 +1,21 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source 'https://rubygems.org'
|
2
4
|
|
3
5
|
group :development do
|
4
|
-
gem 'guard'
|
5
|
-
gem 'guard-rspec'
|
6
|
+
gem 'guard', '~> 2.18', '>= 2.18.1'
|
7
|
+
gem 'guard-rspec', '~> 4.7', '>= 4.7.3'
|
8
|
+
gem 'railties'
|
9
|
+
gem 'rake', '~> 13.2', '>= 13.2.1'
|
10
|
+
gem 'rspec', '~> 3.0', '>= 3.13'
|
6
11
|
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
|
12
|
+
gem 'webmock', '~> 3.23', '>= 3.23.0'
|
7
13
|
end
|
8
14
|
|
9
15
|
group :development, :test do
|
10
16
|
gem 'pry' # this was in the original Gemfile - but only needed in development & test
|
17
|
+
gem 'rubocop'
|
18
|
+
gem 'rubocop-rspec', require: false
|
11
19
|
end
|
12
20
|
|
13
21
|
# Specify your gem's dependencies in jira_api.gemspec
|
data/Guardfile
CHANGED
data/README.md
CHANGED
@@ -1,37 +1,114 @@
|
|
1
1
|
# JIRA API Gem
|
2
2
|
|
3
3
|
[![Code Climate](https://codeclimate.com/github/sumoheavy/jira-ruby.svg)](https://codeclimate.com/github/sumoheavy/jira-ruby)
|
4
|
-
[![Build Status](https://
|
4
|
+
[![Build Status](https://github.com/sumoheavy/jira-ruby/actions/workflows/CI.yml/badge.svg)](https://github.com/sumoheavy/jira-ruby/actions/workflows/CI.yml)
|
5
5
|
|
6
6
|
This gem provides access to the Atlassian JIRA REST API.
|
7
7
|
|
8
|
-
##
|
8
|
+
## Example usage
|
9
9
|
|
10
|
-
|
10
|
+
# Jira Ruby API - Sample Usage
|
11
11
|
|
12
|
-
|
12
|
+
This sample usage demonstrates how you can interact with JIRA's API using the [jira-ruby gem](https://github.com/sumoheavy/jira-ruby).
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
### Dependencies
|
15
|
+
|
16
|
+
Before running, install the `jira-ruby` gem:
|
17
17
|
|
18
|
+
```shell
|
19
|
+
gem install jira-ruby
|
20
|
+
```
|
21
|
+
|
22
|
+
### Sample Usage
|
23
|
+
Connect to JIRA
|
24
|
+
Firstly, establish a connection with your JIRA instance by providing a few configuration parameters:
|
25
|
+
There are other ways to connect to JIRA listed below | [Personal Access Token](#configuring-jira-to-use-personal-access-tokens-auth)
|
26
|
+
- private_key_file: The path to your RSA private key file.
|
27
|
+
- consumer_key: Your consumer key.
|
28
|
+
- site: The URL of your JIRA instance.
|
29
|
+
|
30
|
+
```ruby
|
18
31
|
options = {
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:auth_type => :basic
|
32
|
+
:private_key_file => "rsakey.pem",
|
33
|
+
:context_path => '',
|
34
|
+
:consumer_key => 'your_consumer_key',
|
35
|
+
:site => 'your_jira_instance_url'
|
24
36
|
}
|
25
37
|
|
26
38
|
client = JIRA::Client.new(options)
|
39
|
+
```
|
27
40
|
|
28
|
-
|
41
|
+
### Retrieve and Display Projects
|
29
42
|
|
30
|
-
|
31
|
-
|
43
|
+
After establishing the connection, you can fetch all projects and display their key and name:
|
44
|
+
```ruby
|
45
|
+
projects = client.Project.all
|
46
|
+
|
47
|
+
projects.each do |project|
|
48
|
+
puts "Project -> key: #{project.key}, name: #{project.name}"
|
32
49
|
end
|
33
50
|
```
|
34
51
|
|
52
|
+
### Handling Fields by Name
|
53
|
+
The jira-ruby gem allows you to refer to fields by their custom names rather than identifiers. Make sure to map fields before using them:
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
client.Field.map_fields
|
57
|
+
|
58
|
+
old_way = issue.customfield_12345
|
59
|
+
|
60
|
+
# Note: The methods mapped here adopt a unique style combining PascalCase and snake_case conventions.
|
61
|
+
new_way = issue.Special_Field
|
62
|
+
```
|
63
|
+
|
64
|
+
### JQL Queries
|
65
|
+
To find issues based on specific criteria, you can use JIRA Query Language (JQL):
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
client.Issue.jql(a_normal_jql_search, fields:[:description, :summary, :Special_field, :created])
|
69
|
+
```
|
70
|
+
|
71
|
+
### Several actions can be performed on the Issue object such as create, update, transition, delete, etc:
|
72
|
+
### Creating an Issue
|
73
|
+
```ruby
|
74
|
+
issue = client.Issue.build
|
75
|
+
labels = ['label1', 'label2']
|
76
|
+
issue.save({
|
77
|
+
"fields" => {
|
78
|
+
"summary" => "blarg from in example.rb",
|
79
|
+
"project" => {"key" => "SAMPLEPROJECT"},
|
80
|
+
"issuetype" => {"id" => "3"},
|
81
|
+
"labels" => labels,
|
82
|
+
"priority" => {"id" => "1"}
|
83
|
+
}
|
84
|
+
})
|
85
|
+
```
|
86
|
+
|
87
|
+
### Updating/Transitioning an Issue
|
88
|
+
```ruby
|
89
|
+
issue = client.Issue.find("10002")
|
90
|
+
issue.save({"fields"=>{"summary"=>"EVEN MOOOOOOARRR NINJAAAA!"}})
|
91
|
+
|
92
|
+
issue_transition = issue.transitions.build
|
93
|
+
issue_transition.save!('transition' => {'id' => transition_id})
|
94
|
+
```
|
95
|
+
|
96
|
+
### Deleting an Issue
|
97
|
+
```ruby
|
98
|
+
issue = client.Issue.find('SAMPLEPROJECT-2')
|
99
|
+
issue.delete
|
100
|
+
```
|
101
|
+
|
102
|
+
### Other Capabilities
|
103
|
+
Apart from the operations listed above, this API wrapper supports several other capabilities like:
|
104
|
+
• Searching for a user
|
105
|
+
• Retrieving an issue's watchers
|
106
|
+
• Changing the assignee of an issue
|
107
|
+
• Adding attachments and comments to issues
|
108
|
+
• Managing issue links and much more.
|
109
|
+
|
110
|
+
Not all examples are shown in this README; refer to the complete script example for a full overview of the capabilities supported by this API wrapper.
|
111
|
+
|
35
112
|
## Links to JIRA REST API documentation
|
36
113
|
|
37
114
|
* [Overview](https://developer.atlassian.com/display/JIRADEV/JIRA+REST+APIs)
|
@@ -87,7 +164,7 @@ key.
|
|
87
164
|
> After you have entered all the information click OK and ensure OAuth authentication is
|
88
165
|
> enabled.
|
89
166
|
|
90
|
-
For
|
167
|
+
For two legged oauth in server mode only, not in cloud based JIRA, make sure to `Allow 2-Legged OAuth`
|
91
168
|
|
92
169
|
## Configuring JIRA to use HTTP Basic Auth
|
93
170
|
|
@@ -99,7 +176,7 @@ defaults to HTTP Basic Auth.
|
|
99
176
|
|
100
177
|
Jira supports cookie based authentication whereby user credentials are passed
|
101
178
|
to JIRA via a JIRA REST API call. This call returns a session cookie which must
|
102
|
-
then be sent to all following JIRA REST API calls.
|
179
|
+
then be sent to all following JIRA REST API calls.
|
103
180
|
|
104
181
|
To enable cookie based authentication, set `:auth_type` to `:cookie`,
|
105
182
|
set `:use_cookies` to `true` and set `:username` and `:password` accordingly.
|
@@ -114,7 +191,7 @@ options = {
|
|
114
191
|
:context_path => '',
|
115
192
|
:auth_type => :cookie, # Set cookie based authentication
|
116
193
|
:use_cookies => true, # Send cookies with each request
|
117
|
-
:additional_cookies => ['AUTH=vV7uzixt0SScJKg7'] # Optional cookies to send
|
194
|
+
:additional_cookies => ['AUTH=vV7uzixt0SScJKg7'] # Optional cookies to send
|
118
195
|
# with each request
|
119
196
|
}
|
120
197
|
|
@@ -134,15 +211,39 @@ cookie to add to the request.
|
|
134
211
|
|
135
212
|
Some authentication schemes that require additional cookies ignore the username
|
136
213
|
and password sent in the JIRA REST API call. For those use cases, `:username`
|
137
|
-
and `:password` may be omitted from `options`.
|
214
|
+
and `:password` may be omitted from `options`.
|
215
|
+
|
216
|
+
## Configuring JIRA to use Personal Access Tokens Auth
|
217
|
+
If your JIRA system is configured to support Personal Access Token authorization, minor modifications are needed in how credentials are communicated to the server. Specifically, the paremeters `:username` and `:password` are not needed. Also, the parameter `:default_headers` is needed to contain the api_token, which can be obtained following the official documentation from [Atlassian](https://confluence.atlassian.com/enterprise/using-personal-access-tokens-1026032365.html). Please note that the Personal Access Token can only be used as it is. If it is encoded (with base64 or any other encoding method) then the token will not work correctly and authentication will fail.
|
218
|
+
|
219
|
+
```ruby
|
220
|
+
require 'jira-ruby'
|
221
|
+
|
222
|
+
# NOTE: the token should not be encoded
|
223
|
+
api_token = API_TOKEN_OBTAINED_FROM_JIRA_UI
|
224
|
+
|
225
|
+
options = {
|
226
|
+
:site => 'http://mydomain.atlassian.net:443/',
|
227
|
+
:context_path => '',
|
228
|
+
:default_headers => { 'Authorization' => "Bearer #{api_token}" },
|
229
|
+
:auth_type => :basic
|
230
|
+
}
|
138
231
|
|
232
|
+
client = JIRA::Client.new(options)
|
233
|
+
|
234
|
+
project = client.Project.find('SAMPLEPROJECT')
|
235
|
+
|
236
|
+
project.issues.each do |issue|
|
237
|
+
puts "#{issue.id} - #{issue.summary}"
|
238
|
+
end
|
239
|
+
```
|
139
240
|
## Using the API Gem in a command line application
|
140
241
|
|
141
242
|
Using HTTP Basic Authentication, configure and connect a client to your instance
|
142
243
|
of JIRA.
|
143
244
|
|
144
245
|
Note: If your Jira install is hosted on [atlassian.net](atlassian.net), it will have no context
|
145
|
-
path by default. If you're having issues connecting, try setting context_path
|
246
|
+
path by default. If you're having issues connecting, try setting context_path
|
146
247
|
to an empty string in the options hash.
|
147
248
|
|
148
249
|
```ruby
|
data/Rakefile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bundler/gem_tasks'
|
2
4
|
|
3
5
|
require 'rubygems'
|
@@ -13,14 +15,11 @@ task test: %i[prepare spec]
|
|
13
15
|
desc 'Prepare and run rspec tests'
|
14
16
|
task :prepare do
|
15
17
|
rsa_key = File.expand_path('rsakey.pem')
|
16
|
-
unless File.exist?(rsa_key)
|
17
|
-
raise 'rsakey.pem does not exist, tests will fail. Run `rake jira:generate_public_cert` first'
|
18
|
-
end
|
18
|
+
Rake::Task['jira:generate_public_cert'].invoke unless File.exist?(rsa_key)
|
19
19
|
end
|
20
20
|
|
21
21
|
desc 'Run RSpec tests'
|
22
|
-
|
23
|
-
RSpec::Core::RakeTask.new(:spec) do |task|
|
22
|
+
RSpec::Core::RakeTask.new(:spec, [] => [:prepare]) do |task|
|
24
23
|
task.rspec_opts = ['--color', '--format', 'doc']
|
25
24
|
end
|
26
25
|
|