rest_redmine 0.1.0
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 +7 -0
- data/.gitignore +2 -0
- data/Rakefile +8 -0
- data/lib/rest_redmine/api.rb +60 -0
- data/lib/rest_redmine/configuration.rb +10 -0
- data/lib/rest_redmine/exception.rb +19 -0
- data/lib/rest_redmine/resources/base.rb +71 -0
- data/lib/rest_redmine/resources/issue.rb +21 -0
- data/lib/rest_redmine/resources.rb +6 -0
- data/lib/rest_redmine/version.rb +7 -0
- data/lib/rest_redmine.rb +28 -0
- data/rest_redmine.gemspec +15 -0
- data/test/config.yml.example +2 -0
- data/test/test_rest_redmine.rb +69 -0
- metadata +77 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 11cd21706e46eef092c4c2e85995110321b40dd1
|
4
|
+
data.tar.gz: f8ddd64d8d62674ac8c6bf8cffe33e163262807a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 479fd4eb4a35acedb9b5f2439fd85542aaeae19bf244daebad78c41b69ab899296cd825f5f752aea519b77b09021864e503f3e744b8a7b8f48fdeb9edf05c1d6
|
7
|
+
data.tar.gz: d1b06d18c87f26b7f2e5a3f1a1f80978ab21a3d20918af8fc55ae9b5b0651376374f5b33b568a8e0d7291c9e271b1e95d172340302930c58709233b3536bd45d
|
data/.gitignore
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'rest_redmine/resources'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module RestRedmine
|
5
|
+
module API
|
6
|
+
class << self
|
7
|
+
attr_accessor :config
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.get_path(action, id: nil)
|
11
|
+
url = "#{RestRedmine.configuration.server_url}/#{action}"
|
12
|
+
url += "/#{id}" if id
|
13
|
+
url += ".json"
|
14
|
+
|
15
|
+
url
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.request(action, data: {}, id: nil, method: :get)
|
19
|
+
retries ||= RestRedmine.configuration.retries
|
20
|
+
url = get_path(action, id: id)
|
21
|
+
|
22
|
+
if RestRedmine.configuration.api_key.nil?
|
23
|
+
message = "
|
24
|
+
You must set configure first.
|
25
|
+
|
26
|
+
RestRedmine.configure do |config|
|
27
|
+
config.api_key = '<api_key>'
|
28
|
+
config.server_url = '<server_url>'
|
29
|
+
end
|
30
|
+
"
|
31
|
+
raise RestRedmine::Exception.new(message)
|
32
|
+
end
|
33
|
+
|
34
|
+
response = RestClient::Request.execute(
|
35
|
+
:method => method,
|
36
|
+
:url => url,
|
37
|
+
:payload => data,
|
38
|
+
:headers => {
|
39
|
+
:accept => :json,
|
40
|
+
"X-Redmine-API-Key" => RestRedmine.configuration.api_key
|
41
|
+
},
|
42
|
+
:timeout => RestRedmine.configuration.timeout,
|
43
|
+
:open_timeout => RestRedmine.configuration.timeout
|
44
|
+
)
|
45
|
+
rescue RestRedmine::Exception => e
|
46
|
+
RestRedmine.log << e
|
47
|
+
RestRedmine.log << "REDMINE FAIL\nurl - #{url}\nparams - #{data}\nmethod - #{method}"
|
48
|
+
rescue => e
|
49
|
+
RestRedmine.log << e
|
50
|
+
RestRedmine.log << "REDMINE FAIL\nurl - #{url}\nparams - #{data}\nmethod - #{method}"
|
51
|
+
retry unless (retries -= 1).zero?
|
52
|
+
else
|
53
|
+
if response.length > 0
|
54
|
+
JSON.parse(response)
|
55
|
+
else
|
56
|
+
true
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RestRedmine
|
2
|
+
class Exception < RuntimeError
|
3
|
+
attr_accessor :response
|
4
|
+
attr_writer :message
|
5
|
+
|
6
|
+
def initialize message, response=nil
|
7
|
+
@message = message
|
8
|
+
@response = response if response
|
9
|
+
end
|
10
|
+
|
11
|
+
def message
|
12
|
+
@message || self.class.name
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
"#{self.class}: #{@message}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module RestRedmine
|
2
|
+
module Resources
|
3
|
+
class Base
|
4
|
+
attr_accessor :model, :id, :name
|
5
|
+
|
6
|
+
KEYS = []
|
7
|
+
DEFAULT_MODEL = {}
|
8
|
+
|
9
|
+
def initialize(params={})
|
10
|
+
@model = {}
|
11
|
+
@name = self.class.to_s.split("::").last.downcase.to_sym
|
12
|
+
|
13
|
+
self.class::KEYS.each do |key|
|
14
|
+
@model[key] = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
@model.merge!(self.class::DEFAULT_MODEL)
|
18
|
+
params.merge!(RestRedmine.configuration.resources[@name] || {})
|
19
|
+
@model.merge!(params)
|
20
|
+
|
21
|
+
self.id = params[:id] if params[:id]
|
22
|
+
end
|
23
|
+
|
24
|
+
def load
|
25
|
+
raise RestRedmine::Exception.new("Id is required") unless self.id
|
26
|
+
response = request(method: :get)
|
27
|
+
end
|
28
|
+
|
29
|
+
def save
|
30
|
+
method = self.id ? :put : :post
|
31
|
+
|
32
|
+
request(method: method)
|
33
|
+
end
|
34
|
+
|
35
|
+
def request(method: :get)
|
36
|
+
response = RestRedmine::API.request(self.class::RESOURCE, id: self.id, data: get_data, method: method)
|
37
|
+
|
38
|
+
self.id = response[name.to_s]["id"] if response.respond_to? :has_key?
|
39
|
+
# puts response
|
40
|
+
|
41
|
+
# response[name.to_s].each do |key, val|
|
42
|
+
# if model.has_key? key.to_sym
|
43
|
+
# @model[key.to_sym] = val
|
44
|
+
# elsif model.has_key? "#{key}_id".to_sym
|
45
|
+
# @model["#{key}_id".to_sym] = val["id"]
|
46
|
+
# elsif key == "id"
|
47
|
+
# self.id = val
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
|
51
|
+
response
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_data
|
55
|
+
{
|
56
|
+
"#{name}" => model
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
def method_missing(method, *args, &block)
|
61
|
+
if self.class::KEYS.include? method
|
62
|
+
@model[method.to_sym]
|
63
|
+
elsif method.to_s =~ /=$/ and self.class::KEYS.include? method.to_s.sub("=", "").to_sym
|
64
|
+
@model[method.to_s.sub("=", "").to_sym] = args.first
|
65
|
+
else
|
66
|
+
super
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module RestRedmine
|
2
|
+
module Resources
|
3
|
+
class Issue < Base
|
4
|
+
KEYS = [
|
5
|
+
:project_id, :tracker_id, :status_id, :priority_id, :subject, :description, :category_id, :parent_issue_id, :custom_fields, :watcher_user_ids, :is_private, :estimated_hours, :done_ratio
|
6
|
+
]
|
7
|
+
|
8
|
+
DEFAULT_MODEL = {
|
9
|
+
custom_fields: {},
|
10
|
+
is_private: false,
|
11
|
+
done_ratio: 0
|
12
|
+
}
|
13
|
+
|
14
|
+
RESOURCE = "issues"
|
15
|
+
|
16
|
+
def statuses
|
17
|
+
RestRedmine::API.request("issue_statuses")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/rest_redmine.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'rest_redmine/exception'
|
2
|
+
require 'rest_redmine/configuration'
|
3
|
+
require 'rest_redmine/api'
|
4
|
+
require 'rest-client'
|
5
|
+
|
6
|
+
module RestRedmine
|
7
|
+
class << self
|
8
|
+
attr_writer :configuration, :log
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.configuration
|
12
|
+
@configuration ||= Configuration.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.configure
|
16
|
+
yield(configuration)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.create_log
|
20
|
+
@log = RestClient.create_log("stdout")
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.log
|
24
|
+
@log
|
25
|
+
end
|
26
|
+
|
27
|
+
create_log
|
28
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path('../lib/rest_redmine/version', __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'rest_redmine'
|
5
|
+
s.version = RestRedmine::VERSION
|
6
|
+
s.licenses = ['MIT']
|
7
|
+
s.summary = "This is for restful api of redmine"
|
8
|
+
s.description = 'A simple HTTP and REST client for REDMINE.'
|
9
|
+
s.authors = ["topray"]
|
10
|
+
s.email = 'topray@nowbusking.com'
|
11
|
+
s.files = `git ls-files -z`.split("\0")
|
12
|
+
s.homepage = 'https://github.com/topray/rest-redmine'
|
13
|
+
|
14
|
+
s.add_dependency('rest-client', '~> 1.7', '>= 1.7.2')
|
15
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'rest_redmine'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
class RestRedmineTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
configuration = YAML.load_file('test/config.yml')
|
8
|
+
|
9
|
+
@api_key = configuration["api_key"]
|
10
|
+
@server_url = configuration["server_url"]
|
11
|
+
|
12
|
+
RestRedmine.configure do |config|
|
13
|
+
config.api_key = @api_key
|
14
|
+
config.server_url = @server_url
|
15
|
+
config.resources[:issue] = {
|
16
|
+
project_id: 1, # nowplay
|
17
|
+
tracker_id: 1, # bug
|
18
|
+
status_id: 1, # new
|
19
|
+
priority_id: 2, # normal
|
20
|
+
category_id: 1
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
@issue = RestRedmine::Resources::Issue.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_configuration
|
28
|
+
assert_equal @api_key, RestRedmine.configuration.api_key
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_resources
|
32
|
+
assert_equal true, @issue.model.keys.length > 0
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_issue_statuses
|
36
|
+
assert_equal Hash, @issue.statuses.class
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_exception
|
40
|
+
message = "You must set configure"
|
41
|
+
e = RestRedmine::Exception.new(message)
|
42
|
+
assert_equal message, e.message
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_default_resource
|
46
|
+
assert_equal 1, @issue.status_id
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_get_issue
|
50
|
+
@issue.id = 37
|
51
|
+
response = @issue.load
|
52
|
+
assert_equal 5, response["issue"]["status"]["id"]
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_create_issue
|
56
|
+
# @issue.load
|
57
|
+
@issue.subject = "테스트테스트"
|
58
|
+
@issue.description = "설명"
|
59
|
+
@issue.status_id = 2
|
60
|
+
response = @issue.save
|
61
|
+
|
62
|
+
assert_equal true, response["issue"].any?
|
63
|
+
|
64
|
+
@issue.status_id = 5
|
65
|
+
response = @issue.save
|
66
|
+
|
67
|
+
assert_equal true, response
|
68
|
+
end
|
69
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rest_redmine
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- topray
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rest-client
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.7.2
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.7'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.7.2
|
33
|
+
description: A simple HTTP and REST client for REDMINE.
|
34
|
+
email: topray@nowbusking.com
|
35
|
+
executables: []
|
36
|
+
extensions: []
|
37
|
+
extra_rdoc_files: []
|
38
|
+
files:
|
39
|
+
- ".gitignore"
|
40
|
+
- Rakefile
|
41
|
+
- lib/rest_redmine.rb
|
42
|
+
- lib/rest_redmine/api.rb
|
43
|
+
- lib/rest_redmine/configuration.rb
|
44
|
+
- lib/rest_redmine/exception.rb
|
45
|
+
- lib/rest_redmine/resources.rb
|
46
|
+
- lib/rest_redmine/resources/base.rb
|
47
|
+
- lib/rest_redmine/resources/issue.rb
|
48
|
+
- lib/rest_redmine/version.rb
|
49
|
+
- rest_redmine.gemspec
|
50
|
+
- test/config.yml.example
|
51
|
+
- test/test_rest_redmine.rb
|
52
|
+
homepage: https://github.com/topray/rest-redmine
|
53
|
+
licenses:
|
54
|
+
- MIT
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 2.4.5
|
73
|
+
signing_key:
|
74
|
+
specification_version: 4
|
75
|
+
summary: This is for restful api of redmine
|
76
|
+
test_files: []
|
77
|
+
has_rdoc:
|