ki_youtrack 0.0.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.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ spec/fixtures
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ki_youtrack.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Ben Brinckerhoff
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ ki_youtrack
2
+ ===========
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+
5
+ desc 'Default: run specs.'
6
+ task :default => :spec
7
+
8
+ desc "Run specs"
9
+ RSpec::Core::RakeTask.new do |t|
10
+ t.pattern = "./spec/**/*_spec.rb"
11
+ end
12
+
13
+ desc "Generate code coverage"
14
+ RSpec::Core::RakeTask.new("spec:coverage") do |t|
15
+ ENV['COVERAGE'] = "true"
16
+ end
17
+
18
+ desc "Delete *all* VCR cassettes (!)"
19
+ namespace :spec do
20
+ task :vcr_wipe do
21
+ FileUtils.rm_rf('spec/fixtures/vcr_cassettes')
22
+ end
23
+ end
data/bin/ki_youtrack ADDED
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ # 1.9 adds realpath to resolve symlinks; 1.8 doesn't
3
+ # have this method, so we add it so we get resolved symlinks
4
+ # and compatibility
5
+ unless File.respond_to? :realpath
6
+ class File #:nodoc:
7
+ def self.realpath path
8
+ return realpath(File.readlink(path)) if symlink?(path)
9
+ path
10
+ end
11
+ end
12
+ end
13
+
14
+ $LOAD_PATH << File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../lib')
15
+
16
+ require 'rubygems'
17
+ require 'gli'
18
+ require 'ki_youtrack'
19
+
20
+ include GLI
21
+
22
+ program_desc 'A command-line interface to YouTrack'
23
+
24
+ version KiYoutrack::VERSION
25
+
26
+ # pre do |global_options,command,options,args|
27
+ # end
28
+
29
+ desc 'Get a issue'
30
+ arg_name '[issue id]'
31
+ command :issue do |c|
32
+ c.action do |global_options, options, args|
33
+ pretty = $stdout.tty?
34
+
35
+ id = args.first
36
+ json = KiYoutrack::Api.issue(id, :pretty => pretty)
37
+ $stdout.puts(json)
38
+ end
39
+ end
40
+
41
+ desc 'Set up config file'
42
+ command :setup do |c|
43
+ c.action do |global_options, options, args|
44
+ config = Kiseru::Config[:ki_youtrack]
45
+
46
+ ui = HighLine.new
47
+
48
+ username = config.read(:username) || ui.ask("Username: ")
49
+ password = config.read(:password) || ui.ask("Password: ") { |q| q.echo = false }
50
+ subdomain = config.read(:subdomain) || ui.ask("Subdomain: ")
51
+
52
+ config.write(:username, username)
53
+ config.write(:password, password)
54
+ config.write(:subdomain, subdomain)
55
+ end
56
+ end
57
+
58
+ exit GLI.run(ARGV)
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/ki_youtrack/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Ben Brinckerhoff", "Aaron Cronin"]
6
+ gem.email = ["ben@freeagent.com", "aaron@freeagent.com"]
7
+ gem.description = %q{Kiseru YouTrack client}
8
+ gem.summary = %q{Kiseru YouTrack client}
9
+ gem.homepage = ""
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "ki_youtrack"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = KiYoutrack::VERSION
17
+
18
+ gem.add_dependency('gli')
19
+ gem.add_dependency('faraday')
20
+ gem.add_dependency('faraday_middleware')
21
+ gem.add_dependency('multi_xml')
22
+ gem.add_dependency('multi_json')
23
+ gem.add_dependency('highline')
24
+
25
+ gem.add_development_dependency('debugger')
26
+ gem.add_development_dependency('rspec')
27
+ gem.add_development_dependency('simplecov')
28
+ gem.add_development_dependency('test-construct')
29
+ gem.add_development_dependency('vcr')
30
+ gem.add_development_dependency('webmock')
31
+ end
@@ -0,0 +1,21 @@
1
+ module KiYoutrack
2
+
3
+ class Api
4
+
5
+ def self.issue(id, opts = {})
6
+ config = Kiseru::Config[:ki_youtrack]
7
+ username = config.read(:username)
8
+ password = config.read(:password)
9
+ subdomain = config.read(:subdomain)
10
+ ssl = config.read(:ssl)
11
+ session = Session.new(username, password, subdomain, :ssl => ssl)
12
+ session.init
13
+ response = session.get_bug(id)
14
+
15
+ filtered_data = IssueFilter.filter(response.body['issue'])
16
+ MultiJson.dump(filtered_data, :pretty => opts[:pretty])
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,10 @@
1
+ module KiYoutrack
2
+
3
+ class Creds
4
+
5
+ def self.get
6
+ end
7
+
8
+ end
9
+
10
+ end
@@ -0,0 +1,25 @@
1
+ module KiYoutrack
2
+
3
+ class IssueFilter
4
+
5
+ def self.filter(data)
6
+ new_data = {}
7
+ new_data['id']= data['id']
8
+
9
+ data['field'].each do |field|
10
+ new_data[field['name']] = field['value']
11
+ end
12
+ # TODO - this should not know about the config here!
13
+ # If filter needs data, it should be passed in!
14
+ config = Kiseru::Config[:ki_youtrack]
15
+ subdomain = config.read(:subdomain)
16
+ ssl = config.read(:ssl)
17
+ new_data['issue_url'] = Session.url(subdomain, ssl) + '/youtrack/issues/' + data['id']
18
+ new_data['ki_type'] = 'youtrack_issue'
19
+
20
+ new_data
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,48 @@
1
+ module Kiseru
2
+
3
+ class ConfigDir
4
+
5
+ DIR_NAME = '.kiseru'
6
+
7
+ attr_reader :path
8
+
9
+ def initialize(opts = {})
10
+ root = Pathname.new(File.expand_path(opts.fetch(:root) { '~' }))
11
+ @path = root + DIR_NAME
12
+ unless File.directory?(@path)
13
+ Dir.mkdir(@path)
14
+ end
15
+ end
16
+
17
+ def config(app_name)
18
+ Config.new(@path, app_name)
19
+ end
20
+
21
+ end
22
+
23
+ class Config
24
+
25
+ def self.[](key)
26
+ ConfigDir.new.config(key)
27
+ end
28
+
29
+ def initialize(root_path, app_name)
30
+ file_path = (root_path + "#{app_name}.yml").to_s
31
+ @store = YAML::Store.new(file_path)
32
+ end
33
+
34
+ def write(key, time)
35
+ @store.transaction do
36
+ @store[key] = time
37
+ end
38
+ end
39
+
40
+ def read(key)
41
+ @store.transaction(read_only=true) do
42
+ @store[key]
43
+ end
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -0,0 +1,52 @@
1
+ module KiYoutrack
2
+
3
+ class Session
4
+
5
+ attr_reader :session_cookies, :api_url
6
+
7
+ # TODO - hacky, remove this
8
+ # TODO - the default for SSL should be in ONE place
9
+ def self.url(subdomain, ssl)
10
+ ssl = true if ssl.nil?
11
+ protocol = ssl ? "https" : "http"
12
+ "#{protocol}://#{subdomain}.myjetbrains.com"
13
+ end
14
+
15
+ def initialize(username, password, subdomain, opts = {})
16
+ ssl = opts.fetch(:ssl, true)
17
+ @username = username
18
+ @password = password
19
+ @api_url = Session.url(subdomain, ssl)
20
+ end
21
+
22
+ def init
23
+ response = connection.post("/youtrack/rest/user/login",
24
+ :login => @username,
25
+ :password => @password)
26
+ @session_cookies = response.headers['set-cookie']
27
+ response
28
+ end
29
+
30
+ def get_bug(id)
31
+ connection.get do |req|
32
+ req.url "/youtrack/rest/issue/#{id}"
33
+ req.headers['Cookie'] = session_cookies
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def connection
40
+ @connection ||= Faraday.new(:url => @api_url) do |faraday|
41
+ faraday.request :url_encoded # form-encode POST params
42
+ if ENV['DEBUG']=='true'
43
+ faraday.response :logger # log requests to STDOUT
44
+ end
45
+ faraday.response :xml, :content_type => /\bxml$/
46
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,3 @@
1
+ module KiYoutrack
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,20 @@
1
+ require "ki_youtrack/version"
2
+ require 'faraday'
3
+ require 'faraday_middleware'
4
+ require 'multi_xml'
5
+ require 'multi_json'
6
+ require 'yaml/store'
7
+ require 'highline'
8
+
9
+ autoload :Kiseru, 'ki_youtrack/kiseru'
10
+
11
+ module KiYoutrack
12
+
13
+ autoload :Api, 'ki_youtrack/api'
14
+ autoload :Creds, 'ki_youtrack/creds'
15
+ autoload :Session, 'ki_youtrack/session'
16
+ autoload :IssueFilter, 'ki_youtrack/issue_filter'
17
+
18
+ end
19
+
20
+ KiYouTrack = KiYoutrack
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ include KiYoutrack
4
+
5
+ describe KiYoutrack::Api do
6
+
7
+ it "gets JSON for issue", :vcr do
8
+ json = Api.issue("KI-1")
9
+ data = MultiJson.load(json)
10
+ data['id'].should == 'KI-1'
11
+ data['ki_type'].should == 'youtrack_issue'
12
+ end
13
+
14
+ it "pretty prints JSON if requested", :vcr do
15
+ json = Api.issue("KI-1", :pretty => false)
16
+
17
+ pretty_json = MultiJson.dump(MultiJson.load(json), :pretty => true)
18
+ normal_json = MultiJson.dump(MultiJson.load(json), :pretty => false)
19
+
20
+ json.should == normal_json
21
+ Api.issue("KI-1", :pretty => true).should == pretty_json
22
+ end
23
+
24
+ end
@@ -0,0 +1,43 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+
8
+ require 'ki_youtrack'
9
+ require 'vcr'
10
+ require 'pp'
11
+ require 'construct'
12
+
13
+ include Construct::Helpers
14
+ include KiYoutrack
15
+
16
+ if [0, 'false', false, 'f', 'n', 'no', 'off'].include?(ENV['VCR'])
17
+ puts "VCR off"
18
+ else
19
+ puts "VCR on!"
20
+ VCR.configure do |c|
21
+ c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
22
+ c.hook_into :webmock
23
+ c.allow_http_connections_when_no_cassette = true
24
+ c.configure_rspec_metadata!
25
+ end
26
+ end
27
+
28
+ if ENV['COVERAGE']
29
+ require 'simplecov'
30
+ SimpleCov.start
31
+ end
32
+
33
+ RSpec.configure do |config|
34
+ config.treat_symbols_as_metadata_keys_with_true_values = true
35
+ config.run_all_when_everything_filtered = true
36
+ config.filter_run :focus
37
+
38
+ # Run specs in random order to surface order dependencies. If you find an
39
+ # order dependency and want to debug it, you can fix the order by providing
40
+ # the seed, which is printed after each run.
41
+ # --seed 1234
42
+ config.order = 'random'
43
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe IssueFilter do
4
+
5
+ let(:data) do
6
+ {"field"=>
7
+ [{"value"=>"Project X", "type"=>"SingleField", "name"=>"projectShortName"},
8
+ {"value"=>"123", "type"=>"SingleField", "name"=>"numberInProject"},
9
+ {"value"=>"A SUMMARY",
10
+ "type"=>"SingleField",
11
+ "name"=>"summary"},
12
+ {"value"=>
13
+ "A DESCRIPTION",
14
+ "type"=>"SingleField",
15
+ "name"=>"description"},
16
+ {"value"=>"1342536743244", "type"=>"SingleField", "name"=>"created"},
17
+ {"value"=>"1342536761703", "type"=>"SingleField", "name"=>"updated"},
18
+ {"value"=>"Bob", "type"=>"SingleField", "name"=>"updaterName"},
19
+ {"value"=>"bob@foobar.com",
20
+ "type"=>"SingleField",
21
+ "name"=>"updaterFullName"},
22
+ {"value"=>"Jane", "type"=>"SingleField", "name"=>"reporterName"},
23
+ {"value"=>"jane@foobar.com",
24
+ "type"=>"SingleField",
25
+ "name"=>"reporterFullName"},
26
+ {"value"=>"Bug", "type"=>"CustomField", "name"=>"Type"},
27
+ {"value"=>"99", "type"=>"CustomField", "name"=>"Bug Score"}
28
+ ],
29
+ "id"=>"FA-123"
30
+ }
31
+ end
32
+
33
+ def deep_clone(obj)
34
+ Marshal.load(Marshal.dump(obj))
35
+ end
36
+
37
+ it "doesn't modify data" do
38
+ old_data = deep_clone(data)
39
+ IssueFilter.filter(data)
40
+ old_data.should == data
41
+ end
42
+
43
+ it "adds ki_type" do
44
+ new_data = IssueFilter.filter(data)
45
+ new_data['ki_type'].should == "youtrack_issue"
46
+ end
47
+
48
+ it "includes id" do
49
+ new_data = IssueFilter.filter(data)
50
+ new_data['id'].should == "FA-123"
51
+ end
52
+
53
+ it "includes summary" do
54
+ new_data = IssueFilter.filter(data)
55
+ new_data['summary'].should == "A SUMMARY"
56
+ end
57
+
58
+ it "includes description" do
59
+ new_data = IssueFilter.filter(data)
60
+ new_data['description'].should == "A DESCRIPTION"
61
+ end
62
+
63
+ it "includes custom field" do
64
+ new_data = IssueFilter.filter(data)
65
+ new_data['Type'].should == "Bug"
66
+ end
67
+
68
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Kiseru::ConfigDir do
4
+
5
+ context "when directory does not exist" do
6
+
7
+ it "should create directory" do
8
+ within_construct(false) do |c|
9
+ Kiseru::ConfigDir.new(:root => c)
10
+ File.directory?(c+'.kiseru').should be_true
11
+ end
12
+ end
13
+
14
+ end
15
+
16
+ it "creates ki_pivotal.yml and writes API token" do
17
+ within_construct(false) do |c|
18
+ d = c.directory '.kiseru'
19
+ config_dir = Kiseru::ConfigDir.new(:root => c)
20
+ config = config_dir.config(:ki_pivotal)
21
+
22
+ config.write(:api_token, 'fake_token')
23
+
24
+ config.read(:api_token).should == 'fake_token'
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ include KiYoutrack
3
+
4
+ describe KiYoutrack::Session do
5
+ before do
6
+ # These tests will fail until you create a valid config file
7
+ # by doing 'ki_youtrack setup'
8
+ config = Kiseru::Config[:ki_youtrack]
9
+ @username = config.read(:username)
10
+ @password = config.read(:password)
11
+ @subdomain = config.read(:subdomain)
12
+ end
13
+
14
+ it "fails if credentials are not valid", :vcr do
15
+ # Until a dedicated YouTrack is created for this project
16
+ # a valid subdomain must be supplied otherwise the HTTP
17
+ # status code will be 404 instead of 403
18
+ session = Session.new("foo", "bar", @subdomain, :ssl => false)
19
+ response = session.init
20
+ response.status.should == 403
21
+ response.body['error'].should match /Incorrect login or password/
22
+ end
23
+
24
+ it "responds 200 and gets headers if creds are valid", :vcr do
25
+ session = Session.new(@username, @password, @subdomain, :ssl => false)
26
+ response = session.init
27
+ response.status.should == 200
28
+ response.headers["set-cookie"].should_not be_nil
29
+ session.session_cookies.should == response.headers["set-cookie"]
30
+ end
31
+
32
+ it "uses authentication cookies to get bug", :vcr do
33
+ session = Session.new(@username, @password, @subdomain, :ssl => false)
34
+ session.init
35
+ response = session.get_bug("KI-1")
36
+ response.status.should == 200
37
+ response.body.should_not be_nil
38
+ issue = response.body['issue']
39
+ issue['id'].should == "KI-1"
40
+ end
41
+
42
+ end
metadata ADDED
@@ -0,0 +1,205 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ki_youtrack
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ben Brinckerhoff
9
+ - Aaron Cronin
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-08-14 00:00:00.000000000Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: gli
17
+ requirement: &70324410656340 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *70324410656340
26
+ - !ruby/object:Gem::Dependency
27
+ name: faraday
28
+ requirement: &70324410655920 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *70324410655920
37
+ - !ruby/object:Gem::Dependency
38
+ name: faraday_middleware
39
+ requirement: &70324410655500 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *70324410655500
48
+ - !ruby/object:Gem::Dependency
49
+ name: multi_xml
50
+ requirement: &70324410655080 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: *70324410655080
59
+ - !ruby/object:Gem::Dependency
60
+ name: multi_json
61
+ requirement: &70324410654660 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: *70324410654660
70
+ - !ruby/object:Gem::Dependency
71
+ name: highline
72
+ requirement: &70324410654240 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: *70324410654240
81
+ - !ruby/object:Gem::Dependency
82
+ name: debugger
83
+ requirement: &70324410653820 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *70324410653820
92
+ - !ruby/object:Gem::Dependency
93
+ name: rspec
94
+ requirement: &70324410653400 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: *70324410653400
103
+ - !ruby/object:Gem::Dependency
104
+ name: simplecov
105
+ requirement: &70324410652980 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *70324410652980
114
+ - !ruby/object:Gem::Dependency
115
+ name: test-construct
116
+ requirement: &70324410652560 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *70324410652560
125
+ - !ruby/object:Gem::Dependency
126
+ name: vcr
127
+ requirement: &70324410652140 !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: *70324410652140
136
+ - !ruby/object:Gem::Dependency
137
+ name: webmock
138
+ requirement: &70324410651720 !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: *70324410651720
147
+ description: Kiseru YouTrack client
148
+ email:
149
+ - ben@freeagent.com
150
+ - aaron@freeagent.com
151
+ executables:
152
+ - ki_youtrack
153
+ extensions: []
154
+ extra_rdoc_files: []
155
+ files:
156
+ - .gitignore
157
+ - .rspec
158
+ - Gemfile
159
+ - LICENSE
160
+ - README.md
161
+ - Rakefile
162
+ - bin/ki_youtrack
163
+ - ki_youtrack.gemspec
164
+ - lib/ki_youtrack.rb
165
+ - lib/ki_youtrack/api.rb
166
+ - lib/ki_youtrack/creds.rb
167
+ - lib/ki_youtrack/issue_filter.rb
168
+ - lib/ki_youtrack/kiseru.rb
169
+ - lib/ki_youtrack/session.rb
170
+ - lib/ki_youtrack/version.rb
171
+ - spec/integration/get_bug_spec.rb
172
+ - spec/spec_helper.rb
173
+ - spec/unit/issue_filter_spec.rb
174
+ - spec/unit/kiseru_spec.rb
175
+ - spec/unit/session_spec.rb
176
+ homepage: ''
177
+ licenses: []
178
+ post_install_message:
179
+ rdoc_options: []
180
+ require_paths:
181
+ - lib
182
+ required_ruby_version: !ruby/object:Gem::Requirement
183
+ none: false
184
+ requirements:
185
+ - - ! '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ none: false
190
+ requirements:
191
+ - - ! '>='
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ requirements: []
195
+ rubyforge_project:
196
+ rubygems_version: 1.8.10
197
+ signing_key:
198
+ specification_version: 3
199
+ summary: Kiseru YouTrack client
200
+ test_files:
201
+ - spec/integration/get_bug_spec.rb
202
+ - spec/spec_helper.rb
203
+ - spec/unit/issue_filter_spec.rb
204
+ - spec/unit/kiseru_spec.rb
205
+ - spec/unit/session_spec.rb