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 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
@@ -0,0 +1,2 @@
1
+ *.gem
2
+ test/config.yml
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ end
6
+
7
+ desc "Run tests"
8
+ task :default => :test
@@ -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,10 @@
1
+ module RestRedmine
2
+ class Configuration
3
+ attr_accessor :api_key, :server_url, :timeout, :resources, :retries
4
+
5
+ def initialize
6
+ @resources = {}
7
+ @retries = 1
8
+ end
9
+ end
10
+ 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
@@ -0,0 +1,6 @@
1
+ Dir[File.dirname(__FILE__) + '/resources/*.rb'].each {|file| require file }
2
+
3
+ module RestRedmine
4
+ module Resources
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ module RestRedmine
2
+ VERSION = '0.1.0' unless defined?(self::VERSION)
3
+
4
+ def self.version
5
+ VERSION
6
+ end
7
+ end
@@ -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,2 @@
1
+ api_key: "<api_key>"
2
+ server_url: "http://example.com"
@@ -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: