youtrack_client 1.0.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/.github/workflows/specs.yml +24 -0
- data/.gitignore +15 -0
- data/.rspec +1 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile +9 -0
- data/LICENSE +21 -0
- data/README.md +112 -0
- data/lib/youtrack/client.rb +78 -0
- data/lib/youtrack/models/base.rb +114 -0
- data/lib/youtrack/models/field_style.rb +11 -0
- data/lib/youtrack/models/issue.rb +26 -0
- data/lib/youtrack/models/issue_custom_field.rb +11 -0
- data/lib/youtrack/models/issue_custom_field_value.rb +19 -0
- data/lib/youtrack/models/project.rb +21 -0
- data/lib/youtrack/models/tag.rb +13 -0
- data/lib/youtrack/models/user.rb +21 -0
- data/lib/youtrack/resources/base.rb +54 -0
- data/lib/youtrack/resources/issues.rb +44 -0
- data/lib/youtrack/resources/projects.rb +25 -0
- data/lib/youtrack/resources/users.rb +30 -0
- data/lib/youtrack/version.rb +3 -0
- data/lib/youtrack.rb +7 -0
- data/lib/youtrack_client.rb +1 -0
- data/youtrack_client.gemspec +31 -0
- metadata +113 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: bf83ce5a8edbb921abd47bbeed0298949224101d6ad492b0d8016c5298e6fb9e
|
4
|
+
data.tar.gz: 479af90f64ccb10ebd5ac1cb7931b12c2704dbf9ac75e1437f2d61fcd4a17bc2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 429008de43454915497287709edc27ee985d4f232afa6de71f907069859e518ab7c87a94af4d3a67d6ada2f922cf77a552e2340ddafba7bd2f85314f29b4b332
|
7
|
+
data.tar.gz: '08a34367fa8ef12fbd5a87272e5d6fa86134a832ad6a8ac4a985e1436cc5b8363e3cb01357e3dc139706d5ded1707e617631f1332d233a87dec10a88a3ad478f'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
name: 🛡 Specs
|
2
|
+
|
3
|
+
on: [push]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
specs:
|
7
|
+
name: Specs
|
8
|
+
runs-on: ubuntu-latest
|
9
|
+
|
10
|
+
steps:
|
11
|
+
- name: Checkout
|
12
|
+
uses: actions/checkout@v2
|
13
|
+
with:
|
14
|
+
fetch-depth: 1
|
15
|
+
|
16
|
+
- name: Set up Ruby
|
17
|
+
uses: ruby/setup-ruby@v1
|
18
|
+
with:
|
19
|
+
ruby-version: '2.7.6'
|
20
|
+
bundler-cache: true
|
21
|
+
|
22
|
+
- name: Run specs
|
23
|
+
run: |
|
24
|
+
bundle exec rspec
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--require spec_helper
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2019 Shane Hofstetter
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+

