git-whistles 1.1.3 → 1.2.0

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: 1570fab64a3d901e07112c5b24f2600958134d5f
4
- data.tar.gz: c86c6b7c16a9400933ec3a9755e1b3cd1b7bc780
3
+ metadata.gz: b659e30382e1005b596ed3571da52157325a2f4a
4
+ data.tar.gz: 3951abb1a603b4331cf63303d64676d434af2a4f
5
5
  SHA512:
6
- metadata.gz: 4bcb16348637e19230673bd62296a43e52779fd6cbff75c80e46e35eb4fc60297cb2b89a001cb1c11a3e298c1a0bb394077694a4c806bcd30abb7f99121940b9
7
- data.tar.gz: 81a10809697b44e1ca514f9d312f9898f6160a79e880e7b1dcb6ae6f7a4e7f8459d18ef9f49e6e9259ca967fba49fec5cc2119d789b11dc513efbf33e3be7363
6
+ metadata.gz: 425ad5de6807b2e74cff7fc9d1b654311f6a432aa3fefe80620b768ab31d6c088a449702e9406afe4cd53d550cc11ffd0bec279b62cb8a8bbb7d72f039b932e1
7
+ data.tar.gz: e97c608e01e976ba08dbca45475e9aa92e7bb73c23c5fb3c8be9ba23a469147cbbfbb33934c224003d097dbc59a7db45ecf2cbf1ff2c52428301a98a883cdbed
data/Gemfile.lock CHANGED
@@ -1,42 +1,50 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- git-whistles (1.1.3)
4
+ git-whistles (1.2.0)
5
5
  jira-ruby (~> 1.0.0)
6
6
  pivotal-tracker (~> 0.5.6)
7
7
  term-ansicolor
8
+ youtrack (~> 0.0.11)
8
9
 
9
10
  GEM
10
11
  remote: https://rubygems.org/
11
12
  specs:
12
- activesupport (4.2.6)
13
+ activesupport (4.2.7.1)
13
14
  i18n (~> 0.7)
14
15
  json (~> 1.7, >= 1.7.7)
15
16
  minitest (~> 5.1)
16
17
  thread_safe (~> 0.3, >= 0.3.4)
17
18
  tzinfo (~> 1.1)
19
+ addressable (2.4.0)
18
20
  builder (3.2.2)
19
21
  coderay (1.1.0)
20
22
  crack (0.4.3)
21
23
  safe_yaml (~> 1.0.0)
22
24
  diff-lcs (1.2.5)
23
- domain_name (0.5.20160128)
25
+ domain_name (0.5.20161021)
24
26
  unf (>= 0.0.5, < 1.0.0)
25
- http-cookie (1.0.2)
27
+ hashdiff (0.3.0)
28
+ http-cookie (1.0.3)
26
29
  domain_name (~> 0.5)
30
+ httparty (0.14.0)
31
+ multi_xml (>= 0.5.2)
27
32
  i18n (0.7.0)
28
33
  jira-ruby (1.0.0)
29
34
  activesupport (~> 4.2, >= 4.2.0)
30
35
  oauth (~> 0.5, >= 0.5.0)
31
36
  json (1.8.3)
32
37
  method_source (0.8.2)
33
- mime-types (2.99.1)
38
+ mime-types (3.1)
39
+ mime-types-data (~> 3.2015)
40
+ mime-types-data (3.2016.0521)
34
41
  mini_portile2 (2.1.0)
35
- minitest (5.9.0)
42
+ minitest (5.9.1)
43
+ multi_xml (0.5.5)
44
+ multipart-post (2.0.0)
36
45
  netrc (0.11.0)
37
- nokogiri (1.6.8)
46
+ nokogiri (1.6.8.1)
38
47
  mini_portile2 (~> 2.1.0)
39
- pkg-config (~> 1.1.7)
40
48
  nokogiri-happymapper (0.5.9)
41
49
  nokogiri (~> 1.5)
42
50
  oauth (0.5.1)
@@ -46,7 +54,6 @@ GEM
46
54
  nokogiri (>= 1.5.5)
47
55
  nokogiri-happymapper (>= 0.5.4)
48
56
  rest-client (>= 1.8.0)
49
- pkg-config (1.1.7)
50
57
  pry (0.10.1)
51
58
  coderay (~> 1.1.0)
52
59
  method_source (~> 0.8.1)
@@ -54,10 +61,10 @@ GEM
54
61
  pry-nav (0.2.4)
55
62
  pry (>= 0.9.10, < 0.11.0)
56
63
  rake (10.4.2)
57
- rest-client (1.8.0)
64
+ rest-client (2.0.0)
58
65
  http-cookie (>= 1.0.2, < 2.0)
59
- mime-types (>= 1.16, < 3.0)
60
- netrc (~> 0.7)
66
+ mime-types (>= 1.16, < 4.0)
67
+ netrc (~> 0.8)
61
68
  rspec (3.2.0)
62
69
  rspec-core (~> 3.2.0)
63
70
  rspec-expectations (~> 3.2.0)
@@ -73,15 +80,23 @@ GEM
73
80
  rspec-support (3.2.2)
74
81
  safe_yaml (1.0.4)
75
82
  slop (3.6.0)
76
- term-ansicolor (1.3.2)
83
+ term-ansicolor (1.4.0)
77
84
  tins (~> 1.0)
78
85
  thread_safe (0.3.5)
79
- tins (1.8.2)
86
+ tins (1.12.0)
80
87
  tzinfo (1.2.2)
81
88
  thread_safe (~> 0.1)
82
89
  unf (0.1.4)
83
90
  unf_ext
84
91
  unf_ext (0.0.7.2)
92
+ vcr (3.0.3)
93
+ webmock (2.1.0)
94
+ addressable (>= 2.3.6)
95
+ crack (>= 0.3.2)
96
+ hashdiff
97
+ youtrack (0.0.11)
98
+ httparty
99
+ multipart-post
85
100
 
86
101
  PLATFORMS
87
102
  ruby
@@ -93,6 +108,8 @@ DEPENDENCIES
93
108
  pry-nav
