you_track 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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