|
2
|
+
|
3
|
+
# youtrack-rest-client
|
4
|
+
|
5
|
+
Ruby client for the [Youtrack REST API](https://www.jetbrains.com/help/youtrack/standalone/youtrack-rest-api-reference.html)
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
TBD
|
12
|
+
|
13
|
+
### Authentication
|
14
|
+
|
15
|
+
**With your permanent token (
|
16
|
+
see [Manage-Permanent-Token](https://www.jetbrains.com/help/youtrack/incloud/Manage-Permanent-Token.html)):**
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
require 'youtrack'
|
20
|
+
|
21
|
+
# 1. create an instance, pass your youtrack instance url and access token
|
22
|
+
youtrack = Youtrack::Client.new(base_url: "https://example.myjetbrains.com", token: "perm:your-token")
|
23
|
+
|
24
|
+
# 2. make requests!
|
25
|
+
youtrack.users.current.email
|
26
|
+
```
|
27
|
+
|
28
|
+
### [Users](https://www.jetbrains.com/help/youtrack/incloud/api-entity-User.html)
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
|
32
|
+
# get the current user
|
33
|
+
youtrack.users.current
|
34
|
+
|
35
|
+
# get all users
|
36
|
+
youtrack.users.all
|
37
|
+
|
38
|
+
# search users
|
39
|
+
youtrack.users.all("query" => "admin")
|
40
|
+
|
41
|
+
# get a user by id
|
42
|
+
youtrack.users.by_id('1-1')
|
43
|
+
|
44
|
+
```
|
45
|
+
|
46
|
+
### [Projects](https://www.jetbrains.com/help/youtrack/incloud/api-entity-Project.html)
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
|
50
|
+
# get all projects
|
51
|
+
youtrack.projects.all
|
52
|
+
|
53
|
+
# search projects
|
54
|
+
youtrack.projects.all(query: "DEMO")
|
55
|
+
|
56
|
+
# get a project by its id
|
57
|
+
youtrack.projects.by_id('0-0')
|
58
|
+
|
59
|
+
```
|
60
|
+
|
61
|
+
### [Issues](https://www.jetbrains.com/help/youtrack/incloud/api-entity-Issue.html)
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
# search/list issues
|
65
|
+
youtrack.issues.search('project: T1')
|
66
|
+
```
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
# get issue by id
|
70
|
+
youtrack.issues.by_id('T1-2')
|
71
|
+
```
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
# delete an issue
|
75
|
+
youtrack.issues.delete('2-2')
|
76
|
+
```
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
# create a new issue
|
80
|
+
youtrack.issues.create({
|
81
|
+
summary: 'lorem ipsum',
|
82
|
+
description: 'created using rest api',
|
83
|
+
project: {
|
84
|
+
id: '0-0'
|
85
|
+
}
|
86
|
+
})
|
87
|
+
# you can also pass a model instance
|
88
|
+
youtrack.issues.create(Youtrack::Models::Issue.new(summary: "demo issue",
|
89
|
+
description: "demo issue description",
|
90
|
+
project: client.projects.by_id("0-0")))
|
91
|
+
|
92
|
+
|
93
|
+
```
|
94
|
+
|
95
|
+
### [Commands](https://www.jetbrains.com/help/youtrack/incloud/api-entity-CommandList.html)
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
# execute command for issue(s)
|
99
|
+
youtrack.issues.command("State Open", client.issues.search("DEMO-12"))
|
100
|
+
# pass the ids directly
|
101
|
+
youtrack.issues.command("State Open", %w[T1-1 T1-2 T1-3])
|
102
|
+
```
|
103
|
+
|
104
|
+
## Contributing
|
105
|
+
|
106
|
+
If you encounter any missing features or bugs, you're welcome to open an Issue! PRs are welcome too ;-)
|
107
|
+
|
108
|
+
1. Fork it ( https://github.com/shanehofstetter/youtrack-rest-client-ruby/fork )
|
109
|
+
2. Create your feature branch (git checkout -b my-new-feature)
|
110
|
+
3. Commit your changes (git commit -am 'Add some feature')
|
111
|
+
4. Push to the branch (git push origin my-new-feature)
|
112
|
+
5. Create a new Pull Request
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require "active_support"
|
3
|
+
require 'active_support/core_ext'
|
4
|
+
|
5
|
+
module Youtrack
|
6
|
+
class Client
|
7
|
+
attr_reader :base_url, :token
|
8
|
+
|
9
|
+
def initialize(base_url:, token:)
|
10
|
+
@base_url = normalize_base_url(base_url)
|
11
|
+
@token = token
|
12
|
+
RestClient.log = $stdout if ENV["DEBUG"]
|
13
|
+
end
|
14
|
+
|
15
|
+
def users
|
16
|
+
@users ||= Resources::Users.new(client: self)
|
17
|
+
end
|
18
|
+
|
19
|
+
def issues
|
20
|
+
@issues ||= Resources::Issues.new(client: self)
|
21
|
+
end
|
22
|
+
|
23
|
+
def projects
|
24
|
+
@projects ||= Resources::Projects.new(client: self)
|
25
|
+
end
|
26
|
+
|
27
|
+
def get(path, options = {})
|
28
|
+
execute(:get, path, options)
|
29
|
+
end
|
30
|
+
|
31
|
+
def post(path, payload, options = {})
|
32
|
+
execute(:post, path, options.merge(payload: payload))
|
33
|
+
end
|
34
|
+
|
35
|
+
def delete(path, options = {})
|
36
|
+
execute(:delete, path, options)
|
37
|
+
end
|
38
|
+
|
39
|
+
def execute(method, path, options = {})
|
40
|
+
RestClient::Request.execute(
|
41
|
+
method: method,
|
42
|
+
url: request_url(path),
|
43
|
+
headers: default_headers
|
44
|
+
.merge(options.delete(:headers) || {})
|
45
|
+
.merge(params: options.delete(:params) || {}),
|
46
|
+
**options
|
47
|
+
)
|
48
|
+
rescue RestClient::Exception => e
|
49
|
+
if e.http_body.present?
|
50
|
+
e.message = e.http_body
|
51
|
+
end
|
52
|
+
raise e
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def default_headers
|
58
|
+
{
|
59
|
+
"Authorization" => "Bearer #{token}",
|
60
|
+
'Content-Type' => :json
|
61
|
+
}
|
62
|
+
end
|
63
|
+
|
64
|
+
def request_url(path)
|
65
|
+
[base_url, path].join("")
|
66
|
+
end
|
67
|
+
|
68
|
+
def normalize_base_url(base_url)
|
69
|
+
if base_url.match(/\/$/)
|
70
|
+
base_url = base_url[0..-2]
|
71
|
+
end
|
72
|
+
unless base_url.match(/api$/i)
|
73
|
+
base_url += "/api"
|
74
|
+
end
|
75
|
+
base_url
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module Youtrack
|
2
|
+
module Models
|
3
|
+
class Base
|
4
|
+
|
5
|
+
class Field
|
6
|
+
attr_accessor :name, :extended, :model, :type
|
7
|
+
|
8
|
+
def initialize(name:, extended: nil, model: nil, type: nil)
|
9
|
+
@name = name
|
10
|
+
@extended = extended
|
11
|
+
@model = model
|
12
|
+
@type = type
|
13
|
+
end
|
14
|
+
|
15
|
+
def extended?
|
16
|
+
extended
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_query
|
20
|
+
if model.present?
|
21
|
+
model_fields = model.minimal_fields
|
22
|
+
"#{name}(#{model_fields.map(&:to_query).join(",")})"
|
23
|
+
else
|
24
|
+
name
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
"Field name=#{name} extended=#{extended} model=#{model} type=#{type}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def attr_name
|
33
|
+
name.underscore
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class << self
|
38
|
+
attr_reader :fields
|
39
|
+
|
40
|
+
def all_fields
|
41
|
+
fields
|
42
|
+
end
|
43
|
+
|
44
|
+
def minimal_fields
|
45
|
+
fields.reject(&:extended?)
|
46
|
+
end
|
47
|
+
|
48
|
+
def field(name, extended: false)
|
49
|
+
@fields ||= []
|
50
|
+
@fields << Field.new(name: name, extended: extended)
|
51
|
+
register_field_as_attr(@fields.last)
|
52
|
+
end
|
53
|
+
|
54
|
+
def has_many(name, model, extended: true)
|
55
|
+
@fields ||= []
|
56
|
+
@fields << Field.new(name: name, extended: extended, model: model, type: :many)
|
57
|
+
register_field_as_attr(@fields.last)
|
58
|
+
end
|
59
|
+
|
60
|
+
def has_one(name, model, extended: true)
|
61
|
+
@fields ||= []
|
62
|
+
@fields << Field.new(name: name, extended: extended, model: model, type: :one)
|
63
|
+
register_field_as_attr(@fields.last)
|
64
|
+
end
|
65
|
+
|
66
|
+
def register_field_as_attr(field)
|
67
|
+
attr_accessor field.attr_name
|
68
|
+
end
|
69
|
+
|
70
|
+
def from_json(json)
|
71
|
+
if json.is_a?(Array)
|
72
|
+
json.map { |item| from_json(item) }
|
73
|
+
else
|
74
|
+
self.new.tap do |instance|
|
75
|
+
json.each do |key, value|
|
76
|
+
field = fields.find { |f| f.name == key }
|
77
|
+
next unless field.present?
|
78
|
+
field_value = field.model.present? && value.present? ? field.model.from_json(value) : value
|
79
|
+
instance.send(field.attr_name + "=", field_value)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def initialize(attrs = {})
|
87
|
+
attrs.each do |k, v|
|
88
|
+
next unless respond_to?(k.to_s + "=")
|
89
|
+
send(k.to_s + "=", v)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def to_h
|
94
|
+
self.class.all_fields.map do |field|
|
95
|
+
value = send(field.attr_name)
|
96
|
+
if field.model.present?
|
97
|
+
if value.is_a?(Array)
|
98
|
+
value = value.map(&:to_h)
|
99
|
+
elsif value.present?
|
100
|
+
value = value.to_h
|
101
|
+
end
|
102
|
+
end
|
103
|
+
[field.attr_name, value]
|
104
|
+
end.to_h
|
105
|
+
end
|
106
|
+
alias_method :to_hash, :to_h
|
107
|
+
|
108
|
+
def as_payload
|
109
|
+
to_h.compact.to_json
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Youtrack
|
2
|
+
module Models
|
3
|
+
class Issue < Base
|
4
|
+
|
5
|
+
field "id"
|
6
|
+
field "idReadable"
|
7
|
+
field "numberInProject"
|
8
|
+
field "created"
|
9
|
+
field "updated"
|
10
|
+
field "resolved"
|
11
|
+
has_one "project", Project, extended: false
|
12
|
+
field "summary"
|
13
|
+
field "description"
|
14
|
+
|
15
|
+
has_one "reporter", User, extended: true
|
16
|
+
has_one "updater", User, extended: true
|
17
|
+
field "wikifiedDescription", extended: true
|
18
|
+
field "usesMarkdown", extended: true
|
19
|
+
has_many "fields", IssueCustomField, extended: true
|
20
|
+
field "isDraft", extended: true
|
21
|
+
has_many "tags", Tag, extended: true
|
22
|
+
# has_many "links", Link, extended: true
|
23
|
+
# has_many "comments", Comment, extended: true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Youtrack
|
2
|
+
module Models
|
3
|
+
class IssueCustomFieldValue < Base
|
4
|
+
|
5
|
+
field "id"
|
6
|
+
field "name"
|
7
|
+
field "localizedName"
|
8
|
+
field "fullName"
|
9
|
+
field "login"
|
10
|
+
field "avatarUrl"
|
11
|
+
field "isResolved"
|
12
|
+
field "text"
|
13
|
+
field "minutes"
|
14
|
+
field "presentation"
|
15
|
+
has_one "color", FieldStyle, extended: false
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Youtrack
|
2
|
+
module Models
|
3
|
+
class Project < Base
|
4
|
+
|
5
|
+
field "id"
|
6
|
+
field "name"
|
7
|
+
field "shortName"
|
8
|
+
field "description"
|
9
|
+
field "archived"
|
10
|
+
|
11
|
+
has_one "createdBy", User, extended: true
|
12
|
+
# has_many "fields", Field, extended: true
|
13
|
+
field "fromEmail", extended: true
|
14
|
+
field "hubResourceId", extended: true
|
15
|
+
field "iconUrl", extended: true
|
16
|
+
field "timeTrackingEnabled", extended: true
|
17
|
+
has_one "leader", User, extended: true
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Youtrack
|
2
|
+
module Models
|
3
|
+
class User < Base
|
4
|
+
|
5
|
+
field "id"
|
6
|
+
field "email"
|
7
|
+
field "fullName"
|
8
|
+
field "login"
|
9
|
+
field "name"
|
10
|
+
|
11
|
+
field "avatarUrl", extended: true
|
12
|
+
field "banned", extended: true
|
13
|
+
field "online", extended: true
|
14
|
+
field "guest", extended: true
|
15
|
+
field "jabberAccountName", extended: true
|
16
|
+
field "ringId", extended: true
|
17
|
+
|
18
|
+
has_many "tags", Tag
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Youtrack
|
2
|
+
module Resources
|
3
|
+
class Base
|
4
|
+
attr_reader :client
|
5
|
+
|
6
|
+
def initialize(client:)
|
7
|
+
@client = client
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_resource_with_fields(fields, path, options = {})
|
11
|
+
query_params = query_params_for_fields(fields).merge(options.delete(:params) || {})
|
12
|
+
response = client.get(path, { params: query_params })
|
13
|
+
deserialize_response(response)
|
14
|
+
end
|
15
|
+
|
16
|
+
def post_resource_with_fields(fields, path, data)
|
17
|
+
response = client.post(path, prepare_payload(data), { params: query_params_for_fields(fields) })
|
18
|
+
deserialize_response(response)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_resource(path)
|
22
|
+
client.delete(path)
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
26
|
+
def query_params_for_fields(fields)
|
27
|
+
return {} unless fields.present?
|
28
|
+
{ fields: fields.map(&:to_query).join(",") }
|
29
|
+
end
|
30
|
+
|
31
|
+
def deserialize_response(response)
|
32
|
+
$stdout.puts response.body if ENV["DEBUG"]
|
33
|
+
json = JSON.parse(response.body)
|
34
|
+
model.from_json(json)
|
35
|
+
end
|
36
|
+
|
37
|
+
def prepare_payload(data)
|
38
|
+
if data.respond_to?(:deep_transform_keys)
|
39
|
+
data = data.deep_transform_keys { |k| k.to_s.camelize(:lower) }
|
40
|
+
end
|
41
|
+
if data.respond_to?(:as_payload)
|
42
|
+
data = data.as_payload
|
43
|
+
elsif data.respond_to?(:to_json)
|
44
|
+
data = data.to_json
|
45
|
+
end
|
46
|
+
data
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.descendants
|
50
|
+
ObjectSpace.each_object(Class).select { |klass| klass < self }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Youtrack
|
2
|
+
module Resources
|
3
|
+
class Issues < Base
|
4
|
+
PATHS = OpenStruct.new(
|
5
|
+
issue: '/issues/%{id}',
|
6
|
+
issues: '/issues',
|
7
|
+
commands: '/commands',
|
8
|
+
)
|
9
|
+
|
10
|
+
def by_id(id)
|
11
|
+
get_resource_with_fields(model.all_fields, PATHS.issue % { id: id })
|
12
|
+
end
|
13
|
+
|
14
|
+
def search(query, params = {})
|
15
|
+
issues = get_resource_with_fields(model.minimal_fields, PATHS.issues, { params: { query: query }.merge(params) })
|
16
|
+
return issues if issues.is_a?(Array)
|
17
|
+
[issues]
|
18
|
+
end
|
19
|
+
|
20
|
+
def delete(id)
|
21
|
+
delete_resource(PATHS.issue % { id: id })
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param issue either a hash, json string or Issue instance
|
25
|
+
def create(issue)
|
26
|
+
post_resource_with_fields(model.all_fields, PATHS.issues, issue)
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param issues either a list of ids or a list of Issue instances
|
30
|
+
def command(command, issues = [])
|
31
|
+
issues = issues.map { |item| { id: item.respond_to?("id") ? item.id : item } }
|
32
|
+
post_resource_with_fields([], PATHS.commands, { query: command, issues: issues })
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def model
|
39
|
+
Models::Issue
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Youtrack
|
2
|
+
module Resources
|
3
|
+
class Projects < Base
|
4
|
+
PATHS = OpenStruct.new(
|
5
|
+
projects: '/admin/projects',
|
6
|
+
project: '/admin/projects/%{id}',
|
7
|
+
)
|
8
|
+
|
9
|
+
def all(params = {})
|
10
|
+
get_resource_with_fields(model.minimal_fields, PATHS.projects, params: params)
|
11
|
+
end
|
12
|
+
|
13
|
+
def by_id(id)
|
14
|
+
get_resource_with_fields(model.all_fields, PATHS.project % { id: id })
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def model
|
20
|
+
Models::Project
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Youtrack
|
2
|
+
module Resources
|
3
|
+
class Users < Base
|
4
|
+
PATHS = OpenStruct.new(
|
5
|
+
current: '/users/me',
|
6
|
+
users: '/users',
|
7
|
+
user: '/users/%{id}'
|
8
|
+
)
|
9
|
+
|
10
|
+
def current
|
11
|
+
get_resource_with_fields(model.all_fields, PATHS.current)
|
12
|
+
end
|
13
|
+
|
14
|
+
def all(params = {})
|
15
|
+
get_resource_with_fields(model.minimal_fields, PATHS.users, params: params)
|
16
|
+
end
|
17
|
+
|
18
|
+
def by_id(id)
|
19
|
+
get_resource_with_fields(model.all_fields, PATHS.user % { id: id })
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def model
|
25
|
+
Models::User
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/youtrack.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'youtrack'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'youtrack/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "youtrack_client"
|
8
|
+
gem.version = Youtrack::VERSION
|
9
|
+
gem.authors = ["Shane Hofstetter"]
|
10
|
+
gem.email = ["shane.hofstetter@gmail.com"]
|
11
|
+
gem.description = %q{REST API client for youtrack from jetbrains}
|
12
|
+
gem.summary = %q{youtrack REST API client}
|
13
|
+
gem.homepage = "https://github.com/shanehofstetter/youtrack-rest-client-ruby"
|
14
|
+
gem.metadata["homepage_uri"] = gem.homepage
|
15
|
+
gem.metadata["source_code_uri"] = "https://github.com/shanehofstetter/youtrack-rest-client-ruby"
|
16
|
+
gem.metadata["changelog_uri"] = "https://github.com/shanehofstetter/youtrack-rest-client-ruby/blob/main/CHANGELOG.md"
|
17
|
+
gem.metadata["bug_tracker_uri"] = "https://github.com/shanehofstetter/youtrack-rest-client-ruby/issues"
|
18
|
+
gem.license = "MIT"
|
19
|
+
|
20
|
+
gem.files = `git ls-files -z`.split("\x0").reject do |f|
|
21
|
+
f.match(%r{^(test|spec|features)/})
|
22
|
+
end
|
23
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
24
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
25
|
+
gem.required_ruby_version = Gem::Requirement.new(">= 2.1.0")
|
26
|
+
gem.require_paths = ["lib"]
|
27
|
+
|
28
|
+
gem.add_runtime_dependency "rest-client", '~> 2.0'
|
29
|
+
gem.add_runtime_dependency "activesupport", '> 5.0.0'
|
30
|
+
gem.add_runtime_dependency "zeitwerk", '~> 2.6'
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: youtrack_client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Shane Hofstetter
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-01-28 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: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 5.0.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 5.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: zeitwerk
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.6'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.6'
|
55
|
+
description: REST API client for youtrack from jetbrains
|
56
|
+
email:
|
57
|
+
- shane.hofstetter@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".github/workflows/specs.yml"
|
63
|
+
- ".gitignore"
|
64
|
+
- ".rspec"
|
65
|
+
- CHANGELOG.md
|
66
|
+
- Gemfile
|
67
|
+
- LICENSE
|
68
|
+
- README.md
|
69
|
+
- lib/youtrack.rb
|
70
|
+
- lib/youtrack/client.rb
|
71
|
+
- lib/youtrack/models/base.rb
|
72
|
+
- lib/youtrack/models/field_style.rb
|
73
|
+
- lib/youtrack/models/issue.rb
|
74
|
+
- lib/youtrack/models/issue_custom_field.rb
|
75
|
+
- lib/youtrack/models/issue_custom_field_value.rb
|
76
|
+
- lib/youtrack/models/project.rb
|
77
|
+
- lib/youtrack/models/tag.rb
|
78
|
+
- lib/youtrack/models/user.rb
|
79
|
+
- lib/youtrack/resources/base.rb
|
80
|
+
- lib/youtrack/resources/issues.rb
|
81
|
+
- lib/youtrack/resources/projects.rb
|
82
|
+
- lib/youtrack/resources/users.rb
|
83
|
+
- lib/youtrack/version.rb
|
84
|
+
- lib/youtrack_client.rb
|
85
|
+
- youtrack_client.gemspec
|
86
|
+
homepage: https://github.com/shanehofstetter/youtrack-rest-client-ruby
|
87
|
+
licenses:
|
88
|
+
- MIT
|
89
|
+
metadata:
|
90
|
+
homepage_uri: https://github.com/shanehofstetter/youtrack-rest-client-ruby
|
91
|
+
source_code_uri: https://github.com/shanehofstetter/youtrack-rest-client-ruby
|
92
|
+
changelog_uri: https://github.com/shanehofstetter/youtrack-rest-client-ruby/blob/main/CHANGELOG.md
|
93
|
+
bug_tracker_uri: https://github.com/shanehofstetter/youtrack-rest-client-ruby/issues
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options: []
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.1.0
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
requirements: []
|
109
|
+
rubygems_version: 3.1.6
|
110
|
+
signing_key:
|
111
|
+
specification_version: 4
|
112
|
+
summary: youtrack REST API client
|
113
|
+
test_files: []
|