94
109
  rake
95
110
  rspec
111
+ vcr
112
+ webmock
96
113
 
97
114
  BUNDLED WITH
98
- 1.12.5
115
+ 1.13.1
data/README.md CHANGED
@@ -37,6 +37,8 @@ Install with:
37
37
 
38
38
  `git stash-and-checkout [branch]` - Stash and checkout another branch.
39
39
 
40
+ `git youtrack-branch <ticket-id>` - Creates a branch name suggestion from the specified Youtrack ticket ID.
41
+
40
42
  ### More details on some of the commands
41
43
 
42
44
  #### merge-po
@@ -59,6 +61,21 @@ Add this to .gitattributes:
59
61
 
60
62
  *.po merge=pofile
61
63
  *.pot merge=pofile
64
+
65
+ Or, if you want to make this setting global:
66
+
67
+ Create a user global file ~/.gitattributes and fill it with:
68
+
69
+ *.po merge=pofile
70
+ *.pot merge=pofile
71
+
72
+ Add this to your user global ~/.gitconfig:
73
+
74
+ [core]
75
+ attributesfile = ~/.gitattributes
76
+ [merge "pofile"]
77
+ name = Gettext merge driver
78
+ driver = git merge-po %O %A %B
62
79
 
63
80
  ### JIRA
64
81
 
@@ -80,6 +97,16 @@ the Pivotal Tracker UI. The token can then be set locally via the following comm
80
97
  $ git config [--global] pivotal-tracker.token <token>
81
98
  ```
82
99
 
100
+ ### Youtrack
101
+
102
+ All Youtrack commands require a Youtrack username, password and url. Please use the following commands to set it up:
103
+
104
+ ```
105
+ $ git config [--global] youtrack.username <username>
106
+ $ git config [--global] youtrack.password <password>
107
+ $ git config [--global] youtrack.url <https://your_youtrack_url.com>
108
+ ```
109
+
83
110
  ### License
84
111
 
85
112
  Released on the MIT license terms.
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ #
4
+ # git-youtrack-branch
5
+ #
6
+ # Suggest a branch name from the given YouTrack ticket ID
7
+ #
8
+ # Assumes the branches are named as:
9
+ # <team>/<branch-title>-<story-id>
10
+ #
11
+ require 'rubygems'
12
+ require 'optparse'
13
+ require 'youtrack'
14
+ require 'readline'
15
+ require 'term/ansicolor'
16
+ require 'git-whistles/app'
17
+ require 'git-whistles/youtrack/branch'
18
+
19
+
20
+ Git::Whistles::Youtrack::Branch.run!
data/git-whistles.gemspec CHANGED
@@ -20,10 +20,13 @@ Gem::Specification.new do |gem|
20
20
  gem.add_development_dependency "pry"
21
21
  gem.add_development_dependency "pry-nav"
22
22
  gem.add_development_dependency "rspec"
23
+ gem.add_development_dependency "webmock"
24
+ gem.add_development_dependency "vcr"
23
25
 
24
26
  gem.add_dependency "pivotal-tracker", "~> 0.5.6"
25
27
  gem.add_dependency "term-ansicolor"
26
28
  gem.add_dependency "jira-ruby", "~> 1.0.0"
29
+ gem.add_dependency "youtrack", "~> 0.0.11"
27
30
 
28
31
  gem.files = `git ls-files`.split($\)
29
32
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -4,7 +4,7 @@ require 'pathname'
4
4
 
5
5
  module Git
6
6
  module Whistles
7
- VERSION = "1.1.3"
7
+ VERSION = "1.2.0"
8
8
  GEMDIR = Pathname.new(__FILE__).parent.parent.parent
9
9
  end
10
10
  end
@@ -0,0 +1,79 @@
1
+ require 'youtrack'
2
+ require_relative 'ticket'
3
+ require 'term/ansicolor'
4
+
5
+ module Git::Whistles
6
+ module Youtrack
7
+ class Api
8
+ def find_ticket(id)
9
+ ticket_hash = find_issue(id)
10
+ Ticket.build_from_remote(ticket_hash)
11
+ end
12
+
13
+ def username
14
+ username = `git config youtrack.username`.strip
15
+
16
+ if username.empty?
17
+ puts Term::ANSIColor.yellow %Q{
18
+ Can't find Youtrack username!
19
+ Please set it with:
20
+ $ git config [--global] youtrack.username <username>
21
+ }
22
+ end
23
+
24
+ username
25
+ end
26
+
27
+ def password
28
+ password = `git config youtrack.password`.strip
29
+
30
+ if password.empty?
31
+ puts Term::ANSIColor.yellow %Q{
32
+ Can't find Youtrack password!
33
+ Please set it with:
34
+ $ git config [--global] youtrack.password <password>
35
+ }
36
+ end
37
+
38
+ password
39
+ end
40
+
41
+ def url
42
+ url = `git config youtrack.url`.strip
43
+
44
+ if url.empty?
45
+ puts Term::ANSIColor.yellow %Q{
46
+ Can't find Youtrack URL!
47
+ Please set it with:
48
+ $ git config [--global] youtrack.url <https://mydomain.youtrack.net>
49
+ }
50
+ end
51
+
52
+ url
53
+ end
54
+
55
+ private
56
+
57
+ def issues
58
+ @issues ||= client.issues
59
+ end
60
+
61
+ def client
62
+ @client ||= ::Youtrack::Client.new do |c|
63
+ c.url = url
64
+ c.login = username
65
+ c.password = password
66
+ end
67
+
68
+ @client.connect! unless @client.connected?
69
+ @client
70
+ end
71
+
72
+ def find_issue id
73
+ issues.find(id)
74
+ rescue
75
+ nil
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,78 @@
1
+ require_relative '../app'
2
+ require_relative '../youtrack/api'
3
+ require_relative '../youtrack/ticket'
4
+
5
+ module Git::Whistles
6
+ module Youtrack
7
+ class Branch < Git::Whistles::App
8
+
9
+ def initialize(current_dir: ENV['PWD'])
10
+ @current_dir = current_dir
11
+ super()
12
+ end
13
+
14
+ def main(args)
15
+ super
16
+
17
+ parse_args!(args)
18
+ if args.count < 1
19
+ puts Term::ANSIColor.yellow usage
20
+ return false
21
+ end
22
+
23
+ ticket = get_ticket_from args[0]
24
+ if ticket.nil?
25
+ die "Could not find ticket #{args[0]}"
26
+ return false
27
+ end
28
+
29
+ suggested_branch_name = suggested_branch_name_from(ticket)
30
+ print_suggested_branch suggested_branch_name
31
+
32
+ user_branch_name = read_user_answer
33
+ show_and_exit "Cancelled by user" if user_branch_name.nil?
34
+
35
+ final_branch_name = user_branch_name.empty? ? suggested_branch_name : user_branch_name
36
+ create_branch final_branch_name
37
+
38
+ puts Term::ANSIColor.green 'Created branch'
39
+ true
40
+ end
41
+
42
+ private
43
+
44
+ def usage
45
+ 'Usage: git youtrack-branch YOUTRACK_STORY_ID'
46
+ end
47
+
48
+ def get_ticket_from ticket_id
49
+ youtrack_client.find_ticket ticket_id
50
+ end
51
+
52
+ def youtrack_client
53
+ @youtrack_client ||= Git::Whistles::Youtrack::Api.new
54
+ end
55
+
56
+ def suggested_branch_name_from ticket
57
+ "#{ticket.project}/#{ticket.title}-#{ticket.id}".
58
+ downcase.
59
+ gsub(/[^\w\d\/]/, '-').gsub!(/-+/, '-')
60
+ end
61
+
62
+ def print_suggested_branch branch_name
63
+ puts 'The suggested branch name is: ' << Term::ANSIColor.yellow(branch_name)
64
+ puts ' Press ENTER if you agree'
65
+ puts ' or Write any other name and press ENTER'
66
+ puts ' or Press CTRL-D to cancel'
67
+ end
68
+
69
+ def read_user_answer
70
+ Readline.readline ' > ', false
71
+ end
72
+
73
+ def create_branch branch_name
74
+ `cd #{@current_dir} && git checkout -b #{branch_name}`
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,60 @@
1
+ module Git::Whistles
2
+ module Youtrack
3
+ class Ticket
4
+ class << self
5
+ def build_from_remote(ticket_hash)
6
+ return nil if ticket_hash.nil?
7
+ return nil if issue_not_found? ticket_hash
8
+
9
+ self.new.tap do |ticket|
10
+ ticket.title = title_from ticket_hash
11
+ ticket.id = id_from ticket_hash
12
+ ticket.project = project_from ticket_hash
13
+ ticket.description = description_from ticket_hash
14
+ end
15
+ end
16
+
17
+ def title_from(ticket_hash)
18
+ ticket_hash
19
+ .dig('issue', 'field')
20
+ .select { |f| f['name'] == 'summary' }
21
+ .first.dig('value')
22
+ end
23
+
24
+ def id_from(ticket_hash)
25
+ ticket_hash
26
+ .dig('issue', 'field')
27
+ .select { |f| f['name'] == 'numberInProject' }
28
+ .first.dig('value').to_i
29
+ end
30
+
31
+ def project_from(ticket_hash)
32
+ ticket_hash
33
+ .dig('issue', 'field')
34
+ .select { |f| f['name'] == 'projectShortName' }
35
+ .first.dig('value')
36
+ end
37
+
38
+ def description_from(ticket_hash)
39
+ ticket_hash
40
+ .dig('issue', 'field')
41
+ .select { |f| f['name'] == 'description' }
42
+ .first.dig('value')
43
+ end
44
+
45
+ def issue_not_found?(ticket_hash)
46
+ if ticket_hash["error"]
47
+ true
48
+ else
49
+ false
50
+ end
51
+ end
52
+ end
53
+
54
+ attr_accessor :title
55
+ attr_accessor :id
56
+ attr_accessor :project
57
+ attr_accessor :description
58
+ end
59
+ end
60
+ end
@@ -1,4 +1,4 @@
1
- #!/bin/sh
1
+ #!/bin/bash
2
2
  #
