you_track 0.2.2 → 0.3.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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/Rakefile +7 -0
  4. data/lib/you_track/client/mock.rb +25 -0
  5. data/lib/you_track/client/{comment.rb → models/comment.rb} +0 -0
  6. data/lib/you_track/client/{comments.rb → models/comments.rb} +0 -0
  7. data/lib/you_track/client/{issue.rb → models/issue.rb} +12 -8
  8. data/lib/you_track/client/{issues.rb → models/issues.rb} +0 -0
  9. data/lib/you_track/client/models/project.rb +33 -0
  10. data/lib/you_track/client/models/projects.rb +11 -0
  11. data/lib/you_track/client/models/user.rb +13 -0
  12. data/lib/you_track/client/models/users.rb +7 -0
  13. data/lib/you_track/client/real.rb +5 -1
  14. data/lib/you_track/client/requests/add_project_fix_version.rb +20 -0
  15. data/lib/you_track/client/{apply_issue_command.rb → requests/apply_issue_command.rb} +0 -0
  16. data/lib/you_track/client/{create_issue.rb → requests/create_issue.rb} +0 -2
  17. data/lib/you_track/client/requests/get_admin_user.rb +14 -0
  18. data/lib/you_track/client/requests/get_current_user.rb +14 -0
  19. data/lib/you_track/client/{get_issue.rb → requests/get_issue.rb} +0 -0
  20. data/lib/you_track/client/{get_issue_comments.rb → requests/get_issue_comments.rb} +0 -0
  21. data/lib/you_track/client/{get_issues.rb → requests/get_issues.rb} +1 -1
  22. data/lib/you_track/client/requests/get_project_custom_fields.rb +12 -0
  23. data/lib/you_track/client/requests/get_projects.rb +15 -0
  24. data/lib/you_track/client/requests/remove_project_fix_version.rb +20 -0
  25. data/lib/you_track/client/{update_issue.rb → requests/update_issue.rb} +0 -0
  26. data/lib/you_track/client.rb +29 -12
  27. data/lib/you_track/parser/comments_parser.rb +1 -0
  28. data/lib/you_track/parser/issues_parser.rb +1 -0
  29. data/lib/you_track/parser/project_custom_fields_parser.rb +6 -0
  30. data/lib/you_track/parser/projects_parser.rb +32 -0
  31. data/lib/you_track/parser/user_parser.rb +5 -0
  32. data/lib/you_track/parser.rb +13 -3
  33. data/lib/you_track/version.rb +1 -1
  34. data/lib/you_track.rb +2 -0
  35. metadata +25 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: daf7531ce002b8039b27af5231619b0833dd7907
4
- data.tar.gz: 2e69528fffa171664dffdde58c447ce174f01598
3
+ metadata.gz: 955e0cbeff48652b234859b7f9dcd451ace204bb
4
+ data.tar.gz: 3f06505e3d48a2f81810fc57e3dd2f598d7fe374
5
5
  SHA512:
6
- metadata.gz: 426226a8145972afb4680afe609593287ba4035fac23344eee5a7f1f2fbde966ee9f465f1c2e320b15d8efe4637d37b2eda297c9ac679c8e1ddc2884467aceab
7
- data.tar.gz: b14631fe94bd2d785652abd8c0c0b0b95353698ae071b6f51518bc4ab03ff33ce5d3db7e0fe1f0e5a3ad850148af68a26f7be26f38d53f2347c97eb4fb150a2d
6
+ metadata.gz: d0f07989847a8b6fce2b885e2434d23df4835f247ddae23bbf37d3551e978d15e77b809732de59be01f00b7ec9c8da43ea86f8d69bb4e13c2248f7e9f9042f7f
7
+ data.tar.gz: 05cba23274ba3d4f655ae550b2d039ed2fc20d014458655fef93420bad47aca7407d129f141e954c320e77c8f1d1a8f9209549bce6ac04899e61b10910257208
data/.travis.yml CHANGED
@@ -1,3 +1,4 @@
1
1
  language: ruby
2
+ before_install: gem install bundler --conservative -v "~> 1.8"
2
3
  rvm:
3
4
  - 2.1.5
data/Rakefile CHANGED
@@ -1,2 +1,9 @@
1
+ #!/usr/bin/env rake
1
2
  require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
2
4
 
