rujira 0.1.4 → 0.1.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: da8ad0745459d377638ecda7132f7b24cebe44f73802cc5ac58e089ed8d93fda
4
- data.tar.gz: 0e1d0d3ce944fc903b275981abf8238868579f52f5675648fb0bcff55d87ca03
3
+ metadata.gz: b6c5b714472d56b23db8bfe6a5a96e60c3dfd6af7cb8176fbef27d839bc2ace3
4
+ data.tar.gz: 106ca92334c64b3129f4e66d8aaa570eaa4d09adcba9ac7dad1d4136d6c251a8
5
5
  SHA512:
6
- metadata.gz: 15262ee9a7f5a69116a033f3fbb6e72889db11694ca5c15f5dde5e734455afac197679eeab8a3ae3ecfc4aa3da97d230dea4507d337b5c577f2160d207e13c6a
7
- data.tar.gz: 57bf1f91fdc28d4d77f237a0a8c2efa4ac085ca2e6493bf7a354abbc952106019119487a389d1b0b33ee4923b26e0858464f88631176095db627785b2ed5d19a
6
+ metadata.gz: ae579ef0d21f37fb22002669d668ddf6f876a1940da8fd0e5cd6022f8458407913ea3ba398af98590daf75b8dcd4b4b783c0764c05081aef60e24a4db789450d
7
+ data.tar.gz: 19062bf410f45b08e1a1554743a7f179acb314d3e95a8a92c5d914b1147b64458797ea849da34c19e3867e6c726add88f23c810f186df2cd6f81c76794a1bb39
data/README.md CHANGED
@@ -8,32 +8,58 @@
8
8
 
9
9
  name = Rujira::Api::Myself.get.name
10
10
  Rujira::Api::Project.get 'ITMG'
11
- Rujira::Api::Issue.create fields: {
12
- project: { key: 'ITMG' },
13
- summary: 'BOT: added a new feature.',
14
- description: 'This task was generated by the bot when creating changes in the repository.',
15
- issuetype: { name: 'Task' },
16
- labels: ['bot']
17
- }
11
+ Rujira::Api::Issue.create do
12
+ data fields: {
13
+ project: { key: 'ITMG' },
14
+ summary: 'BOT: added a new feature.',
15
+ description: 'This task was generated by the bot when creating changes in the repository.',
16
+ issuetype: { name: 'Task' },
17
+ labels: ['bot'] }
18
+ params updateHistory: true
19
+ end
18
20
  Rujira::Api::Issue.watchers 'ITMG-1', 'wilful'
19
21
  Rujira::Api::Issue.get 'ITMG-1'
20
- Rujira::Api::Search.get jql: 'project = ITMG and status IN ("To Do", "In Progress") ORDER BY issuekey',
21
- maxResults: 10,
22
- startAt: 0,
23
- fields: ['id', 'key']
24
- Rujira::Api::Issue.comment 'ITMG-1', body: 'Adding a new comment'
25
- Rujira::Api::Issue.edit 'ITMG-1', update: {
26
- labels:[{add: 'rujira'},{remove: 'bot'}],
27
- },
28
- fields: {
29
- assignee: { name: name },
30
- summary: 'This is a shorthand for a set operation on the summary field'
31
- }
22
+ result = Rujira::Api::Search.get do
23
+ data jql: 'project = ITMG and status IN ("To Do", "In Progress") ORDER BY issuekey',
24
+ maxResults: 10,
25
+ startAt: 0,
26
+ fields: ['id', 'key']
27
+ end
28
+ result.iter
29
+ Rujira::Api::Issue.comment 'ITMG-1' do
30
+ data body: 'Adding a new comment'
31
+ end
32
+ Rujira::Api::Issue.edit 'ITMG-1' do
33
+ data update: {
34
+ labels:[{add: 'rujira'},{remove: 'bot'}],
35
+ },
36
+ fields: {
37
+ assignee: { name: name },
38
+ summary: 'This is a shorthand for a set operation on the summary field'
39
+ }
40
+ end
41
+ Rujira::Api::Issue.attachments 'ITMG-1', 'upload.png'
32
42
  Rujira::Api::Issue.del 'ITMG-1'
33
43
 
44
+ ## Rake tasks
45
+
46
+ require 'rujira/tasks/jira'
47
+ rake jira::whoami
48
+ rake jira:create -- '--project=ITMG' \
49
+ '--summary=The short summary information' \
50
+ '--description=The base description of task' \
51
+ '--issuetype=Task'
52
+ rake jira:search -- '-q project = ITMG'
53
+
34
54
  ## Testing
35
55
 
36
56
  ### Run the instance of jira
37
57
 
38
58
  docker compose up -d
39
59
  open http://localhost:8080