3
3
  # Three-way merge driver for PO files
4
4
  #
@@ -0,0 +1,77 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://youtrack.com/rest/user/login
6
+ body:
7
+ encoding: UTF-8
8
+ string: login=some_username&password=some_password
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 404
19
+ message: Not Found
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Mon, 26 Sep 2016 16:48:12 GMT
25
+ Content-Type:
26
+ - text/html
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Vary:
32
+ - Accept-Encoding
33
+ Last-Modified:
34
+ - Mon, 06 Oct 2014 10:16:51 GMT
35
+ Etag:
36
+ - W/"1745269-3fe-504be61a22cc6"
37
+ X-Powered-By:
38
+ - PleskLin
39
+ body:
40
+ encoding: ASCII-8BIT
41
+ string: |
42
+ <HTML>
43
+ <HEAD>
44
+ <TITLE>404 Not Found</TITLE>
45
+ <BASE href="/error_docs/"><!--[if lte IE 6]></BASE><![endif]-->
46
+ </HEAD>
47
+ <BODY>
48
+ <H1>Not Found</H1>
49
+ The requested document was not found on this server.
50
+ <P>
51
+ <HR>
52
+ <ADDRESS>
53
+ Web Server at youtrack.com
54
+ </ADDRESS>
55
+ </BODY>
56
+ </HTML>
57
+
58
+ <!--
59
+ - Unfortunately, Microsoft has added a clever new
60
+ - "feature" to Internet Explorer. If the text of
61
+ - an error's message is "too small", specifically
62
+ - less than 512 bytes, Internet Explorer returns
63
+ - its own error message. You can turn that off,
64
+ - but it's pretty tricky to find switch called
65
+ - "smart error messages". That means, of course,
66
+ - that short error messages are censored by default.
67
+ - IIS always returns error messages that are long
68
+ - enough to make Internet Explorer happy. The
69
+ - workaround is pretty simple: pad the error
70
+ - message with a big comment like this to push it
71
+ - over the five hundred and twelve bytes minimum.
72
+ - Of course, that's exactly what you're reading
73
+ - right now.
74
+ -->
75
+ http_version:
76
+ recorded_at: Mon, 26 Sep 2016 16:48:55 GMT
77
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,81 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://youtrack.com/rest/user/login
6
+ body:
7
+ encoding: UTF-8
8
+ string: login=some_username&password=some_password
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx/1.9.5
23
+ Date:
24
+ - Mon, 26 Sep 2016 16:44:24 GMT
25
+ Content-Type:
26
+ - application/xml;charset=UTF-8
27
+ Content-Length:
28
+ - '17'
29
+ Connection:
30
+ - keep-alive
31
+ Set-Cookie:
32
+ - YTSESSIONID=1mcbb8c57vxc5zoaxfanbijc3;Path=/;HttpOnly
33
+ - jetbrains.charisma.main.security.PRINCIPAL=ZGM3YzVjNzc4YjkwMWQ2ZmI1OTgwOWQwYzI4MTQ1OGEyNzVhNDFlMWQyOTEwNTNiMzRkZjQ4YmE2ODRiMmUyYjphbGZyZWRvLm1vdHRh;Path=/;Expires=Tue,
34
+ 26-Sep-2017 16:44:24 GMT
35
+ Expires:
36
+ - Thu, 01 Jan 1970 00:00:00 GMT
37
+ Access-Control-Expose-Headers:
38
+ - Location
39
+ Cache-Control:
40
+ - no-cache, no-store, no-transform, must-revalidate
41
+ body:
42
+ encoding: UTF-8
43
+ string: "<login>ok</login>"
44
+ http_version:
45
+ recorded_at: Mon, 26 Sep 2016 16:43:51 GMT
46
+ - request:
47
+ method: get
48
+ uri: http://youtrack.com/rest/issue/non-existent
49
+ body:
50
+ encoding: US-ASCII
51
+ string: ''
52
+ headers:
53
+ Cookie:
54
+ - YTSESSIONID=1mcbb8c57vxc5zoaxfanbijc3;Path=/;HttpOnly, jetbrains.charisma.main.security.PRINCIPAL=ZGM3YzVjNzc4YjkwMWQ2ZmI1OTgwOWQwYzI4MTQ1OGEyNzVhNDFlMWQyOTEwNTNiMzRkZjQ4YmE2ODRiMmUyYjphbGZyZWRvLm1vdHRh;Path=/;Expires=Tue,
55
+ 26-Sep-2017 16:44:24 GMT
56
+ response:
57
+ status:
58
+ code: 404
59
+ message: Not Found
60
+ headers:
61
+ Server:
62
+ - nginx/1.9.5
63
+ Date:
64
+ - Mon, 26 Sep 2016 16:44:24 GMT
65
+ Content-Type:
66
+ - application/xml;charset=UTF-8
67
+ Content-Length:
68
+ - '86'
69
+ Connection:
70
+ - keep-alive
71
+ Access-Control-Expose-Headers:
72
+ - Location
73
+ Cache-Control:
74
+ - no-cache, no-store, no-transform, must-revalidate
75
+ body:
76
+ encoding: UTF-8
77
+ string: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><error>Issue
78
+ not found.</error>
79
+ http_version:
80
+ recorded_at: Mon, 26 Sep 2016 16:43:51 GMT
81
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,184 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://youtrack.com/rest/user/login
6
+ body:
7
+ encoding: UTF-8
8
+ string: login=alfredo.motta&password=some_password
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx/1.9.5
23
+ Date:
24
+ - Thu, 08 Sep 2016 18:20:27 GMT
25
+ Content-Type:
26
+ - application/xml;charset=UTF-8
27
+ Content-Length:
28
+ - '17'
29
+ Connection:
30
+ - keep-alive
31
+ Set-Cookie:
32
+ - YTSESSIONID=24bw6qyuglya1pq9p2oh0qtnj;Path=/;HttpOnly
33
+ - jetbrains.charisma.main.security.PRINCIPAL=ZGM3YzVjNzc4YjkwMWQ2ZmI1OTgwOWQwYzI4MTQ1OGEyNzVhNDFlMWQyOTEwNTNiMzRkZjQ4YmE2ODRiMmUyYjphbGZyZWRvLm1vdHRh;Path=/;Expires=Fri,
34
+ 08-Sep-2017 18:20:27 GMT
35
+ Expires:
36
+ - Thu, 01 Jan 1970 00:00:00 GMT
37
+ Cache-Control:
38
+ - no-cache, no-store, no-transform, must-revalidate
39
+ Access-Control-Expose-Headers:
40
+ - Location
41
+ body:
42
+ encoding: UTF-8
43
+ string: "<login>ok</login>"
44
+ http_version:
45
+ recorded_at: Thu, 08 Sep 2016 18:19:06 GMT
46
+ - request:
47
+ method: get
48
+ uri: http://youtrack.com/rest/issue/PIO-338
49
+ body:
50
+ encoding: US-ASCII
51
+ string: ''
52
+ headers:
53
+ Cookie:
54
+ - YTSESSIONID=24bw6qyuglya1pq9p2oh0qtnj;Path=/;HttpOnly, jetbrains.charisma.main.security.PRINCIPAL=ZGM3YzVjNzc4YjkwMWQ2ZmI1OTgwOWQwYzI4MTQ1OGEyNzVhNDFlMWQyOTEwNTNiMzRkZjQ4YmE2ODRiMmUyYjphbGZyZWRvLm1vdHRh;Path=/;Expires=Fri,
55
+ 08-Sep-2017 18:20:27 GMT
56
+ response:
57
+ status:
58
+ code: 200
59
+ message: OK
60
+ headers:
61
+ Server:
62
+ - nginx/1.9.5
63
+ Date:
64
+ - Thu, 08 Sep 2016 18:20:27 GMT
65
+ Content-Type:
66
+ - application/xml;charset=UTF-8
67
+ Transfer-Encoding:
68
+ - chunked
69
+ Connection:
70
+ - keep-alive
71
+ Cache-Control:
72
+ - no-cache, no-store, no-transform, must-revalidate
73
+ Access-Control-Expose-Headers:
74
+ - Location
75
+ body:
76
+ encoding: UTF-8
77
+ string: "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><issue
78
+ id=\"PIO-338\" entityId=\"75-11159\"><field xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
79
+ xsi:type=\"SingleField\" name=\"projectShortName\"><value>PIO</value></field><field
80
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"SingleField\"
81
+ name=\"numberInProject\"><value>338</value></field><field xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
82
+ xsi:type=\"SingleField\" name=\"summary\"><value>Header styling changes</value></field><field
83
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"SingleField\"
84
+ name=\"description\"><value>==Why==\n\nCurrent header is taking a lot of space
85
+ (white space on top of page) which is being wasted/not used for any purpose.
86
+ \nWe want to push the form to the top, so it stays over the fold as much as
87
+ possible.\n\n==What==\n\nApply styling changes as seen on the design.\n. white
88
+ space disappears\n. \"retrieve application\" moves to the top - font color:white;
89
+ \ hover text-style:underline;\n. zopa logo sits on top of the blue image.\n.
90
+ font-weight on progress steps: 600;\n. make sure form is left aligned together
91
+ with car graphic and step 1 circle.\n. logos attached @1x,@2x\n\n***make sure
92
+ by changing link style on top right, it doesnt change bottom one. We should
93
+ have 2 link styles:\n1. white text on dark backgrounds\n2. green text on light
94
+ backgrounds</value></field><field xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
95
+ xsi:type=\"SingleField\" name=\"created\"><value>1470145056062</value></field><field
96
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"SingleField\"
97
+ name=\"updated\"><value>1473345934647</value></field><field xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
98
+ xsi:type=\"SingleField\" name=\"updaterName\"><value>Orrin_Ward</value></field><field
99
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"SingleField\"
100
+ name=\"updaterFullName\"><value>Orrin Ward</value></field><field xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
101
+ xsi:type=\"SingleField\" name=\"reporterName\"><value>natalia.alvarez</value></field><field
102
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"SingleField\"
103
+ name=\"reporterFullName\"><value>Natalia Alvarez</value></field><field xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
104
+ xsi:type=\"SingleField\" name=\"commentsCount\"><value>12</value></field><field
105
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"SingleField\"
106
+ name=\"votes\"><value>0</value></field><field xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
107
+ xsi:type=\"LinkField\" name=\"links\"><value type=\"Subtask\" role=\"subtask
108
+ of\">PIO-287</value></field><field xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
109
+ xsi:type=\"CustomFieldValue\" name=\"Type\"><value>Functional Story</value><valueId>Functional
110
+ Story</valueId><color><bg>#0066cc</bg><fg>white</fg></color></field><field
111
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"MultiUserField\"
112
+ name=\"Owner\"><value fullName=\"Natalia Alvarez\">natalia.alvarez</value></field><field
113
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CustomFieldValue\"
114
+ name=\"State\"><value>Acceptance</value><valueId>Acceptance</valueId><color><bg>#d9ffc8</bg><fg>#000</fg></color></field><field
115
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CustomFieldValue\"
116
+ name=\"Status\"><value>Ready</value><valueId>Ready</valueId><color><bg>#0066cc</bg><fg>white</fg></color></field><field
117
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CustomFieldValue\"
118
+ name=\"Size\"><value>2</value><valueId>2</valueId></field><field xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
119
+ xsi:type=\"MultiUserField\" name=\"Assignee\"><value fullName=\"Greg Baker\">greg.baker</value><value
120
+ fullName=\"Natalia Alvarez\">natalia.alvarez</value></field><field xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
121
+ xsi:type=\"CustomFieldValue\" name=\"Sprint\"><value>Sprint Sixxx</value><value>Sprint
122
+ Seven</value><value>Sprint Eight</value><valueId>Sprint Sixxx</valueId><valueId>Sprint
123
+ Seven</valueId><valueId>Sprint Eight</valueId></field><field xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
124
+ xsi:type=\"CustomFieldValue\" name=\"Feature Flag\"><value>No</value><valueId>No</valueId></field><field
125
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CustomFieldValue\"
126
+ name=\"Squad\"><value>Pioneers</value><valueId>Pioneers</valueId></field><field
127
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CustomFieldValue\"
128
+ name=\"Estimation\"><value>240</value><valueId>4h</valueId></field><field
129
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CustomFieldValue\"
130
+ name=\"CombinedBoard\"><value>SharedView</value><valueId>SharedView</valueId></field><field
131
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CustomFieldValue\"
132
+ name=\"Infosec Signoff\"><value>Not required</value><valueId>Not required</valueId><color><bg>#339933</bg><fg>white</fg></color></field><field
133
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CustomFieldValue\"
134
+ name=\"Compliance Signoff\"><value>Not required</value><valueId>Not required</valueId><color><bg>#339933</bg><fg>white</fg></color></field><field
135
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CustomFieldValue\"
136
+ name=\"Risk Signoff\"><value>Not required</value><valueId>Not required</valueId><color><bg>#339933</bg><fg>white</fg></color></field><field
137
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"AttachmentField\"
138
+ name=\"attachments\"><value id=\"89-3241\" url=\"http://youtrack.zopian.ad.zopa.com/_persistent/header%20changes%402x.png?file=89-3241&amp;v=0&amp;c=true\">header
139
+ changes@2x.png</value><value id=\"89-3243\" url=\"http://youtrack.zopian.ad.zopa.com/_persistent/ZopaLogo.png?file=89-3243&amp;v=0&amp;c=true\">ZopaLogo.png</value><value
140
+ id=\"89-3244\" url=\"http://youtrack.zopian.ad.zopa.com/_persistent/ZopaLogo%402x.png?file=89-3244&amp;v=0&amp;c=true\">ZopaLogo@2x.png</value><value
141
+ id=\"89-3385\" url=\"http://youtrack.zopian.ad.zopa.com/_persistent/header-375%3E%402x.png?file=89-3385&amp;v=0&amp;c=true\">header-375&gt;@2x.png</value></field><comment
142
+ id=\"88-12408\" author=\"tom.groombridge\" authorFullName=\"Tom Groombridge\"
143
+ issueId=\"PIO-338\" deleted=\"false\" text=\"can we estimate this? \" shownForIssueAuthor=\"false\"
144
+ created=\"1470159862211\"><replies/></comment><comment id=\"88-12411\" author=\"natalia.alvarez\"
145
+ authorFullName=\"Natalia Alvarez\" issueId=\"PIO-338\" deleted=\"false\" text=\"@greg.baker
146
+ could you please estimate? you ll have a better guess than I\" shownForIssueAuthor=\"false\"
147
+ created=\"1470212064496\"><replies/></comment><comment id=\"88-12466\" author=\"tom.groombridge\"
148
+ authorFullName=\"Tom Groombridge\" issueId=\"PIO-338\" deleted=\"false\" text=\"need
149
+ mobile designs to finish this card off\" shownForIssueAuthor=\"false\" created=\"1470302300253\"
150
+ updated=\"1470159862199\"><replies/></comment><comment id=\"88-12662\" author=\"alfredo.motta\"
151
+ authorFullName=\"Alfredo Motta\" issueId=\"PIO-338\" deleted=\"false\" text=\"Why
152
+ this is not progressing? @natalia.alvarez &#xA;Where is the PR? @tom.groombridge
153
+ @kate.beavis \" shownForIssueAuthor=\"false\" created=\"1470994574703\"><replies/></comment><comment
154
+ id=\"88-12664\" author=\"kate.beavis\" authorFullName=\"Kate Beavis\" issueId=\"PIO-338\"
155
+ deleted=\"false\" text=\"I don't know what is happening with this, I raised
156
+ it in Hipchat but there was no response, @tom.groombridge should have a better
157
+ idea than me as he moved it into acceptance\" shownForIssueAuthor=\"false\"
158
+ created=\"1470994880006\"><replies/></comment><comment id=\"88-12668\" author=\"tom.groombridge\"
159
+ authorFullName=\"Tom Groombridge\" issueId=\"PIO-338\" deleted=\"false\" text=\"possibly
160
+ @greg.baker said this was done at the last retro.... Maybe I'm wrong though.\"
161
+ shownForIssueAuthor=\"false\" created=\"1470995969242\" updated=\"1470302300238\"><replies/></comment><comment
162
+ id=\"88-13007\" author=\"marie.steinthaler\" authorFullName=\"Marie Steinthaler\"
163
+ issueId=\"PIO-338\" deleted=\"false\" text=\"@greg.baker what's up with this
164
+ one? This doesn't seem to be in either sandbox or prod. Let's crush this one,
165
+ seems easy.\" shownForIssueAuthor=\"false\" created=\"1472055010957\"><replies/></comment><comment
166
+ id=\"88-13066\" author=\"greg.baker\" authorFullName=\"Greg Baker\" issueId=\"PIO-338\"
167
+ deleted=\"false\" text=\"we need a mobile design to finish this off. it has
168
+ been done for web, but the mobile view doesn't look ideal&#xA;\" shownForIssueAuthor=\"false\"
169
+ created=\"1472131737590\"><replies/></comment><comment id=\"88-13166\" author=\"alfredo.motta\"
170
+ authorFullName=\"Alfredo Motta\" issueId=\"PIO-338\" deleted=\"false\" text=\"have
171
+ we pushing this forward then?\" shownForIssueAuthor=\"false\" created=\"1472577102355\"><replies/></comment><comment
172
+ id=\"88-13216\" author=\"marie.steinthaler\" authorFullName=\"Marie Steinthaler\"
173
+ issueId=\"PIO-338\" deleted=\"false\" text=\"@natalia.alvarez the guys need
174
+ a mobile design - can you help please :-) Thanks!\" shownForIssueAuthor=\"false\"
175
+ created=\"1472660527813\"><replies/></comment><comment id=\"88-13220\" author=\"natalia.alvarez\"
176
+ authorFullName=\"Natalia Alvarez\" issueId=\"PIO-338\" deleted=\"false\" text=\"@marie.steinthaler
177
+ mobile version attached\" shownForIssueAuthor=\"false\" created=\"1472717148927\"
178
+ updated=\"1470212064475\"><replies/></comment><comment id=\"88-13515\" author=\"Orrin_Ward\"
179
+ authorFullName=\"Orrin Ward\" issueId=\"PIO-338\" deleted=\"false\" text=\"This
180
+ shouldn't be a &quot;Functional Story&quot; in Acceptance unless there is
181
+ code, and a PR, in UAT.\" shownForIssueAuthor=\"false\" created=\"1473345934653\"><replies/></comment></issue>"
182
+ http_version:
183
+ recorded_at: Thu, 08 Sep 2016 18:19:06 GMT
184
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+ require 'webmock'
3
+ require_relative '../../../support/vcr_helper'
4
+ require 'git-whistles/youtrack/api'
5
+
6
+ describe Git::Whistles::Youtrack::Api do
7
+ before do
8
+ allow(subject).to receive(:`).
9
+ with('git config youtrack.username').
10
+ and_return('some_username')
11
+
12
+ allow(subject).to receive(:`).
13
+ with('git config youtrack.password').
14
+ and_return('some_password')
15
+
16
+ allow(subject).to receive(:`).
17
+ with('git config youtrack.url').
18
+ and_return('http://youtrack.com/')
19
+ end
20
+
21
+ describe '#username' do
22
+ it 'returns the youtrack api username' do
23
+ expect(subject.username).to eq('some_username')
24
+ end
25
+ end
26
+
27
+ describe '#password' do
28
+ it 'returns the youtrack api password' do
29
+ expect(subject.password).to eq('some_password')
30
+ end
31
+ end
32
+
33
+ describe '#find_ticket' do
34
+ context 'when successfull' do
35
+ it 'returns a ticket with title' do
36
+ VCR.use_cassette('get_ticket_successfull') do
37
+ ticket = subject.find_ticket('PIO-338')
38
+
39
+ expect(ticket.title).to eq("Header styling changes")
40
+ end
41
+ end
42
+
43
+ it 'returns a ticket with id' do
44
+ VCR.use_cassette('get_ticket_successfull') do
45
+ ticket = subject.find_ticket('PIO-338')
46
+
47
+ expect(ticket.id).to eq(338)
48
+ end
49
+ end
50
+
51
+ it 'returns a ticket project name' do
52
+ VCR.use_cassette('get_ticket_successfull') do
53
+ ticket = subject.find_ticket('PIO-338')
54
+
55
+ expect(ticket.project).to eq("PIO")
56
+ end
57
+ end
58
+
59
+ it 'returns a ticket description' do
60
+ VCR.use_cassette('get_ticket_successfull') do
61
+ ticket = subject.find_ticket('PIO-338')
62
+
63
+ expect(ticket.description).to include("==Why==")
64
+ end
65
+ end
66
+ end
67
+
68
+ context 'when ticket not found' do
69
+ it 'returns nil' do
70
+ VCR.use_cassette('get_ticket_not_found') do
71
+ ticket = subject.find_ticket('non-existent')
72
+
73
+ expect(ticket).to be_nil
74
+ end
75
+ end
76
+ end
77
+
78
+ context 'when authentication fails' do
79
+ it 'returns nil' do
80
+ VCR.use_cassette('get_ticket_auth_failure') do
81
+ ticket = subject.find_ticket('PIO-338')
82
+
83
+ expect(ticket).to be_nil
84
+ end
85
+ end
86
+ end
87
+
88
+ context 'when credentials not setup' do
89
+ before do
90
+ allow(subject).to receive(:`).
91
+ with('git config youtrack.username').
92
+ and_return('')
93
+
94
+ allow(Term::ANSIColor).to receive(:yellow).and_return "warning for user"
95
+ end
96
+
97
+ it 'prints a message and returns nil' do
98
+ expect(subject).to receive(:puts).with "warning for user"
99
+
100
+ VCR.use_cassette('get_ticket_auth_failure') do
101
+ ticket = subject.find_ticket('PIO-338')
102
+
103
+ expect(ticket).to be_nil
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+ require 'git-whistles/youtrack/branch'
3
+
4
+ RSpec.describe Git::Whistles::Youtrack::Branch do
5
+ describe '#main' do
6
+ subject { described_class.new(current_dir: '/home/myuser') }
7
+
8
+ context 'with no arguments' do
9
+ it 'prints an error message' do
10
+ expect(subject).to receive(:puts).with("\e[33mUsage: git youtrack-branch YOUTRACK_STORY_ID\e[0m")
11
+
12
+ subject.main([])
13
+ end
14
+
15
+ it 'returns false' do
16
+ expect(subject).to receive(:puts)
17
+
18
+ expect(subject.main([])).to eq(false)
19
+ end
20
+ end
21
+
22
+ context 'with a ticket id argument' do
23
+ before do
24
+ expect(Readline).to receive(:readline).and_return ""
25
+ expect(Git::Whistles::Youtrack::Api).to receive(:new).and_return youtrack_api
26
+ expect(subject).to receive(:puts).at_least(:once)
27
+ end
28
+
29
+ let(:youtrack_api) { double(find_ticket: ticket) }
30
+ let(:ticket_id) { "338" }
31
+ let(:ticket) do
32
+ Git::Whistles::Youtrack::Ticket.new.tap do |ticket|
33
+ ticket.title = "Some title"
34
+ ticket.project = "PRJ"
35
+ ticket.id = ticket_id.to_i
36
+ ticket.description = "Some description"
37
+ end
38
+ end
39
+
40
+ it 'issues a neat checkout command' do
41
+ expect(subject).to receive(:`).with('cd /home/myuser && git checkout -b prj/some-title-338')
42
+
43
+ subject.main([ticket_id])
44
+ end
45
+
46
+ it 'returns true' do
47
+ expect(subject).to receive(:`)
48
+
49
+ expect(subject.main([ticket_id])).to eq(true)
50
+ end
51
+ end
52
+ end
53
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,91 +1,11 @@
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
- # The generated `.rspec` file contains `--require spec_helper` which will cause
4
- # this file to always be loaded, without a need to explicitly require it in any
5
- # files.
6
- #
7
- # Given that it is always loaded, you are encouraged to keep this file as
8
- # light-weight as possible. Requiring heavyweight dependencies from this file
9
- # will add to the boot time of your test suite on EVERY test run, even for an
10
- # individual file that may not need all of that loaded. Instead, consider making
11
- # a separate helper file that requires the additional dependencies and performs
12
- # the additional setup, and require it from the spec files that actually need
13
- # it.
14
- #
15
- # The `.rspec` file also contains a few flags that are not defaults but that
16
- # users commonly want.
17
- #
18
- # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
2
+
19
3
  RSpec.configure do |config|
20
- # rspec-expectations config goes here. You can use an alternate
21
- # assertion/expectation library such as wrong or the stdlib/minitest
22
- # assertions if you prefer.
23
4
  config.expect_with :rspec do |expectations|
24
- # This option will default to `true` in RSpec 4. It makes the `description`
25
- # and `failure_message` of custom matchers include text for helper methods
26
- # defined using `chain`, e.g.:
27
- # be_bigger_than(2).and_smaller_than(4).description
28
- # # => "be bigger than 2 and smaller than 4"
29
- # ...rather than:
30
- # # => "be bigger than 2"
31
5
  expectations.include_chain_clauses_in_custom_matcher_descriptions = true
32
6
  end
33
7
 
34
- # rspec-mocks config goes here. You can use an alternate test double
35
- # library (such as bogus or mocha) by changing the `mock_with` option here.
36
8
  config.mock_with :rspec do |mocks|
37
- # Prevents you from mocking or stubbing a method that does not exist on
38
- # a real object. This is generally recommended, and will default to
39
- # `true` in RSpec 4.
40
9
  mocks.verify_partial_doubles = true
41
10
  end
42
-
43
- # The settings below are suggested to provide a good initial experience
44
- # with RSpec, but feel free to customize to your heart's content.
45
- =begin
46
- # These two settings work together to allow you to limit a spec run
47
- # to individual examples or groups you care about by tagging them with
48
- # `:focus` metadata. When nothing is tagged with `:focus`, all examples
49
- # get run.
50
- config.filter_run :focus
51
- config.run_all_when_everything_filtered = true
52
-
53
- # Limits the available syntax to the non-monkey patched syntax that is
54
- # recommended. For more details, see:
55
- # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
56
- # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
57
- # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
58
- config.disable_monkey_patching!
59
-
60
- # This setting enables warnings. It's recommended, but in some cases may
61
- # be too noisy due to issues in dependencies.
62
- config.warnings = true
63
-
64
- # Many RSpec users commonly either run the entire suite or an individual
65
- # file, and it's useful to allow more verbose output when running an
66
- # individual spec file.
67
- if config.files_to_run.one?
68
- # Use the documentation formatter for detailed output,
69
- # unless a formatter has already been configured
70
- # (e.g. via a command-line flag).
71
- config.default_formatter = 'doc'
72
- end
73
-
74
- # Print the 10 slowest examples and example groups at the
75
- # end of the spec run, to help surface which specs are running
76
- # particularly slow.
77
- config.profile_examples = 10
78
-
79
- # Run specs in random order to surface order dependencies. If you find an
80
- # order dependency and want to debug it, you can fix the order by providing
81
- # the seed, which is printed after each run.
82
- # --seed 1234
83
- config.order = :random
84
-
85
- # Seed global randomization in this process using the `--seed` CLI option.
86
- # Setting this allows you to use `--seed` to deterministically reproduce
87
- # test failures related to randomization by passing the same `--seed` value
88
- # as the one that triggered the failure.
89
- Kernel.srand config.seed
90
- =end
91
11
  end
@@ -0,0 +1,8 @@
1
+ require 'vcr'
2
+
3
+ VCR.configure do |config|
4
+ config.cassette_library_dir = "spec/fixtures/vcr"
5
+ config.hook_into :webmock
6
+ # config.debug_logger = $stdout
7
+ config.ignore_localhost = true
8
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-whistles
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julien Letessier
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-07-08 00:00:00.000000000 Z
12
+ date: 2016-11-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -81,6 +81,34 @@ dependencies:
81
81
  - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: webmock
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: vcr
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
84
112
  - !ruby/object:Gem::Dependency
85
113
  name: pivotal-tracker
86
114
  requirement: !ruby/object:Gem::Requirement
@@ -123,6 +151,20 @@ dependencies:
123
151
  - - "~>"
124
152
  - !ruby/object:Gem::Version
125
153
  version: 1.0.0
154
+ - !ruby/object:Gem::Dependency
155
+ name: youtrack
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: 0.0.11
161
+ type: :runtime
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: 0.0.11
126
168
  description: A few helpers for classic Git workflows
127
169
  email:
128
170
  - julien.letessier@gmail.com
@@ -142,6 +184,7 @@ executables:
142
184
  - git-select
143
185
  - git-stash-and-checkout
144
186
  - git-whistles
187
+ - git-youtrack-branch
145
188
  extensions: []
146
189
  extra_rdoc_files: []
147
190
  files:
@@ -168,6 +211,7 @@ files:
168
211
  - bin/git-select
169
212
  - bin/git-stash-and-checkout
170
213
  - bin/git-whistles
214
+ - bin/git-youtrack-branch
171
215
  - git-whistles.gemspec
172
216
  - lib/git-whistles.rb
173
217
  - lib/git-whistles/app.rb
@@ -175,6 +219,9 @@ files:
175
219
  - lib/git-whistles/jira.rb
176
220
  - lib/git-whistles/logger.rb
177
221
  - lib/git-whistles/version.rb
222
+ - lib/git-whistles/youtrack/api.rb
223
+ - lib/git-whistles/youtrack/branch.rb
224
+ - lib/git-whistles/youtrack/ticket.rb
178
225
  - libexec/git-chop.sh
179
226
  - libexec/git-list-branches.sh
180
227
  - libexec/git-merge-po.sh
@@ -183,8 +230,14 @@ files:
183
230
  - spec/data/base.po
184
231
  - spec/data/local.po
185
232
  - spec/data/remote.po
233
+ - spec/fixtures/vcr/get_ticket_auth_failure.yml
234
+ - spec/fixtures/vcr/get_ticket_not_found.yml
235
+ - spec/fixtures/vcr/get_ticket_successfull.yml
186
236
  - spec/git_merge_po_spec.rb