5
+ RSpec::Core::RakeTask.new(:spec) do |spec|
6
+ spec.rspec_opts = "-cfd"
7
+ end
8
+
9
+ task :default => :spec
@@ -6,6 +6,22 @@ class YouTrack::Client::Mock
6
6
  h[k] = {
7
7
  :issues => {},
8
8
  :comments => {},
9
+ :users => {},
10
+ :projects => {
11
+ "YTD" => {
12
+ "name" => "You Track Dev",
13
+ "shortName" => "YTD",
14
+ "versions" => [],
15
+ "assignees" => {},
16
+ "isImporting" => "false",
17
+ "description" => "Fake project for YouTrack development",
18
+ }
19
+ },
20
+ :custom_fields => {
21
+ "YTD" => [
22
+ {"name" => "Fix versions", "url" => "https://foo.bar/rest/admin/project/YTD/customfield/Fix%20versions"}
23
+ ]
24
+ }
9
25
  }
10
26
  }
11
27
  end
@@ -33,6 +49,11 @@ class YouTrack::Client::Mock
33
49
  def initialize(options={})
34
50
  @url = URI.parse(options[:url])
35
51
  @username = options[:username]
52
+ self.data[:users][@username] = {
53
+ :email => @username,
54
+ :full_name => Faker::Name.name,
55
+ :last_created_project => SecureRandom.hex(2),
56
+ }
36
57
  end
37
58
 
38
59
  def response(options={})
@@ -70,4 +91,8 @@ class YouTrack::Client::Mock
70
91
  Faraday::Response::RaiseError.new.on_complete(env) ||
71
92
  Faraday::Response.new(env)
72
93
  end
94
+
95
+ def current_user
96
+ @current_user ||= users.current
97
+ end
73
98
  end
@@ -41,19 +41,23 @@ class YouTrack::Client::Issue < YouTrack::Client::Model
41
41
  self.reload
42
42
  end
43
43
 
44
+ def project
45
+ service.projects.get(self.attributes[:project])
46
+ end
47
+
44
48
  def save
45
49
  if new_record?
46
50
  requires :project, :summary
47
51
 
48
- merge_attributes(
49
- service.create_issue(
50
- "project" => self.project,
51
- "summary" => self.summary,
52
- "description" => self.description,
53
- "attachments" => self.attachments,
54
- "permittedGroups" => self.permitted_group,
55
- ).body
52
+ service.create_issue(
53
+ "project" => self.attributes[:project],
54
+ "summary" => self.summary,
55
+ "description" => self.description,
56
+ "attachments" => self.attachments,
57
+ "permittedGroups" => self.permitted_group,
56
58
  )
59
+
60
+ merge_attributes(project.issues.detect { |s| s.summary == summary }.attributes) # hacky, but the create request returns nothing
57
61
  else
58
62
  requires :identity
59
63
  service.update_issue(
@@ -0,0 +1,33 @@
1
+ class YouTrack::Client::Project < YouTrack::Client::Model
2
+ identity :id, aliases: ["shortName"]
3
+
4
+ attribute :versions, type: :array
5
+ attribute :name
6
+ attribute :description
7
+ attribute :is_importing, type: :boolean, aliases: ["isImporting"]
8
+ attribute :assignees
9
+
10
+ def issues
11
+ service.issues.all(self.id)
12
+ end
13
+
14
+ def custom_fields
15
+ service.get_project_custom_fields(self.id).body
16
+ end
17
+
18
+ def add_version(version)
19
+ raise YouTrack::NotAnAdminError unless service.current_user.admin?
20
+
21
+ unless versions.include?(version)
22
+ service.add_project_fix_version('project' => self.id, 'version' => version)
23
+ end
24
+ end
25
+
26
+ def remove_version(version)
27
+ raise YouTrack::NotAnAdminError unless service.current_user.admin?
28
+
29
+ if versions.include?(version)
30
+ service.remove_project_fix_version('project' => self.id, 'version' => version)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,11 @@
1
+ class YouTrack::Client::Projects < YouTrack::Client::Collection
2
+ model YouTrack::Client::Project
3
+
4
+ def all
5
+ service.projects.load(service.get_projects.body)
6
+ end
7
+
8
+ def get(identity)
9
+ all.detect { |p| p.id == identity }
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ class YouTrack::Client::User < YouTrack::Client::Model
2
+ identity :id, aliases: ["fullName", "email"]
3
+
4
+ attribute :last_created_project, aliases: ["lastCreatedProject"]
5
+ attribute :email, aliases: ["email"]
6
+
7
+ def admin? # just try to make a request to the admin api and see what happens
8
+ return @admin if defined?(@admin) # i love how ||= doesn't work when a variable is false
9
+ @admin = !!service.get_admin_user(self.id).body
10
+ rescue Faraday::ResourceNotFound
11
+ @admin = false
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ class YouTrack::Client::Users < YouTrack::Client::Collection
2
+ model YouTrack::Client::User
3
+
4
+ def current
5
+ service.users.new(service.get_current_user.body)
6
+ end
7
+ end
@@ -69,7 +69,7 @@ class YouTrack::Client::Real
69
69
  method = options[:method] || :get
70
70
  query = options[:query]
71
71
  url = URI.parse(options[:url] || File.join(self.url.to_s, "/rest", options.fetch(:path)))
72
- url.query = query.map { |k,v| "#{k}=#{URI.escape(v)}" }.join('&') if query
72
+ url.query = query.map { |k,v| "#{URI.escape(k)}=#{URI.escape(v.to_s)}" }.join('&') if query
73
73
  params = options[:params] || {}
74
74
  body = options[:body]
75
75
  headers = options[:headers] || {}
@@ -94,4 +94,8 @@ class YouTrack::Client::Real
94
94
 
95
95
  response
96
96
  end
97
+
98
+ def current_user
99
+ @current_user ||= users.current
100
+ end
97
101
  end
@@ -0,0 +1,20 @@
1
+ class YouTrack::Client::AddProjectFixVersion < YouTrack::Client::Request
2
+ def real(params={})
3
+ project = params.delete("project")
4
+ version = params.delete("version")
5
+
6
+ service.request(
7
+ :path => "/admin/project/#{project}/version/#{version}",
8
+ :method => :put,
9
+ )
10
+ end
11
+
12
+ def mock(params={})
13
+ project = find(:projects, params.delete("project"))
14
+ version = params.delete("version")
15
+
16
+ project["versions"] << version
17
+
18
+ service.response
19
+ end
20
+ end
@@ -4,7 +4,6 @@ class YouTrack::Client::CreateIssue < YouTrack::Client::Request
4
4
  :path => "/issue",
5
5
  :method => :put,
6
6
  :params => params,
7
- :parser => YouTrack::Parser::IssueParser,
8
7
  )
9
8
  end
10
9
 
@@ -41,7 +40,6 @@ class YouTrack::Client::CreateIssue < YouTrack::Client::Request
41
40
  service.data[:issues][identity] = issue
42
41
 
43
42
  service.response(
44
- :body => issue,
45
43
  :status => 201,
46
44
  )
47
45
  end
@@ -0,0 +1,14 @@
1
+ class YouTrack::Client::GetAdminUser < YouTrack::Client::Request
2
+ def real(id)
3
+ service.request(
4
+ :path => "/admin/user/#{id}",
5
+ :parser => YouTrack::Parser::UserParser,
6
+ )
7
+ end
8
+
9
+ def mock(id)
10
+ service.response(
11
+ :body => find(:users, id)
12
+ )
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class YouTrack::Client::GetCurrentUser < YouTrack::Client::Request
2
+ def real
3
+ service.request(
4
+ :path => "/user/current",
5
+ :parser => YouTrack::Parser::UserParser,
6
+ )
7
+ end
8
+
9
+ def mock
10
+ service.response(
11
+ :body => find(:users, service.username)
12
+ )
13
+ end
14
+ end
@@ -8,7 +8,7 @@ class YouTrack::Client::GetIssues < YouTrack::Client::Request
8
8
  end
9
9
 
10
10
  def mock(project, filters={})
11
- issues = service.data[:issues].values
11
+ issues = service.data[:issues].values.select { |i| i["projectShortName"] == project }
12
12
 
13
13
  # delete first n elements from the array
14
14
  if filters["after"]
@@ -0,0 +1,12 @@
1
+ class YouTrack::Client::GetProjectCustomFields < YouTrack::Client::Request
2
+ def real(id)
3
+ service.request(
4
+ :path => "/admin/project/#{id}/customfield",
5
+ :parser => YouTrack::Parser::ProjectCustomFieldsParser,
6
+ )
7
+ end
8
+
9
+ def mock(id)
10
+ service.response(body: find(:custom_fields, id))
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ class YouTrack::Client::GetProjects < YouTrack::Client::Request
2
+ def real
3
+ service.request(
4
+ :path => "/project/all",
5
+ :parser => YouTrack::Parser::ProjectsParser,
6
+ :query => {"verbose" => true},
7
+ )
8
+ end
9
+
10
+ def mock
11
+ service.response(
12
+ :body => service.data[:projects].values
13
+ )
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ class YouTrack::Client::RemoveProjectFixVersion < YouTrack::Client::Request
2
+ def real(params={})
3
+ project = params.delete("project")
4
+ version = params.delete("version")
5
+
6
+ service.request(
7
+ :path => "/admin/project/#{project}/version/#{version}",
8
+ :method => :delete,
9
+ )
10
+ end
11
+
12
+ def mock(params={})
13
+ project = find(:projects, params.delete("project"))
14
+ version = params.delete("version")
15
+
16
+ project["versions"].delete(version)
17
+
18
+ service.response
19
+ end
20
+ end
@@ -4,20 +4,37 @@ end
4
4
 
5
5
  require_relative "client/real"
6
6
  require_relative "client/mock"
7
-
8
7
  require_relative "client/model"
9
8
  require_relative "client/request"
10
-
11
9
  require_relative "client/login"
12
- require_relative "client/get_issue"
13
- require_relative "client/get_issues"
14
- require_relative "client/create_issue"
15
- require_relative "client/update_issue"
16
- require_relative "client/apply_issue_command"
17
10
 
18
- require_relative "client/get_issue_comments"
11
+ models = %w(
12
+ comment
13
+ issue
14
+ project
15
+ user
16
+ )
17
+
18
+ requests = %w(
19
+ add_project_fix_version
20
+ apply_issue_command
21
+ create_issue
22
+ get_admin_user
23
+ get_current_user
24
+ get_issue
25
+ get_issue_comments
26
+ get_issues
27
+ get_project_custom_fields
28
+ get_projects
29
+ remove_project_fix_version
30
+ update_issue
31
+ )
19
32
 
20
- require_relative "client/issue"
21
- require_relative "client/issues"
22
- require_relative "client/comment"
23
- require_relative "client/comments"
33
+ models.each do |model|
34
+ require_relative "client/models/#{model}"
35
+ require_relative "client/models/#{model}s"
36
+ end
37
+
38
+ requests.each do |request|
39
+ require_relative "client/requests/#{request}"
40
+ end
@@ -1,6 +1,7 @@
1
1
  class YouTrack::Parser::CommentsParser < YouTrack::Parser::Base
2
2
  def parse
3
3
  return [] if raw["comments"].nil?
4
+ return [raw["comments"]["comment"]] if raw["comments"]["comment"].is_a?(Hash)
4
5
  raw["comments"]["comment"]
5
6
  end
6
7
  end
@@ -2,6 +2,7 @@ class YouTrack::Parser::IssuesParser < YouTrack::Parser::IssueParser
2
2
  def parse
3
3
  return [] if raw["issues"].nil? # i hate xml
4
4
  results = raw["issues"]["issue"].dup # i really hate xml
5
+ results = [results] if results.is_a?(Hash)
5
6
 
6
7
  results.each do |result|
7
8
  fields = result.delete("field")
@@ -0,0 +1,6 @@
1
+ class YouTrack::Parser::ProjectCustomFieldsParser < YouTrack::Parser::Base
2
+ def parse
3
+ return [] unless raw["projectCustomFieldRefs"]
4
+ raw["projectCustomFieldRefs"]["projectCustomField"]
5
+ end
6
+ end
@@ -0,0 +1,32 @@
1
+ class YouTrack::Parser::ProjectsParser < YouTrack::Parser::Base
2
+ def parse_assignees(login, full_name)
3
+ return {} unless login && full_name
4
+ login["sub"] = [login["sub"]] if login["sub"].is_a?(Hash)
5
+ full_name["sub"] = [full_name["sub"]] if full_name["sub"].is_a?(Hash)
6
+ login["sub"].each_with_index.inject({}) do |hash, (user,i)|
7
+ hash[user["value"]] = full_name["sub"][i]["value"]
8
+ hash
9
+ end
10
+ end
11
+
12
+ def parse_versions(versions)
13
+ return [] unless versions
14
+ Array(versions.gsub(/(^\[|\]$)/, '').split(', '))
15
+ end
16
+
17
+ def parse
18
+ return [] if raw["projects"].nil?
19
+ results = raw["projects"]["project"].dup
20
+ results = [results] if results.is_a?(Hash)
21
+ results.each do |result|
22
+ login = result.delete("assigneesLogin")
23
+ full_name = result.delete("assigneesFullName")
24
+ versions = result.delete("versions")
25
+
26
+ result["assignees"] = parse_assignees(login, full_name)
27
+ result["versions"] = parse_versions(versions)
28
+ end
29
+
30
+ results
31
+ end
32
+ end
@@ -0,0 +1,5 @@
1
+ class YouTrack::Parser::UserParser < YouTrack::Parser::Base
2
+ def parse
3
+ raw["user"]
4
+ end
5
+ end
@@ -2,6 +2,16 @@ module YouTrack::Parser
2
2
  end
3
3
 
4
4
  require_relative "parser/base"
5
- require_relative "parser/issue_parser"
6
- require_relative "parser/issues_parser"
7
- require_relative "parser/comments_parser"
5
+
6
+ parsers = %w(
7
+ comments
8
+ issue
9
+ issues
10
+ projects
11
+ user
12
+ project_custom_fields
13
+ )
14
+
15
+ parsers.each do |parser|
16
+ require_relative "parser/#{parser}_parser"
17
+ end
@@ -1,3 +1,3 @@
1
1
  module YouTrack
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/you_track.rb CHANGED
@@ -18,6 +18,8 @@ module YouTrack
18
18
  {}
19
19
  end
20
20
  end
21
+
22
+ class NotAnAdminError < StandardError; end
21
23
  end
22
24
 
23
25
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: you_track
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Lane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-16 00:00:00.000000000 Z
11
+ date: 2015-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cistern
@@ -130,26 +130,39 @@ files:
130
130
  - bin/setup
131
131
  - lib/you_track.rb
132
132
  - lib/you_track/client.rb
133
- - lib/you_track/client/apply_issue_command.rb
134
- - lib/you_track/client/comment.rb
135
- - lib/you_track/client/comments.rb
136
- - lib/you_track/client/create_issue.rb
137
- - lib/you_track/client/get_issue.rb
138
- - lib/you_track/client/get_issue_comments.rb
139
- - lib/you_track/client/get_issues.rb
140
- - lib/you_track/client/issue.rb
141
- - lib/you_track/client/issues.rb
142
133
  - lib/you_track/client/login.rb
143
134
  - lib/you_track/client/mock.rb
144
135
  - lib/you_track/client/model.rb
136
+ - lib/you_track/client/models/comment.rb
137
+ - lib/you_track/client/models/comments.rb
138
+ - lib/you_track/client/models/issue.rb
139
+ - lib/you_track/client/models/issues.rb
140
+ - lib/you_track/client/models/project.rb
141
+ - lib/you_track/client/models/projects.rb
142
+ - lib/you_track/client/models/user.rb
143
+ - lib/you_track/client/models/users.rb
145
144
  - lib/you_track/client/real.rb
146
145
  - lib/you_track/client/request.rb
147
- - lib/you_track/client/update_issue.rb
146
+ - lib/you_track/client/requests/add_project_fix_version.rb
147
+ - lib/you_track/client/requests/apply_issue_command.rb
148
+ - lib/you_track/client/requests/create_issue.rb
149
+ - lib/you_track/client/requests/get_admin_user.rb
150
+ - lib/you_track/client/requests/get_current_user.rb
151
+ - lib/you_track/client/requests/get_issue.rb
152
+ - lib/you_track/client/requests/get_issue_comments.rb
153
+ - lib/you_track/client/requests/get_issues.rb
154
+ - lib/you_track/client/requests/get_project_custom_fields.rb
155
+ - lib/you_track/client/requests/get_projects.rb
156
+ - lib/you_track/client/requests/remove_project_fix_version.rb
157
+ - lib/you_track/client/requests/update_issue.rb
148
158
  - lib/you_track/parser.rb
149
159
  - lib/you_track/parser/base.rb
150
160
  - lib/you_track/parser/comments_parser.rb
151
161
  - lib/you_track/parser/issue_parser.rb
152
162
  - lib/you_track/parser/issues_parser.rb
163
+ - lib/you_track/parser/project_custom_fields_parser.rb
164
+ - lib/you_track/parser/projects_parser.rb
165
+ - lib/you_track/parser/user_parser.rb
153
166
  - lib/you_track/version.rb
154
167
  - you_track.gemspec
155
168
  homepage: https://github.com/lanej/you_track.git