60
+
61
+ ### Example with Curl
62
+
63
+ curl -H "Authorization: Bearer <JIRA_ACCESS_TOKEN>" 'http://localhost:8080/rest/api/2/search?expand=summary'
64
+ curl -D- -F "file=@upload.png" -X POST -H "X-Atlassian-Token: nocheck" \
65
+ -H "Authorization: Bearer <JIRA_ACCESS_TOKEN>" 'http://localhost:8080/rest/api/2/issue/ITMG-70/attachments'
data/Rakefile CHANGED
@@ -1,4 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
4
- task default: %i[]
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/testtask'
5
+
6
+ $LOAD_PATH.unshift File.expand_path('lib', __dir__)
7
+ require 'rujira'
8
+ require 'rujira/tasks/jira'
9
+
10
+ task default: %i[test]
11
+
12
+ Rake::TestTask.new do |t|
13
+ t.libs << 'test'
14
+ t.test_files = FileList['test/test*.rb']
15
+ t.verbose = false
16
+ end
17
+
18
+ Rujira::Tasks::Jira.new
19
+
20
+ task :version do
21
+ puts Rujira::VERSION
22
+ end
data/compose.yaml CHANGED
@@ -5,6 +5,7 @@ services:
5
5
  restart: always
6
6
  image: atlassian/jira-software
7
7
  environment: {}
8
+ # JVM_SUPPORT_RECOMMENDED_ARGS: "-Datlassian.recovery.password=<PASSWORD>"
8
9
  ports:
9
10
  - 8080:8080
10
11
  volumes:
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rujira
4
+ module Api
5
+ # TODO
6
+ # https://docs.atlassian.com/software/jira/docs/api/REST/8.17.1/#api/2/comment/%7BcommentId%7D/properties
7
+ class Attachments < Item; end
8
+ end
9
+ end
@@ -5,56 +5,70 @@ module Rujira
5
5
  # TODO
6
6
  # https://docs.atlassian.com/software/jira/docs/api/REST/8.17.1/#api/2/issue
7
7
  class Issue < Item
8
- def self.get(id_or_key)
8
+ def self.create(&block)
9
9
  entity = Entity.build do
10
- path "issue/#{id_or_key}"
10
+ path 'issue'
11
+ method :POST
12
+ instance_eval(&block) if block_given?
11
13
  end
12
14
  new(entity.commit)
13
15
  end
14
16
 
15
- def self.del(id_or_key)
17
+ def self.get(id_or_key, &block)
16
18
  entity = Entity.build do
17
19
  path "issue/#{id_or_key}"
18
- method :DELETE
20
+ instance_eval(&block) if block_given?
19
21
  end
20
- entity.commit
22
+ new(entity.commit)
21
23
  end
22
24
 
23
- def self.create(**data)
25
+ def self.del(id_or_key, &block)
24
26
  entity = Entity.build do
25
- path 'issue'
26
- method :POST
27
- data data if data
27
+ path "issue/#{id_or_key}"
28
+ method :DELETE
29
+ instance_eval(&block) if block_given?
28
30
  end
29
- new(entity.commit)
31
+ entity.commit
30
32
  end
31
33
 
32
- def self.edit(id_or_key, **data)
34
+ def self.edit(id_or_key, &block)
33
35
  entity = Entity.build do
34
36
  path "issue/#{id_or_key}"
35
37
  method :PUT
36
- data data
38
+ instance_eval(&block) if block_given?
37
39
  end
38
40
  new(entity.commit)
39
41
  end
40
42
 
41
- def self.comment(id_or_key, **data)
43
+ def self.comment(id_or_key, &block)
42
44
  entity = Entity.build do
43
45
  path "issue/#{id_or_key}/comment"
44
46
  method :POST
45
- data data if data
47
+ instance_eval(&block) if block_given?
46
48
  end
47
49
  Comment.new(entity.commit)
48
50
  end
49
51
 
50
- def self.watchers(id_or_key, data)
52
+ def self.watchers(id_or_key, &block)
51
53
  entity = Entity.build do
52
54
  path "issue/#{id_or_key}/watchers"
53
55
  method :POST
54
- data data
56
+ instance_eval(&block) if block_given?
55
57
  end
56
58
  new(entity.commit)
57
59
  end
60
+
61
+ def self.attachments(id_or_key, path, &block)
62
+ entity = Entity.build do
63
+ path "issue/#{id_or_key}/attachments"
64
+ method :POST
65
+ headers 'Content-Type': 'multipart/form-data', 'X-Atlassian-Token': 'nocheck',
66
+ 'Transfer-Encoding': 'chunked', 'Content-Length': File.size(path).to_s
67
+ data file: Faraday::Multipart::FilePart.new(path, 'multipart/form-data')
68
+ instance_eval(&block) if block_given?
69
+ end
70
+ Attachments.new(entity.commit)
71
+ end
58
72
  end
