openproject_api 0.1.1
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/Gemfile +7 -0
- data/Gemfile.lock +40 -0
- data/Rakefile +10 -0
- data/files.txt +17 -0
- data/lib/openproject_api/api.rb +67 -0
- data/lib/openproject_api/client/projects.rb +33 -0
- data/lib/openproject_api/client/statuses.rb +13 -0
- data/lib/openproject_api/client/time_entries.rb +29 -0
- data/lib/openproject_api/client/types.rb +13 -0
- data/lib/openproject_api/client/work_packages.rb +69 -0
- data/lib/openproject_api/client.rb +15 -0
- data/lib/openproject_api/objectified_hash.rb +44 -0
- data/lib/openproject_api/version.rb +3 -0
- data/lib/openproject_api.rb +6 -0
- data/openproject_api.gemspec +20 -0
- metadata +58 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 68cc46b14855c5f876562d29894f8178743f53d3b4b4b69aadbefac7122e1d3a
|
4
|
+
data.tar.gz: f82e5b462670ba24fadc94df44d5b48d5911d4fa9126448ddf6994d9ce3fb807
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e574c9fbcd7aa834ef87f1cd1a247bddbeb41d78525644a69fffb7101e2d6b7cc3d8c2c01999483a028c7a743f42dbc92081808d546adcac08eaca5f9aa19a03
|
7
|
+
data.tar.gz: 653926c310c30d04a4eeacdf11f58de21903182d6ff42a935c9833e4f2049da65539f2dfd329e0b82f450d0206f61683a62cf21a3e96bacf0e166e97b08f7944
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
openproject_api (0.1.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
coderay (1.1.3)
|
10
|
+
diff-lcs (1.4.4)
|
11
|
+
method_source (1.0.0)
|
12
|
+
pry (0.13.1)
|
13
|
+
coderay (~> 1.1)
|
14
|
+
method_source (~> 1.0)
|
15
|
+
rake (13.0.1)
|
16
|
+
rspec (3.9.0)
|
17
|
+
rspec-core (~> 3.9.0)
|
18
|
+
rspec-expectations (~> 3.9.0)
|
19
|
+
rspec-mocks (~> 3.9.0)
|
20
|
+
rspec-core (3.9.3)
|
21
|
+
rspec-support (~> 3.9.3)
|
22
|
+
rspec-expectations (3.9.2)
|
23
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
24
|
+
rspec-support (~> 3.9.0)
|
25
|
+
rspec-mocks (3.9.1)
|
26
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
27
|
+
rspec-support (~> 3.9.0)
|
28
|
+
rspec-support (3.9.3)
|
29
|
+
|
30
|
+
PLATFORMS
|
31
|
+
ruby
|
32
|
+
|
33
|
+
DEPENDENCIES
|
34
|
+
openproject_api!
|
35
|
+
pry
|
36
|
+
rake (~> 13.0)
|
37
|
+
rspec (~> 3.0)
|
38
|
+
|
39
|
+
BUNDLED WITH
|
40
|
+
1.17.3
|
data/Rakefile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
task :generate_files do
|
9
|
+
File.write(File.expand_path('files.txt', __dir__), Dir['lib/**/*', 'Gemfile', 'Gemfile.lock', 'openproject-api.gemspec', 'Rakefile', 'files.txt'].join("\n"))
|
10
|
+
end
|
data/files.txt
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
lib/openproject_api
|
2
|
+
lib/openproject_api/version.rb
|
3
|
+
lib/openproject_api/client
|
4
|
+
lib/openproject_api/client/time_entries.rb
|
5
|
+
lib/openproject_api/client/work_packages.rb
|
6
|
+
lib/openproject_api/client/statuses.rb
|
7
|
+
lib/openproject_api/client/types.rb
|
8
|
+
lib/openproject_api/client/projects.rb
|
9
|
+
lib/openproject_api/objectified_hash.rb
|
10
|
+
lib/openproject_api/api.rb
|
11
|
+
lib/openproject_api/client.rb
|
12
|
+
lib/openproject_api.rb
|
13
|
+
Gemfile
|
14
|
+
Gemfile.lock
|
15
|
+
openproject_api.gemspec
|
16
|
+
Rakefile
|
17
|
+
files.txt
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/https'
|
3
|
+
require 'json'
|
4
|
+
require_relative 'objectified_hash'
|
5
|
+
|
6
|
+
module OpenprojectApi
|
7
|
+
class Api
|
8
|
+
attr_accessor :endpoint
|
9
|
+
attr_accessor :apikey
|
10
|
+
|
11
|
+
def initialize(endpoint:, apikey:)
|
12
|
+
self.endpoint = endpoint
|
13
|
+
self.apikey = apikey
|
14
|
+
end
|
15
|
+
|
16
|
+
def request(resource, query: {}, &block)
|
17
|
+
uri = URI.join(endpoint, resource)
|
18
|
+
uri.query = URI.encode_www_form(query)
|
19
|
+
|
20
|
+
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme=='https') do |http|
|
21
|
+
request = yield(uri)
|
22
|
+
|
23
|
+
request.basic_auth('apikey', apikey)
|
24
|
+
|
25
|
+
http.request(request)
|
26
|
+
end
|
27
|
+
|
28
|
+
if response.is_a?(Net::HTTPSuccess)
|
29
|
+
ObjectifiedHash.new(JSON.parse(response.body))
|
30
|
+
else
|
31
|
+
response.error!
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def get(resource, *args)
|
36
|
+
request(resource, *args) do |uri|
|
37
|
+
Net::HTTP::Get.new(uri.request_uri)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def post(resource, body, *args)
|
42
|
+
request(resource, *args) do |uri|
|
43
|
+
Net::HTTP::Post.new(uri.request_uri).tap do |request|
|
44
|
+
request['Content-Type'] = 'application/json'
|
45
|
+
request['Accept' ] = 'application/json'
|
46
|
+
request.body = body.to_json
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def patch(resource, body, *args)
|
52
|
+
request(resource, *args) do |uri|
|
53
|
+
Net::HTTP::Patch.new(uri.request_uri).tap do |request|
|
54
|
+
request['Content-Type'] = 'application/json'
|
55
|
+
request['Accept' ] = 'application/json'
|
56
|
+
request.body = body.to_json
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def delete(resource, *args)
|
62
|
+
request(resource, *args) do |uri|
|
63
|
+
Net::HTTP::Delete.new(uri.request_uri)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module OpenprojectApi
|
2
|
+
class Client
|
3
|
+
module Projects
|
4
|
+
def projects(*args)
|
5
|
+
get('/api/v3/projects', *args)
|
6
|
+
end
|
7
|
+
|
8
|
+
def project(project_id, *args)
|
9
|
+
get("/api/v3/projects/#{project_id}", *args)
|
10
|
+
end
|
11
|
+
|
12
|
+
def patch_project(project_id, body, *args)
|
13
|
+
patch("/api/v3/projects/#{project_id}", body, *args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_project(body, *args)
|
17
|
+
get('/api/v3/projects', body, *args)
|
18
|
+
end
|
19
|
+
|
20
|
+
def delete_project(project_id, *args)
|
21
|
+
delete("/api/v3/projects/#{project_id}", *args)
|
22
|
+
end
|
23
|
+
|
24
|
+
def project_types(project_id, *args)
|
25
|
+
get("/api/v3/projects/#{project_id}/types", *args)
|
26
|
+
end
|
27
|
+
|
28
|
+
def project_available_parent_project_candidates(*args)
|
29
|
+
get('/api/v3/projects/available_parent_projects', *args)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module OpenprojectApi
|
2
|
+
class Client
|
3
|
+
module TimeEntries
|
4
|
+
def time_entries(*args)
|
5
|
+
get('/api/v3/time_entries', *args)
|
6
|
+
end
|
7
|
+
|
8
|
+
def time_entry(time_entry_id, *args)
|
9
|
+
get("/api/v3/time_entries/#{time_entry_id}", *args)
|
10
|
+
end
|
11
|
+
|
12
|
+
def patch_time_entry(time_entry_id, body, *args)
|
13
|
+
patch("/api/v3/time_entries/#{time_entry_id}", body, *args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_time_entry(body, *args)
|
17
|
+
post('/api/v3/time_entries', body, *args)
|
18
|
+
end
|
19
|
+
|
20
|
+
def delete_time_entry(time_entry_id, *args)
|
21
|
+
delete("/api/v3/time_entries/#{time_entry_id}", *args)
|
22
|
+
end
|
23
|
+
|
24
|
+
def time_entries_available_projects(*args)
|
25
|
+
get('/api/v3/time_entries/available_projects', *args)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module OpenprojectApi
|
2
|
+
class Client
|
3
|
+
module WorkPackages
|
4
|
+
def work_packages(*args)
|
5
|
+
get('/api/v3/work_packages', *args)
|
6
|
+
end
|
7
|
+
|
8
|
+
def work_package(work_package_id, *args)
|
9
|
+
get("/api/v3/work_packages/#{work_package_id}", *args)
|
10
|
+
end
|
11
|
+
|
12
|
+
def patch_work_package(work_package_id, body, *args)
|
13
|
+
patch("/api/v3/work_packages/#{work_package_id}", body, *args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_work_package(body, *args)
|
17
|
+
post('/api/v3/work_packages', body, *args)
|
18
|
+
end
|
19
|
+
|
20
|
+
def delete_work_package(work_package_id, *args)
|
21
|
+
delete("/api/v3/work_packages/#{work_package_id}", *args)
|
22
|
+
end
|
23
|
+
|
24
|
+
def work_package_relations(work_package_id, *args)
|
25
|
+
get("/api/v3/work_packages/#{work_package_id}/relations", *args)
|
26
|
+
end
|
27
|
+
|
28
|
+
def add_work_package_relation(work_package_id, body, *args)
|
29
|
+
post("/api/v3/work_packages/#{work_package_id}/relations", body, *args)
|
30
|
+
end
|
31
|
+
|
32
|
+
def work_package_available_relation_candidates(work_package_id, *args)
|
33
|
+
get("/api/v3/work_packages/#{work_package_id}/available_relation_candidates", *args)
|
34
|
+
end
|
35
|
+
|
36
|
+
def work_package_watchers(work_package_id, *args)
|
37
|
+
get("/api/v3/work_packages/#{work_package_id}/watchers", *args)
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_work_package_watcher(work_package_id, body, *args)
|
41
|
+
post("/api/v3/work_packages/#{work_package_id}/watchers", body, *args)
|
42
|
+
end
|
43
|
+
|
44
|
+
def delete_work_package_watcher(work_package_id, watcher_id, *args)
|
45
|
+
get("/api/v3/work_packages/#{work_package_id}/watchers/#{watcher_id}", *args)
|
46
|
+
end
|
47
|
+
|
48
|
+
def work_package_available_watchers(work_package_id, *args)
|
49
|
+
get("/api/v3/work_packages/#{work_package_id}/available_watchers", *args)
|
50
|
+
end
|
51
|
+
|
52
|
+
def work_package_activities(work_package_id, *args)
|
53
|
+
get("/api/v3/work_packages/#{work_package_id}/activities", *args)
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_work_package_activity(work_package_id, body, *args)
|
57
|
+
post("/api/v3/work_packages/#{work_package_id}/activities", body, *args)
|
58
|
+
end
|
59
|
+
|
60
|
+
def work_package_available_assignees(work_package_id, *args)
|
61
|
+
get("/api/v3/work_packages/#{work_package_id}/available_assignees", *args)
|
62
|
+
end
|
63
|
+
|
64
|
+
def work_package_available_responsibles(work_package_id, *args)
|
65
|
+
get("/api/v3/work_packages/#{work_package_id}/available_responsibles", *args)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require_relative 'api'
|
2
|
+
|
3
|
+
module OpenprojectApi
|
4
|
+
class Client < Api
|
5
|
+
Dir[File.expand_path('client/*.rb', __dir__)].each do |f|
|
6
|
+
require f
|
7
|
+
end
|
8
|
+
|
9
|
+
include Projects
|
10
|
+
include Statuses
|
11
|
+
include TimeEntries
|
12
|
+
include Types
|
13
|
+
include WorkPackages
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Slightly modified version from https://github.com/NARKOZ/gitlab/blob/3dd41722670570069693cc9b84c73f475d95e6be/lib/gitlab/objectified_hash.rb
|
2
|
+
|
3
|
+
module OpenprojectApi
|
4
|
+
class ObjectifiedHash
|
5
|
+
def initialize(hash)
|
6
|
+
@hash = hash
|
7
|
+
@data = hash.each_with_object({}) do |(key, value), data|
|
8
|
+
value = self.class.new(value) if value.is_a? Hash
|
9
|
+
value = value.map { |v| v.is_a?(Hash) ? self.class.new(v) : v } if value.is_a? Array
|
10
|
+
data[key.to_s] = value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_hash
|
15
|
+
@hash
|
16
|
+
end
|
17
|
+
alias to_h to_hash
|
18
|
+
|
19
|
+
def inspect
|
20
|
+
"#<#{self.class}:#{object_id} {hash: #{@hash.inspect}}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def [](key)
|
24
|
+
@data[key]
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def method_missing(method_name, *args, &block)
|
30
|
+
if @data.key?(method_name.to_s)
|
31
|
+
@data[method_name.to_s]
|
32
|
+
elsif @data.respond_to?(method_name)
|
33
|
+
@data.send(method_name, *args, &block)
|
34
|
+
else
|
35
|
+
super
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def respond_to_missing?(method_name, include_private = false)
|
40
|
+
@hash.keys.map(&:to_sym).include?(method_name.to_sym) || super
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'lib/openproject_api/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = 'openproject_api'
|
5
|
+
spec.version = OpenprojectApi::VERSION
|
6
|
+
spec.authors = ['expeehaa']
|
7
|
+
spec.email = ['expeehaa@outlook.com']
|
8
|
+
|
9
|
+
spec.summary = %q{Ruby interface for the OpenProject API.}
|
10
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
11
|
+
|
12
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
13
|
+
|
14
|
+
# Specify which files should be added to the gem when it is released.
|
15
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
16
|
+
spec.files = File.read(File.expand_path('files.txt', __dir__)).split("\n")
|
17
|
+
spec.bindir = 'exe'
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: openproject_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- expeehaa
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-10-22 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
- expeehaa@outlook.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- Gemfile
|
21
|
+
- Gemfile.lock
|
22
|
+
- Rakefile
|
23
|
+
- files.txt
|
24
|
+
- lib/openproject_api.rb
|
25
|
+
- lib/openproject_api/api.rb
|
26
|
+
- lib/openproject_api/client.rb
|
27
|
+
- lib/openproject_api/client/projects.rb
|
28
|
+
- lib/openproject_api/client/statuses.rb
|
29
|
+
- lib/openproject_api/client/time_entries.rb
|
30
|
+
- lib/openproject_api/client/types.rb
|
31
|
+
- lib/openproject_api/client/work_packages.rb
|
32
|
+
- lib/openproject_api/objectified_hash.rb
|
33
|
+
- lib/openproject_api/version.rb
|
34
|
+
- openproject_api.gemspec
|
35
|
+
homepage:
|
36
|
+
licenses: []
|
37
|
+
metadata:
|
38
|
+
allowed_push_host: https://rubygems.org
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 2.3.0
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubygems_version: 3.0.6
|
55
|
+
signing_key:
|
56
|
+
specification_version: 4
|
57
|
+
summary: Ruby interface for the OpenProject API.
|
58
|
+
test_files: []
|