237
+ - spec/lib/git-whistles/youtrack/api_spec.rb
238
+ - spec/lib/git-whistles/youtrack/branch_spec.rb
187
239
  - spec/spec_helper.rb
240
+ - spec/support/vcr_helper.rb
188
241
  homepage: http://github.com/mezis/git-whistles
189
242
  licenses:
190
243
  - MIT
@@ -205,7 +258,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
205
258
  version: 1.3.6
206
259
  requirements: []
207
260
  rubyforge_project:
208
- rubygems_version: 2.6.4
261
+ rubygems_version: 2.5.1
209
262
  signing_key:
210
263
  specification_version: 4
211
264
  summary: 'A few helpers for classic Git workflows: makes branching and merging, PO
@@ -214,5 +267,11 @@ test_files:
214
267
  - spec/data/base.po
215
268
  - spec/data/local.po
216
269
  - spec/data/remote.po
270
+ - spec/fixtures/vcr/get_ticket_auth_failure.yml
271
+ - spec/fixtures/vcr/get_ticket_not_found.yml
272
+ - spec/fixtures/vcr/get_ticket_successfull.yml
217
273
  - spec/git_merge_po_spec.rb
274
+ - spec/lib/git-whistles/youtrack/api_spec.rb
275
+ - spec/lib/git-whistles/youtrack/branch_spec.rb
218
276
  - spec/spec_helper.rb
277
+ - spec/support/vcr_helper.rb