59
73
  end
60
74
  end
@@ -5,9 +5,10 @@ module Rujira
5
5
  # TODO
6
6
  # https://docs.atlassian.com/software/jira/docs/api/REST/8.17.1/#api/2/project
7
7
  class Project < Item
8
- def self.get(id_or_key)
8
+ def self.get(id_or_key, &block)
9
9
  entity = Entity.build do
10
10
  path "project/#{id_or_key}"
11
+ instance_eval(&block) if block_given?
11
12
  end
12
13
  new(entity.commit)
13
14
  end
@@ -5,13 +5,17 @@ module Rujira
5
5
  # TODO
6
6
  # https://docs.atlassian.com/software/jira/docs/api/REST/8.17.1/#api/2/search
7
7
  class Search < Item
8
- def self.get(**data)
8
+ def self.get(&block)
9
9
  entity = Entity.build do
10
10
  path 'search'
11
- data data
12
11
  method :POST
12
+ instance_eval(&block) if block_given?
13
13
  end
14
- entity.commit['issues'].map do |issue|
14
+ new(entity.commit)
15
+ end
16
+
17
+ def iter
18
+ data['issues'].map do |issue|
15
19
  Issue.new(issue)
16
20
  end
17
21
  end
@@ -3,7 +3,7 @@
3
3
  module Rujira
4
4
  module Api
5
5
  # TODO
6
- # https://docs.atlassian.com/software/jira/docs/api/REST/8.17.1/#api/2/myself
6
+ # https://docs.atlassian.com/software/jira/docs/api/REST/8.17.1/#api/2/serverInfo
7
7
  class ServerInfo < Item
8
8
  def self.get
9
9
  entity = Entity.build do
@@ -13,6 +13,7 @@ module Rujira
13
13
  def run
14
14
  Faraday.new(@options) do |builder|
15
15
  builder.request :authorization, 'Bearer', -> { @token }
16
+ builder.request :multipart, flat_encode: true
16
17
  builder.request :json
17
18
  builder.response :json
18
19
  builder.response :raise_error
data/lib/rujira/entity.rb CHANGED
@@ -5,6 +5,8 @@ module Rujira
5
5
  class Entity
6
6
  def initialize
7
7
  @method = :GET
8
+ @params = {}
9
+ @headers = {}
8
10
  @rest_api = 'rest/api/2'
9
11
  end
10
12
 
@@ -17,6 +19,14 @@ module Rujira
17
19
  entity
18
20
  end
19
21
 
22
+ def params(params)
23
+ @params = params
24
+ end
25
+
26
+ def headers(headers)
27
+ @headers = headers
28
+ end
29
+
20
30
  def method(method)
21
31
  @method = method
22
32
  end
@@ -60,20 +70,26 @@ module Rujira
60
70
 
61
71
  def get
62
72
  request do
63
- client.get path
73
+ client.get path do |req|
74
+ req.params = @params
75
+ end
64
76
  end
65
77
  end
66
78
 
67
79
  def delete
68
80
  request do
69
- client.delete path
81
+ client.delete path do |req|
82
+ req.params = @params
83
+ end
70
84
  end
71
85
  end
72
86
 
73
87
  def post
74
88
  request do
75
89
  client.post path do |req|
76
- req.body = data.to_json
90
+ req.headers = @headers
91
+ req.params = @params
92
+ req.body = data
77
93
  end
78
94
  end
79
95
  end
@@ -81,7 +97,8 @@ module Rujira
81
97
  def put
82
98
  request do
83
99
  client.put path do |req|
84
- req.body = data.to_json
100
+ req.params = @params
101
+ req.body = data
85
102
  end
86
103
  end
87
104
  end
@@ -11,47 +11,86 @@ module Rujira
11
11
  include ::Rake::DSL if defined?(::Rake::DSL)
12
12
 
13
13
  def initialize
14
+ @options = {
15
+ issuetype: 'Task'
16
+ }
17
+ @parser = OptionParser.new
14
18
  define
15
19
  end
16
20
 
17
- def define
18
- whoami
19
- url
20
- server_info
21
+ def parser
22
+ yield
23
+ args = @parser.order!(ARGV) {}
24
+ @parser.parse!(args)
21
25
  end
22
26
 
23
- def whoami
24
- name = __method__
25
- desc 'Request my real name in Jira'
27
+ def options(name)
28
+ @options[name]
29
+ end
26
30
 
27
- Rake::Task[name].clear if Rake::Task.task_defined?(name)
28
- namespace :jira do
29
- task name do
30
- puts Rujira::Api::Myself.get.name
31
- end
31
+ # rubocop:disable Metrics/AbcSize
32
+ # rubocop:disable Metrics/MethodLength
33
+ def define
34
+ generate 'whoami' do
35
+ puts Rujira::Api::Myself.get.name
32
36
  end
33
- end
37
+ generate 'url' do
38
+ puts Rujira::Configuration.url
39
+ end
40
+ generate 'server_info' do
41
+ puts Rujira::Api::ServerInfo.get.data.to_json
42
+ end
43
+ generate 'create' do
44
+ parser do
45
+ @parser.banner = "Usage: rake jira:task:create -- '[options]'"
46
+ @parser.on('-p PROJECT', '--project=PROJECT') { |project| @options[:project] = project.strip }
47
+ @parser.on('-s SUMMARY', '--summary=SUMMARY') { |summary| @options[:summary] = summary.strip }
48
+ @parser.on('-d DESCRIPTION', '--description=DESCRIPTION') do |description|
49
+ @options[:description] = description.strip
50
+ end
51
+ @parser.on('-i ISSUETYPE', '--issuetype=ISSUETYPE') { |issuetype| @options[:issuetype] = issuetype.strip }
52
+ end
34
53
 
35
- def url
36
- name = __method__
37
- desc 'Request server url from Jira'
54
+ result = Rujira::Api::Issue.create fields: {
55
+ project: { key: @options[:project] },
56
+ summary: @options[:summary],
57
+ issuetype: { name: @options[:issuetype] },
58
+ description: @options[:description]
59
+ }
60
+ url = Rujira::Configuration.url
61
+ puts "// A new task been posted, check it out at #{url}/browse/#{result.data['key']}"
62
+ end
63
+ generate 'search' do
64
+ parser do
65
+ @parser.banner = "Usage: rake jira:task:search -- '[options]'"
66
+ @parser.on('-q JQL', '--jql=JQL') { |jql| @options[:jql] = jql }
67
+ end
38
68
 
39
- Rake::Task[name].clear if Rake::Task.task_defined?(name)
40
- namespace :jira do
41
- task name do
42
- puts Rujira::Configuration.url
69
+ result = Rujira::Api::Search.get jql: @options[:jql]
70
+ result.iter.each { |i| puts JSON.pretty_generate(i.data) }
71
+ end
72
+ generate 'attach' do
73
+ parser do
74
+ @parser.banner = "Usage: rake jira:task:attach -- '[options]'"
75
+ @parser.on('-f FILE', '--file=FILE') { |jql| @options[:file] = jql }
76
+ @parser.on('-i ID', '--issue=ID') { |jql| @options[:id] = jql }
43
77
  end
78
+
79
+ result = Rujira::Api::Issue.attachments @options[:id], @options[:file]
80
+ JSON.pretty_generate(result)
44
81
  end
45
82
  end
83
+ # rubocop:enable Metrics/AbcSize
84
+ # rubocop:enable Metrics/MethodLength
46
85
 
47
- def server_info
48
- name = __method__
49
- desc 'Request server information from Jira'
86
+ def generate(name, &block)
87
+ fullname = "jira:#{name}"
88
+ desc "Run #{fullname}"
50
89
 
51
- Rake::Task[name].clear if Rake::Task.task_defined?(name)
90
+ Rake::Task[fullname].clear if Rake::Task.task_defined?(fullname)
52
91
  namespace :jira do
53
92
  task name do
54
- puts Rujira::Api::ServerInfo.get.data.to_json
93
+ instance_eval(&block)
55
94
  end
56
95
  end
57
96
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rujira
4
- VERSION = "0.1.4"
4
+ VERSION = "0.1.6"
5
5
  end
data/lib/rujira.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'faraday'
4
+ require 'faraday/multipart'
4
5
  require 'json'
5
6
  require_relative 'rujira/version'
6
7
  require_relative 'rujira/connection'
@@ -11,6 +12,7 @@ require_relative 'rujira/api/search'
11
12
  require_relative 'rujira/api/issue'
12
13
  require_relative 'rujira/api/project'
13
14
  require_relative 'rujira/api/comment'
15
+ require_relative 'rujira/api/attachments'
14
16
  require_relative 'rujira/api/myself'
15
17
  require_relative 'rujira/api/server_info'
16
18
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rujira
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Semenov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-04-15 00:00:00.000000000 Z
11
+ date: 2024-05-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: The library is developed for the purposes of the organization, new features
14
14
  can be added as MR. Welcome!
@@ -25,6 +25,7 @@ files:
25
25
  - Rakefile
26
26
  - compose.yaml
27
27
  - lib/rujira.rb
28
+ - lib/rujira/api/attachments.rb
28
29
  - lib/rujira/api/comment.rb
29
30
  - lib/rujira/api/issue.rb
30
31
  - lib/rujira/api/item.rb