backlog_jp 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d127e6f10a8f49a928418bb5ffc563ce2dccd246
4
+ data.tar.gz: 50a121f489af8b417318478fa4e9aea4c8b6e370
5
+ SHA512:
6
+ metadata.gz: eff4d3dba77ea51d3fd453f98b2c53a12e08d01c3b7124ada274c9d59d7afe3f6eb4f772a1b73c2c4e1e0292fa45cf08bd1c6728d3a1d469fbd907c3ba58b7f7
7
+ data.tar.gz: 20914d56059c701946bdddb7611cbd7a28f0e1bb7e18ca2f8ef336d911b4d240acc054326f672d98f854846bf68bc3af816e77ae59bc04bf1e0f4daf59ddff95
data/.gitignore ADDED
@@ -0,0 +1,43 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+
19
+ *.sublime-project
20
+ *.sublime-workspace
21
+
22
+ .rvmrc
23
+ vendor/bundle
24
+
25
+ /log/*
26
+ /tmp/*
27
+ /public/system/*
28
+ **.orig
29
+ rerun.txt
30
+ pickle-email-*.html
31
+ .project
32
+
33
+ ### OSX ###
34
+ .DS_Store
35
+ .AppleDouble
36
+ .LSOverride
37
+ Icon
38
+
39
+ # Thumbnails
40
+ ._*
41
+
42
+ run.sh
43
+ sandbox.rb
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in backlog_jp.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 y13i
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # BacklogJp
2
+
3
+ A Rubyish interface for Backlog.
4
+
5
+ ## Requirements
6
+
7
+ * Ruby 2.0.0 or later
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem 'backlog_jp'
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install backlog_jp
22
+
23
+ ## Usage
24
+
25
+ TODO: Write more usage instructions here
26
+
27
+ require "backlog_jp"
28
+
29
+ BacklogJp.configure do |config|
30
+ config.space = ENV["BACKLOG_SPACE"]
31
+ config.username = ENV["BACKLOG_USERNAME"]
32
+ config.password = ENV["BACKLOG_PASSWORD"]
33
+ end
34
+
35
+ all_projects = BacklogJp::Project.all # Array of all projects.
36
+ project = all_projects.first # A Project object.
37
+ project.issue_types # Array of project's issue types.
38
+
39
+ # etc...
40
+ # work in progress
41
+
42
+ ## Contributing
43
+
44
+ 1. Fork it ( http://github.com/y13i/backlog_jp/fork )
45
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
46
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
47
+ 4. Push to the branch (`git push origin my-new-feature`)
48
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/TODO.md ADDED
@@ -0,0 +1,38 @@
1
+ # TODO
2
+
3
+ とりあえず作る
4
+
5
+ ## まだ実装してないBacklog XMLRPC API一覧
6
+
7
+ * backlog.getUsers
8
+ * backlog.getIssue
9
+ * backlog.getIssue
10
+ * backlog.getComments
11
+ * backlog.countIssue
12
+ * backlog.findIssue
13
+ * backlog.createIssue
14
+ * backlog.updateIssue
15
+ * backlog.switchStatus
16
+ * backlog.addComment
17
+ * backlog.getTimeline
18
+ * backlog.getProjectSummary
19
+ * backlog.getProjectSummaries
20
+ * backlog.getUser
21
+ * backlog.getUserIcon
22
+ * backlog.getActivityTypes
23
+ * backlog.getStatuses
24
+ * backlog.getResolutions
25
+ * backlog.getPriorities
26
+ * backlog.getCustomFields
27
+ * backlog.getChildIssues
28
+ * backlog.admin.getUsers
29
+ * backlog.admin.addUser
30
+ * backlog.admin.updateUser
31
+ * backlog.admin.deleteUser
32
+ * backlog.admin.getProjectUsers
33
+ * backlog.admin.addProjectUser
34
+ * backlog.admin.updateProjectUsers
35
+ * backlog.admin.deleteProjectUser
36
+ * backlog.admin.addCustomField
37
+ * backlog.admin.updateCustomField
38
+ * backlog.admin.deleteCustomField
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'backlog_jp/_version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "backlog_jp"
8
+ spec.version = BacklogJp::VERSION
9
+ spec.authors = ["y13i"]
10
+ spec.email = ["email@y13i.com"]
11
+ spec.summary = %q{A Rubyish interface for Backlog.}
12
+ spec.description = %q{A Rubyish, object-oriented interface for project management service Backlog's XML-RPC API.}
13
+ spec.homepage = "http://github.com/y13i/backlog_jp"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rake", "~> 0"
23
+ end
@@ -0,0 +1,3 @@
1
+ module BacklogJp
2
+ VERSION = "0.0.6"
3
+ end
@@ -0,0 +1,32 @@
1
+ require "xmlrpc/client"
2
+ require_relative "configuration"
3
+
4
+ module BacklogJp
5
+ # Wrapping class of Backlog's XMLRPC API.
6
+ #
7
+ # eg. XMLRPC method "backlog.createIssue" can be called as...
8
+ #
9
+ # +BacklogJp.client.create_issue summery: "Issue title", description: "Issue body"+
10
+ class Client < ::XMLRPC::Client
11
+ private
12
+ def method_missing method, *args
13
+ send :call, "backlog.#{camelize method.to_s}", *args
14
+ end
15
+
16
+ def camelize string
17
+ string.sub(/\Aadmin_/, "admin.").gsub(/_[a-z]/){|match| match.chars.last.upcase}
18
+ end
19
+ end
20
+
21
+ # Returns a Client with configuration.
22
+ def self.client
23
+ @client ||= Client.new_from_hash(
24
+ host: "#{configuration.space}.backlog.jp",
25
+ path: "/XML-RPC",
26
+ port: 443,
27
+ use_ssl: true,
28
+ user: configuration.username,
29
+ password: configuration.password,
30
+ )
31
+ end
32
+ end
@@ -0,0 +1,101 @@
1
+ require "date"
2
+
3
+ module BacklogJp::Common
4
+ def self.included klass
5
+ klass.class_eval do
6
+ class << self
7
+ private
8
+
9
+ def find_by_seed method, attributes = {}
10
+ array_response = BacklogJp.client.send method
11
+
12
+ array_response.map do |item|
13
+ array.push new_from_response item
14
+ end
15
+ end
16
+
17
+ def cud_seed method, required_attributes, attributes = {}
18
+ require_attribute attributes, *required_attributes
19
+ new_from_response BacklogJp.client.send(method, attributes)
20
+ end
21
+
22
+ def new_from_response response
23
+ attributes = @attr_r + @attr_a
24
+ new *attributes.map{|attribute| response[attribute.to_s]}
25
+ end
26
+
27
+ def require_attribute attributes, *keys
28
+ fail ArgumentError, "#{keys.join ", "} is required." if keys.map{|key| attributes[key].nil?}.any?
29
+ end
30
+
31
+ def date_to_s attributes
32
+ attributes.each do |key, value|
33
+ attributes[key] = value.strftime "%Y%m%d" if value.is_a? Date
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def == other
41
+ eql? other
42
+ end
43
+
44
+ def eql? other
45
+ return false unless self.class == other.class
46
+
47
+ (attr_a + attr_r).all? do |attribute|
48
+ send(attribute) == other.send(attribute)
49
+ end
50
+ end
51
+
52
+ def changed? *attributes
53
+ attributes = attr_a if attributes.empty?
54
+
55
+ attributes.any? do |attribute|
56
+ attribute_changed? attribute
57
+ end
58
+ end
59
+
60
+ def changed_attributes
61
+ attr_a.inject Hash.new do |hash, attribute|
62
+ if changed? attribute
63
+ hash.merge attribute => send(attribute)
64
+ else
65
+ hash
66
+ end
67
+ end
68
+ end
69
+
70
+ def save
71
+ if changed?
72
+ saved = self.class.update attributes_to_save
73
+ @unsaved = nil
74
+ saved
75
+ else
76
+ fail "Attributes not changed."
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ def attributes_to_save
83
+ changed_attributes.reject {|key, value| value.nil?}.merge id: id
84
+ end
85
+
86
+ def unsaved
87
+ @unsaved ||= self.class.find_by id: id
88
+ end
89
+
90
+ def attribute_changed? attribute
91
+ send(attribute) != unsaved.send(attribute)
92
+ end
93
+
94
+ def attr_r
95
+ self.class.instance_variable_get :@attr_r
96
+ end
97
+
98
+ def attr_a
99
+ self.class.instance_variable_get :@attr_a
100
+ end
101
+ end
@@ -0,0 +1,16 @@
1
+ module BacklogJp
2
+ class Configuration
3
+ attr_accessor :space, :username, :password
4
+ end
5
+
6
+ class << self
7
+ attr_accessor :configuration
8
+
9
+ # Sets configuration with a block.
10
+ def configure &block
11
+ self.configuration ||= Configuration.new
12
+ yield configuration
13
+ configuration
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ require_relative "common"
2
+
3
+ %w[project user].each do |resource|
4
+ require_relative resource
5
+
6
+ Dir.glob "#{__dir__}/#{resource}/*.rb" do |file|
7
+ require file
8
+ end
9
+ end
@@ -0,0 +1,49 @@
1
+ module BacklogJp::Project::Common
2
+ def self.included klass
3
+ klass.class_eval do
4
+ class << self
5
+ private
6
+
7
+ def find_by_seed method, attributes = {}
8
+ require_attribute attributes, :project_id
9
+ array_response = BacklogJp.client.send method, attributes[:project_id]
10
+
11
+ array_response.map do |item|
12
+ new_from_response item.merge "project_id" => attributes[:project_id]
13
+ end
14
+ end
15
+
16
+ def cud_seed method, required_attributes, attributes = {}
17
+ require_attribute attributes, *required_attributes
18
+ new_from_response BacklogJp.client.send(method, attributes).merge "project_id" => attributes[:project_id]
19
+ end
20
+
21
+ def new_from_response response
22
+ attributes = @attr_r + @attr_a << :project_id
23
+ new *attributes.map{|attribute| response[attribute.to_s]}
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def destroy attributes = {}
30
+ attributes[:id] = id
31
+ attributes[:project_id] = @project_id
32
+ self.class.delete attributes
33
+ end
34
+
35
+ def issues
36
+ attributes = {project_id: @project_id}.merge self.class.to_s.gsub(/[A-Z]/) {|match| "_#{match.downcase}"}[1..-1].intern => id
37
+ BacklogJp::Project::Issue.find_by attributes
38
+ end
39
+
40
+ private
41
+
42
+ def attributes_to_save
43
+ changed_attributes.merge id: id, project_id: @project_id
44
+ end
45
+
46
+ def unsaved
47
+ @unsaved ||= self.class.find_by(project_id: @project_id).find {|item| id == item.id}
48
+ end
49
+ end
@@ -0,0 +1,32 @@
1
+ class BacklogJp::Project::Component
2
+ include BacklogJp::Common
3
+ include BacklogJp::Project::Common
4
+
5
+ attr_reader *@attr_r = %i[id]
6
+ attr_accessor *@attr_a = %i[name]
7
+
8
+ def initialize id, name, project_id
9
+ @id = id
10
+ @name = name
11
+ @project_id = project_id
12
+ end
13
+
14
+ class << self
15
+ def find_by attributes = {}
16
+ find_by_seed :get_components, attributes
17
+ end
18
+
19
+ def create attributes = {}
20
+ cud_seed :add_component, %i[project_id name], attributes
21
+ end
22
+
23
+ def update attributes = {}
24
+ cud_seed :update_component, %i[project_id id], attributes
25
+ end
26
+
27
+ def delete attributes = {}
28
+ require_attribute attributes, :project_id, :id
29
+ new_from_response BacklogJp.client.delete_component(attributes[:id]).merge "project_id" => attributes[:project_id]
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,105 @@
1
+ class BacklogJp::Project::Issue
2
+ include BacklogJp::Common
3
+ include BacklogJp::Project::Common
4
+
5
+ attr_reader *@attr_r = %i[id key url created_user_id created_on updated_on]
6
+ attr_accessor *@attr_a = %i[summery parent_issue_id description due_date start_date estimated_hours actual_hours issue_type priority resolution status components versions milestones assigner_id]
7
+
8
+ def initialize id, key, url, created_user_id, created_on, updated_on, summery, parent_issue_id, description, due_date, start_date, estimated_hours, actual_hours, issue_type, priority, resolution, status, components, versions, milestones, assigner_id
9
+ @id = id
10
+ @key = key
11
+ @url = url
12
+ @created_user_id = created_user_id
13
+ @created_on = created_on
14
+ @updated_on = updated_on
15
+ @summery = summery
16
+ @parent_issue_id = parent_issue_id
17
+ @description = description
18
+ @due_date = due_date
19
+ @start_date = start_date
20
+ @estimated_hours = estimated_hours
21
+ @actual_hours = actual_hours
22
+ @issue_type = issue_type
23
+ @priority = priority
24
+ @resolution = resolution
25
+ @status = status
26
+ @components = components
27
+ @versions = versions
28
+ @milestones = milestones
29
+ @assigner_id = assigner_id
30
+ end
31
+
32
+ class << self
33
+ def find_by attributes = {}
34
+ case attributes.keys
35
+ when ->(k){k.include? :id}
36
+ BacklogJp.client.get_issue attributes[:id]
37
+ when ->(k){k.include? :key}
38
+ BacklogJp.client.get_issue attributes[:key]
39
+ when ->(k){k.include? :project_id}
40
+ BacklogJp.client.find_issue find_issue_conditions attributes
41
+ else
42
+ raise "under construction"
43
+ end
44
+ end
45
+
46
+ def create attributes = {}
47
+ cud_seed :add_issue_type, %i[project_id name color], attributes
48
+ end
49
+
50
+ def update attributes = {}
51
+ cud_seed :update_issue_type, %i[project_id id], attributes
52
+ end
53
+
54
+ private
55
+
56
+ def find_issue_conditions attributes = {}
57
+ attributes.inject Hash.new do |hash, (key, value)|
58
+ hash.merge case key.intern
59
+ when :project_id, :issue_type_id, :version_id, :status_id, :priority_id, :assigner_id, :created_user_id, :resolution_id
60
+ find_by_key_camelize key, value
61
+ when :parent_child_issue
62
+ find_by_parent_child_issue_seed key, value
63
+ when :created_on_min, :created_on_max, :updated_on_min, :updated_on_max, :start_date_min, :start_date_max, :due_date_min, :due_date_max
64
+ find_by_value_date_to_s key, value
65
+ when :sort
66
+ {sort: value.to_s.upcase}
67
+ when :order
68
+ find_by_order_seed key, value
69
+ else
70
+ {key => value}
71
+ end
72
+ end
73
+ end
74
+
75
+ def find_by_key_camelize key, value
76
+ {key.to_s.gsub(/_[a-z]/){|match| match.chars.last.upcase}.intern => value}
77
+ end
78
+
79
+ def find_by_parent_child_issue_seed key, value
80
+ {
81
+ parent_child_issue: case value
82
+ when :except_child then 1
83
+ when :child then 2
84
+ when :not_related then 3
85
+ when :parent then 4
86
+ when 1..4 then value
87
+ else fail ArgumentError
88
+ end
89
+ }
90
+ end
91
+
92
+ def find_by_value_date_to_s key, value
93
+ {key => value.strftime("%Y%m%d")}
94
+ end
95
+
96
+ def find_by_order_seed key, value
97
+ {
98
+ order: case value
99
+ when 1, :asc, :ascend then 1
100
+ when 2, :desc, :descend then 2
101
+ end
102
+ }
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,32 @@
1
+ class BacklogJp::Project::IssueType
2
+ include BacklogJp::Common
3
+ include BacklogJp::Project::Common
4
+
5
+ attr_reader *@attr_r = %i[id]
6
+ attr_accessor *@attr_a = %i[name color]
7
+
8
+ def initialize id, name, color, project_id
9
+ @id = id
10
+ @name = name
11
+ @color = color
12
+ @project_id = project_id
13
+ end
14
+
15
+ class << self
16
+ def find_by attributes = {}
17
+ find_by_seed :get_issue_types, attributes
18
+ end
19
+
20
+ def create attributes = {}
21
+ cud_seed :add_issue_type, %i[project_id name color], attributes
22
+ end
23
+
24
+ def update attributes = {}
25
+ cud_seed :update_issue_type, %i[project_id id], attributes
26
+ end
27
+
28
+ def delete attributes = {}
29
+ cud_seed :delete_issue_type, %i[project_id id], attributes
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,48 @@
1
+ class BacklogJp::Project::Version
2
+ include BacklogJp::Common
3
+ include BacklogJp::Project::Common
4
+
5
+ attr_reader *@attr_r = %i[id]
6
+ attr_accessor *@attr_a = %i[name start_date due_date archived]
7
+
8
+ def initialize id, name, start_date, due_date, archived, project_id
9
+ @id = id
10
+ @name = name
11
+ @start_date = Date.parse start_date if start_date and start_date != ""
12
+ @due_date = Date.parse due_date if due_date and due_date != ""
13
+ @archived = archived
14
+ @project_id = project_id
15
+ end
16
+
17
+ class << self
18
+ def find_by attributes = {}
19
+ require_attribute attributes, :project_id
20
+
21
+ # This API... why doesn't it return due_date and start_date?
22
+ # http://www.backlog.jp/api/method2_1.html
23
+ array_response = BacklogJp.client.get_versions attributes[:project_id]
24
+
25
+ array_response.each do |version|
26
+ version["due_date"] = version["date"]
27
+ version.delete "date"
28
+ end
29
+
30
+ array_response.inject Array.new do |array, item|
31
+ array.push new_from_response item.merge "project_id" => attributes[:project_id]
32
+ end
33
+ end
34
+
35
+ def create attributes = {}
36
+ cud_seed :add_version, %i[project_id name color], date_to_s(attributes)
37
+ end
38
+
39
+ def update attributes = {}
40
+ cud_seed :update_version, %i[project_id id], date_to_s(attributes)
41
+ end
42
+
43
+ def delete attributes = {}
44
+ require_attribute attributes, :project_id, :id
45
+ new_from_response BacklogJp.client.delete_version(attributes[:id]).merge "project_id" => attributes[:project_id]
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,130 @@
1
+ class BacklogJp::Project
2
+ include BacklogJp::Common
3
+
4
+ attr_reader *@attr_r = %i[id url created_on updated_on]
5
+ attr_accessor *@attr_a = %i[name key use_parent_child_issue text_formatting_rule archived use_chart]
6
+
7
+ def initialize id, url, created_on, updated_on, name, key, use_parent_child_issue, text_formatting_rule, archived, use_chart
8
+ @id = id
9
+ @url = url
10
+ @created_on = DateTime.parse created_on if created_on
11
+ @updated_on = DateTime.parse updated_on if updated_on
12
+ @name = name
13
+ @key = key
14
+ @use_parent_child_issue = use_parent_child_issue
15
+ @text_formatting_rule = text_formatting_rule
16
+ @archived = archived
17
+ @use_chart = use_chart
18
+ end
19
+
20
+ class << self
21
+ # Returns all projects as a array.
22
+ def all
23
+ array_response = begin
24
+ BacklogJp.client.admin_get_projects
25
+ rescue
26
+ BacklogJp.client.get_projects
27
+ end
28
+
29
+ array_response.map do |project|
30
+ new_from_response project
31
+ end
32
+ end
33
+
34
+ # Returns a array of specified attribute from all projects.
35
+ def distinct *attributes
36
+ fail ArgumentError, "Specify at least one attribute." if attributes.empty?
37
+
38
+ all.map do |item|
39
+ if attributes.size == 1
40
+ item.send attributes.first
41
+ else
42
+ attributes.map do |attribute|
43
+ item.send attribute
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ def find_by attributes = {}
50
+ new_from_response BacklogJp.client.get_project case attributes.keys
51
+ when ->(k){k.include? :id}
52
+ attributes[:id]
53
+ when ->(k){k.include? :key}
54
+ attributes[:key].to_s
55
+ else
56
+ fail ArgumentError, "Give a hash with :id (Integer) or :key (Symbol or String) as a key."
57
+ end
58
+ end
59
+
60
+ def [] arg
61
+ case arg
62
+ when Integer then find_by id: arg
63
+ when String, Symbol then find_by key: arg.to_s
64
+ else fail ArgumentError, "Give a Integer (for id), String or Symbol (for key)."
65
+ end
66
+ end
67
+
68
+ def create attributes = {}
69
+ cud_seed :admin_add_project, %i[key name], attributes
70
+ end
71
+
72
+ def update attributes = {}
73
+ cud_seed :admin_update_project, %i[id], attributes
74
+ end
75
+
76
+ def delete attributes = {}
77
+ require_attribute attributes, :id
78
+ new_from_response BacklogJp.client.admin_delete_project attributes[:id]
79
+ end
80
+ end
81
+
82
+ alias_method :created_at, :created_on
83
+ alias_method :updated_at, :updated_on
84
+
85
+ def components
86
+ self.class::Component.find_by project_id: id
87
+ end
88
+
89
+ alias_method :categories, :components
90
+
91
+ def add_component attributes
92
+ attributes[:project_id] = id
93
+ self.class::Component.create attributes
94
+ end
95
+
96
+ alias_method :add_category, :add_component
97
+ alias_method :create_component, :add_component
98
+ alias_method :create_category, :add_component
99
+
100
+ def versions
101
+ self.class::Version.find_by project_id: id
102
+ end
103
+
104
+ alias_method :milestones, :versions
105
+
106
+ def add_version attributes
107
+ attributes[:project_id] = id
108
+ self.class::Version.create attributes
109
+ end
110
+
111
+ alias_method :add_milestone, :add_version
112
+ alias_method :create_version, :add_version
113
+ alias_method :create_milestone, :add_version
114
+
115
+ def issue_types
116
+ self.class::IssueType.find_by project_id: id
117
+ end
118
+
119
+ def add_issue_type attributes
120
+ attributes[:project_id] = id
121
+ self.class::IssueType.create attributes
122
+ end
123
+
124
+ alias_method :create_issue_type, :add_issue_type
125
+
126
+ def issues attributes = {}
127
+ attributes.merge project_id: id
128
+ self.class::Issue.find_by attributes
129
+ end
130
+ end
File without changes
data/lib/backlog_jp.rb ADDED
@@ -0,0 +1,3 @@
1
+ %w[_version client interface].each do |file|
2
+ require_relative "backlog_jp/#{file}"
3
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: backlog_jp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
5
+ platform: ruby
6
+ authors:
7
+ - y13i
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: A Rubyish, object-oriented interface for project management service Backlog's
42
+ XML-RPC API.
43
+ email:
44
+ - email@y13i.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - ".gitignore"
50
+ - Gemfile
51
+ - LICENSE.txt
52
+ - README.md
53
+ - Rakefile
54
+ - TODO.md
55
+ - backlog_jp.gemspec
56
+ - lib/backlog_jp.rb
57
+ - lib/backlog_jp/_version.rb
58
+ - lib/backlog_jp/client.rb
59
+ - lib/backlog_jp/common.rb
60
+ - lib/backlog_jp/configuration.rb
61
+ - lib/backlog_jp/interface.rb
62
+ - lib/backlog_jp/project.rb
63
+ - lib/backlog_jp/project/common.rb
64
+ - lib/backlog_jp/project/component.rb
65
+ - lib/backlog_jp/project/issue.rb
66
+ - lib/backlog_jp/project/issue_type.rb
67
+ - lib/backlog_jp/project/version.rb
68
+ - lib/backlog_jp/user.rb
69
+ homepage: http://github.com/y13i/backlog_jp
70
+ licenses:
71
+ - MIT
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubyforge_project:
89
+ rubygems_version: 2.2.2
90
+ signing_key:
91
+ specification_version: 4
92
+ summary: A Rubyish interface for Backlog.
93
+ test_files: []