youtrack 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 20fcd027f9f2ccbe21f3c3899ece54d81ffd667f
4
- data.tar.gz: 418054623251575f8917b2a3c65ee9ec0001f0da
3
+ metadata.gz: 07d949e716b29198f4623d61816059a3a1c0e4d9
4
+ data.tar.gz: d1a7bf3b1853e5439a116f8188fe31e71dcac0a6
5
5
  SHA512:
6
- metadata.gz: 04739f2ccd49272e0542e32c347e5958c5d9e50e79085867ed687d7e360f619626e21c3b187dbb1d1753f6dabea07bf59a186165e59d4db32da5e8d2db7e3d08
7
- data.tar.gz: 6bdac860776d6d68ba44bddfe934122650b278d16217751b8acc120e4f2e69d2a19262df1d714a929a24c425e0a34099d4aa8a0c4077d27d02a2dbc5a6c471da
6
+ metadata.gz: f39f8d9e6e52a8b715aa5dd79715c2aaf6d35ff31ef972f9ceb672722474f7682f97693f5be34b46057ed57c37edd72124fba8a56a5f0dced0d6e0b6638fdcd2
7
+ data.tar.gz: a842b493ddacb75d251a4c519150af698c3b17fe31953badcff263ba311344b93f2875be76cd07514afa7342f48ae13ae6664bca43e2033b06642e9e0c39427f
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ youtrack
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0-p247
@@ -8,5 +8,12 @@ Feature: New Client Session
8
8
  Given I create a new Client
9
9
  When I set the Client url to point to the Server
10
10
  And I enter the correct login credentials
11
- And I connect
11
+ And I connect ok
12
12
  Then I should be connected to the Server
13
+
14
+ Scenario: failing to start a new session
15
+ Given I create a new Client
16
+ When I set the Client url to point to the Server
17
+ And I enter incorrect login credentials
18
+ And I connect with error
19
+ Then I should receive an error Response
@@ -1,3 +1,10 @@
1
+ def login_stub
2
+ stub_request(:post, YServer::Endpoint + "/login").with( body: @client.credentials_hash )
3
+ end
4
+
5
+ def fixture(filename)
6
+ File.join(YServer::FIXTURE_PATH, filename)
7
+ end
1
8
 
2
9
  Given /^I create a new Client$/ do
3
10
  @client = Youtrack::Client.new
@@ -8,12 +15,23 @@ Given /^I enter the correct login credentials$/ do
8
15
  step "I set the Client#password= to <#{YServer::Password}>"
9
16
  end
10
17
 
18
+ Given /^I enter incorrect login credentials$/ do
19
+ step "I set the Client#login= to <#{YServer::Lorem}>"
20
+ step "I set the Client#password= to <#{YServer::Lorem}>"
21
+ end
22
+
11
23
  Given /^I set the Client url to point to the Server$/ do
12
24
  @client.url = YServer::URL
13
25
  end
14
26
 
15
- Given /^I connect$/ do
16
- @client.login!
27
+ Given /^I connect ok$/ do
28
+ login_stub.to_return( body: fixture('login_body_ok.xml'), headers: { 'Content-Type' => 'application/xml; charset=UTF-8' } )
29
+ @client.connect!
30
+ end
31
+
32
+ Given /^I connect with error$/ do
33
+ login_stub.to_return( body: fixture('login_body_error.xml'), headers: { 'Content-Type' => 'application/xml; charset=UTF-8' } )
34
+ @client.connect!
17
35
  end
18
36
 
19
37
  Given /^I set the Client#([a-zA-Z_=]+) to <([a-zA-Z0-9_-]+)>$/ do |method, value|
@@ -23,3 +41,10 @@ end
23
41
  Then /^I should be connected to the Server$/ do
24
42
  @client.response.parsed_response["login"].should eq("ok")
25
43
  end
44
+
45
+ Then /^I should receive an error response from the Server$/ do
46
+ end
47
+
48
+ Then(/^I should receive an error Response$/) do
49
+ @client.response.parsed_response['error'].should eq('Incorrect login or password.')
50
+ end
@@ -1,10 +1,14 @@
1
1
  require "youtrack"
2
- require "webmock/cucumber"
3
2
 
4
3
  module YServer
5
4
  URL = "https://youtrackserver.com"
5
+ Endpoint = "#{URL}/rest"
6
6
  Login = "root"
7
+ Lorem = 'lorem'
7
8
  Password = "root"
9
+ FIXTURE_PATH = File.expand_path('../../../spec/fixtures', __FILE__ )
8
10
  end
9
11
 
10
-
12
+ require 'webmock/cucumber'
13
+ World(WebMock::API, WebMock::Matchers)
14
+ WebMock.allow_net_connect!
@@ -1,20 +1 @@
1
- include WebMock::API
2
1
 
