git-whistles 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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