3
- def server_url_for(endpoint, options={})
4
- base = "#{YServer::URL}/rest/#{endpoint}"
5
- if options[:query]
6
- base += "?#{options[:query]}"
7
- end
8
- end
9
-
10
-
11
- # STUBS
12
-
13
- # login
14
- stub_request(:post, server_url_for("login", query: "login=#{YServer::Password}&password=#{YServer::Login}"))
15
- .to_return(
16
- body: "<login>ok</login>",
17
- headers: {
18
- "Server" => "Jetty(6.1.23)",
19
- "Content-Type" => "application/xml;charset=UTF-8"
20
- })
@@ -1 +1 @@
1
- World(YServer)
1
+ World(YServer)
data/lib/youtrack.rb CHANGED
@@ -1,6 +1,10 @@
1
1
  require "httparty"
2
2
 
3
3
  module Youtrack
4
- autoload :Client, "youtrack/client"
5
- autoload :VERSION, "youtrack/version"
4
+ autoload :Client, "youtrack/client"
5
+ autoload :VERSION, "youtrack/version"
6
+ autoload :Base, "youtrack/resources/base"
7
+ autoload :Issue, "youtrack/resources/issue"
8
+ autoload :Project, "youtrack/resources/project"
9
+ autoload :User, "youtrack/resources/user"
6
10
  end
@@ -1,6 +1,5 @@
1
1
  module Youtrack
2
2
  class Client
3
- include HTTParty
4
3
 
5
4
  # holds the youTrack Server url
6
5
  # defaults to nil
@@ -15,22 +14,62 @@ module Youtrack
15
14
  attr_accessor :password
16
15
 
17
16
  # stores the response object
18
- attr_accessor :response
17
+ attr_accessor :connection
18
+
19
+ # stores the auth_headers
20
+ attr_accessor :cookies
21
+
22
+ # stores the scope of all subsequent api calls
23
+ attr_accessor :admin
24
+
25
+ def admin?
26
+ true == @admin
27
+ end
19
28
 
20
29
  def initialize(options={})
30
+ @cookies = {}
31
+ @admin = false
21
32
  end
22
33
 
23
- def server_endpoint
24
- @server_endpoint ||= File.join(url, "rest")
34
+ # the server endpoint
35
+ def endpoint
36
+ @endpoint = File.join(url, 'rest')
25
37
  end
26
38
 
27
39
  def credentials_hash
28
40
  { login: login, password: password }
29
41
  end
30
42
 
31
- def login!
32
- @response = self.class.post(server_endpoint + "/login", { query: credentials_hash })
43
+
44
+ # Makes a login call and sets the Cookie headers
45
+ #
46
+ # Returns the status code of the connection call
47
+ def connect!
48
+ @connection = HTTParty.post(File.join(url, "rest/user/login"), body: credentials_hash )
49
+ @cookies['Cookie'] = @connection.headers['set-cookie']
50
+ @connection.code
51
+ end
52
+
53
+ def connected?
54
+ !!(connection && connection.headers['set-cookie'])
33
55
  end
34
56
 
57
+ def users
58
+ resource(:user).new(self)
59
+ end
60
+
61
+ def projects
62
+ resource(:project).new(self)
63
+ end
64
+
65
+ def issues
66
+ resource(:issue).new(self)
67
+ end
68
+
69
+ private
70
+
71
+ def resource(resource_name)
72
+ Youtrack.const_get(resource_name.to_s.capitalize)
73
+ end
35
74
  end
36
75
  end
@@ -0,0 +1,53 @@
1
+ module Youtrack
2
+ class Base
3
+ include HTTParty
4
+
5
+ # The base route URL
6
+ attr_accessor :base_url
7
+
8
+ # The Server Endpoint
9
+ attr_accessor :service
10
+
11
+ # Stores the response of the previous request
12
+ attr_accessor :response
13
+
14
+
15
+ def initialize(client)
16
+ @service = client
17
+ @base_url = @service.endpoint
18
+ end
19
+
20
+ protected
21
+
22
+ def join(*args)
23
+ File.join(*args)
24
+ end
25
+
26
+ def prepare_options(options={})
27
+ options[:headers] ||= {}
28
+ options[:headers]['Cookie'] = service.cookies['Cookie']
29
+ options
30
+ end
31
+
32
+ def post(path, options={})
33
+ options = prepare_options(options)
34
+ @response = self.class.post( join(base_url, path), options )
35
+ end
36
+
37
+ def put(path, options={})
38
+ options = prepare_options(options)
39
+ @response = self.class.put( join(base_url, path), options )
40
+ end
41
+
42
+ def get(path, options={})
43
+ options = prepare_options(options)
44
+ @response = self.class.get( join(base_url, path), options )
45
+ end
46
+
47
+ def delete(path, options={})
48
+ options = prepare_options(options)
49
+ @response = self.class.delete( join(base_url, path), options )
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,22 @@
1
+ module Youtrack
2
+ class Issue < Base
3
+
4
+
5
+ # ==================
6
+ # USER Methods
7
+ # ==================
8
+
9
+
10
+ # Create a New Issue
11
+ # project string ID of a project to add new issue to.
12
+ # summary string Short summary for the new issue.
13
+ # description string Description for the new issue.
14
+ # attachments file in "multipart/form-data" format One or several files in "multipart/form-data" format that should be attached to the new issue.
15
+ # permittedGroup string Set visibility for the new issue, that is: Specify a user group to which the issue will be visible.
16
+ def create(attributes={})
17
+ put("/issue", body: attributes)
18
+ response
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,43 @@
1
+ module Youtrack
2
+ class Project < Base
3
+
4
+ # ==================
5
+ # USER Methods
6
+ # ==================
7
+ def accessible_projects
8
+ get('/project/all')
9
+ response.parsed_response
10
+ end
11
+
12
+ # ==================
13
+ # ADMIN Methods
14
+ # ==================
15
+ def all
16
+ get('/admin/project')
17
+ response.parsed_response
18
+ end
19
+
20
+ def find(project_id)
21
+ get("/admin/project/#{project_id}")
22
+ response.parsed_response
23
+ end
24
+
25
+ # required attributes
26
+ #
27
+ # projectId string required Unique identifier of a project to be created. This short name will be used as prefix in issue IDs for this project.
28
+ # projectName string required Full name of a new project. Must be unique.
29
+ # startingNumber integer required Number to assign to the next manually created issue.
30
+ # projectLeadLogin string required Login name of a user to be assigned as a project leader.
31
+ # description string Optional description of the new project
32
+ def create(attributes={})
33
+ put("admin/project/#{attributes[:projectId]}", body: attributes)
34
+ response
35
+ end
36
+
37
+ def destroy(project_id)
38
+ delete("/admin/project/#{project_id}")
39
+ response
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,14 @@
1
+ module Youtrack
2
+ class User < Base
3
+
4
+
5
+ # USER Methods
6
+ def current
7
+ get('current')
8
+ response.parsed_response
9
+ end
10
+
11
+ # ADMIN Methods
12
+
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module Youtrack
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?><error>Incorrect login or password.</error>
@@ -0,0 +1 @@
1
+ <login>ok</login>
@@ -0,0 +1,10 @@
1
+ {
2
+ "Server": "nginx",
3
+ "Date": "Fri, 24 Jan 2014 07:49:19 GMT",
4
+ "Content-Type": "application/xml; charset=UTF-8",
5
+ "Set-Cookie": "jetbrains.charisma.main.security.PRINCIPAL=NmZkNDc3NDgxZjBhOWNjMTVjNDQwNTljNTE1NzM1ODEwM2I3MjgyMDlkZDAzZGJhYTAzYzU1ZmYyZGUyZWMxNzpyb290;Path=/youtrack;Expires=Sat, 24-Jan-2015 07:49:19 GMT",
6
+ "Expires": "Thu, 01 Jan 1970 00:00:00 GMT",
7
+ "Access-Control-Allow-Origin": "chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo",
8
+ "Access-Control-Allow-Credentials": "true",
9
+ "Cache-Control": "no-cache, no-store, no-transform, must-revalidate"
10
+ }
data/spec/spec_helper.rb CHANGED
@@ -11,6 +11,7 @@ RSpec.configure do |config|
11
11
  config.treat_symbols_as_metadata_keys_with_true_values = true
12
12
  config.run_all_when_everything_filtered = true
13
13
  config.filter_run :focus
14
+ config.syntax = :expect
14
15
 
15
16
  # Run specs in random order to surface order dependencies. If you find an
16
17
  # order dependency and want to debug it, you can fix the order by providing
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: youtrack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Faucett
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-23 00:00:00.000000000 Z
11
+ date: 2014-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -103,6 +103,8 @@ extra_rdoc_files: []
103
103
  files:
104
104
  - .gitignore
105
105
  - .rspec
106
+ - .ruby-gemset
107
+ - .ruby-version
106
108
  - .travis.yml
107
109
  - Gemfile
108
110
  - LICENSE.txt
@@ -115,7 +117,14 @@ files:
115
117
  - features/support/world.rb
116
118
  - lib/youtrack.rb
117
119
  - lib/youtrack/client.rb
120
+ - lib/youtrack/resources/base.rb
121
+ - lib/youtrack/resources/issue.rb
122
+ - lib/youtrack/resources/project.rb
123
+ - lib/youtrack/resources/user.rb
118
124
  - lib/youtrack/version.rb
125
+ - spec/fixtures/login_body_error.xml
126
+ - spec/fixtures/login_body_ok.xml
127
+ - spec/fixtures/login_header.json
119
128
  - spec/spec_helper.rb
120
129
  - youtrack.gemspec
121
130
  homepage: ''
@@ -138,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
147
  version: '0'
139
148
  requirements: []
140
149
  rubyforge_project:
141
- rubygems_version: 2.0.3
150
+ rubygems_version: 2.0.6
142
151
  signing_key:
143
152
  specification_version: 4
144
153
  summary: A Ruby REST API Client for JetBrains youTrack software
@@ -148,4 +157,7 @@ test_files:
148
157
  - features/support/env.rb
149
158
  - features/support/webmock.rb
150
159
  - features/support/world.rb
160
+ - spec/fixtures/login_body_error.xml
161
+ - spec/fixtures/login_body_ok.xml
162
+ - spec/fixtures/login_header.json
151
163
  - spec/spec_helper.rb