git-semaphore 2.8.0 → 3.0.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
  SHA256:
3
- metadata.gz: dc5612a4161eb03ad1b94d51404679d0891abb804ab119939590fc4a8f70def0
4
- data.tar.gz: b35715d954910ea1de3b66bf64b7b7b0015dec42e07cdc285137e88ba9f905eb
3
+ metadata.gz: f5f76f2487f427528a0200987155e53304464e5402e15379c038e42bb1048a06
4
+ data.tar.gz: cfa81dc4e13c1b33ad0c997060fc5d07d38141dbdef3aa116f141944194111b7
5
5
  SHA512:
6
- metadata.gz: 9c15afac6f253ec5b0963d54c6b34af9612c2ef60587f3de6aad38a881d4a0a5c7b6b4d1197a36bfe3acd67652ad933fa8e2eba89b2c48cf2ed9e80001166555
7
- data.tar.gz: 1500b238a715722b392b31a63860ddd06f26f88dd2a56cc4e2d23960411596225820295b8ed34e2e93a6c061f95c15044e4d9cf8898f2449afaaffc5ffc8d6d3
6
+ metadata.gz: 7590f74d4d5ef32d38569aa13c9af475b2bc0e596955b04d558a7f69acae22c78185a374edd58cb4802942e64e053ba9237a24d23404c6b7539cf4967a797abd
7
+ data.tar.gz: 023405af11917e711600b888552b1cdcf9cb08bbb70ad3be684588d104893ac491580ea8189ff52974dead1fbf17ff8459a2a59d5d8837b60a9fd3afc1fa3108
data/Gemfile.lock CHANGED
@@ -1,7 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- git-semaphore (2.8.0)
4
+ git-semaphore (3.0.0)
5
+ faraday (~> 0.15)
6
+ nitlink (~> 1.1)
5
7
  rugged (~> 0.27)
6
8
  slop (~> 4.6)
7
9
 
@@ -10,9 +12,13 @@ GEM
10
12
  specs:
11
13
  ast (2.4.0)
12
14
  coderay (1.1.2)
15
+ faraday (0.15.4)
16
+ multipart-post (>= 1.2, < 3)
13
17
  jaro_winkler (1.5.2)
14
18
  method_source (0.9.2)
15
19
  minitest (5.11.3)
20
+ multipart-post (2.0.0)
21
+ nitlink (1.1.0)
16
22
  parallel (1.14.0)
17
23
  parser (2.6.0.0)
18
24
  ast (~> 2.4.0)
@@ -25,6 +25,8 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.post_install_message = Git::Semaphore::PIM
27
27
 
28
+ spec.add_dependency 'faraday', '~> 0.15'
29
+ spec.add_dependency 'nitlink', '~> 1.1'
28
30
  spec.add_dependency 'rugged', '~> 0.27'
29
31
  spec.add_dependency 'slop', '~> 4.6'
30
32
 
@@ -0,0 +1,20 @@
1
+ module Faraday
2
+ class Adapter
3
+ class SemaphoreNetHttp < NetHttp
4
+ def net_http_connection(env)
5
+ connections = (Thread.current[:net_http_connections] ||= {})
6
+ env_key = [env.url.host, env.url.port, env.ssl.verify]
7
+ connections[env_key] ||= begin
8
+ super(env).tap { |connection|
9
+ # uncomment to enable Net::HTTP debugging
10
+ # connection.set_debug_output($stderr)
11
+ connection.use_ssl = true
12
+ connection.start
13
+ }
14
+ end
15
+ end
16
+ end
17
+
18
+ register_middleware semaphore_net_http: SemaphoreNetHttp
19
+ end
20
+ end
@@ -0,0 +1,39 @@
1
+ # pagination: "{\"total_entries\":1535,\"total_pages\":77,\"per_page\":20,\"current_page\":1,\"first_page\":true,\"last_page\":false,\"previous_page\":null,\"next_page\":2}"
2
+
3
+ # {"total_entries"=>1535,
4
+ # "total_pages"=>77,
5
+ # "per_page"=>20,
6
+ # "current_page"=>1,
7
+ # "first_page"=>true,
8
+ # "last_page"=>false,
9
+ # "previous_page"=>nil,
10
+ # "next_page"=>2}
11
+
12
+ module Semlink
13
+ class Parser
14
+ def parse(response)
15
+ link_collection = Nitlink::LinkCollection.new
16
+
17
+ # FIXME: url.query could be nil/""
18
+
19
+ if (pagination = response['pagination'])
20
+ pagination = JSON.parse(pagination)
21
+
22
+ if (next_page = pagination['next_page'])
23
+ next_url = response.env['url'].dup
24
+ next_url.query = [next_url.query, "page=#{next_page}"].join('&')
25
+ link_collection << Nitlink::Link.new(next_url, 'next', nil, nil)
26
+ end
27
+
28
+ if (prev_page = pagination['previous_page'])
29
+ prev_url = response.env['url'].dup
30
+ prev_url.query = [prev_url.query, "page=#{prev_page}"].join('&')
31
+ link_collection << Nitlink::Link.new(prev_url, 'previous', nil, nil)
32
+ end
33
+
34
+ end
35
+
36
+ link_collection
37
+ end
38
+ end
39
+ end
data/lib/git/semaphore.rb CHANGED
@@ -6,8 +6,13 @@ require 'openssl'
6
6
  require 'net/http'
7
7
  require 'fileutils'
8
8
 
9
+ require 'faraday'
10
+ require 'nitlink'
9
11
  require 'rugged'
10
12
 
13
+ require 'ext/faraday'
14
+ require 'ext/nitlink'
15
+
11
16
  module Rugged
12
17
  class Repository
13
18
  def owner() File.basename(File.dirname(workdir)); end
@@ -81,6 +86,8 @@ end
81
86
 
82
87
  require 'git/semaphore/version'
83
88
 
89
+ require 'semaphore_ci/api'
90
+
84
91
  require 'git/semaphore/api'
85
92
  require 'git/semaphore/api_cache'
86
93
  require 'git/semaphore/api_enrich'
@@ -2,158 +2,99 @@ module Git
2
2
  module Semaphore
3
3
  class API
4
4
 
5
- def self.projects(auth_token)
6
- get_json projects_uri(auth_token)
5
+ def self.projects
6
+ get_json projects_uri
7
7
  end
8
8
 
9
- def self.branches(project_hash_id, auth_token)
10
- get_json branches_uri(project_hash_id, auth_token)
9
+ def self.branches(project_hash_id)
10
+ get_json branches_uri(project_hash_id)
11
11
  end
12
12
 
13
- def self.status(project_hash_id, branch_id, auth_token)
14
- get_json status_uri(project_hash_id, branch_id, auth_token)
13
+ def self.status(project_hash_id, branch_id)
14
+ get_json status_uri(project_hash_id, branch_id)
15
15
  end
16
16
 
17
- def self.history(project_hash_id, branch_id, auth_token)
18
- get_paginated_response(history_uri(project_hash_id, branch_id, auth_token)) do |previous_page, next_page|
19
- previous_page['builds'] += next_page['builds']
20
- end
17
+ def self.history(project_hash_id, branch_id)
18
+ get_json history_uri(project_hash_id, branch_id)
21
19
  end
22
20
 
23
- def self.information(project_hash_id, branch_id, build_number, auth_token)
24
- get_json information_uri(project_hash_id, branch_id, build_number, auth_token)
21
+ def self.information(project_hash_id, branch_id, build_number)
22
+ get_json information_uri(project_hash_id, branch_id, build_number)
25
23
  end
26
24
 
27
- def self.log(project_hash_id, branch_id, build_number, auth_token)
28
- get_json log_uri(project_hash_id, branch_id, build_number, auth_token)
25
+ def self.log(project_hash_id, branch_id, build_number)
26
+ get_json log_uri(project_hash_id, branch_id, build_number)
29
27
  end
30
28
 
31
- def self.rebuild(project_hash_id, branch_id, auth_token)
32
- get_json last_revision_uri(project_hash_id, branch_id, auth_token), :post
29
+ def self.rebuild(project_hash_id, branch_id)
30
+ get_json last_revision_uri(project_hash_id, branch_id), :post
33
31
  end
34
32
 
33
+ #
35
34
  # private helper functions
35
+ #
36
36
 
37
- def self.projects_uri(auth_token)
37
+ def self.get_json(uri)
38
+ @client ||= SemaphoreCI::API::V1.new(Git::Semaphore.auth_token)
39
+ @client.get(uri)
40
+ end
41
+
42
+ def self.projects_uri
38
43
  # https://semaphoreci.com/docs/projects-api.html
39
44
  # GET /api/v1/projects
40
- request_uri(auth_token, path: File.join('projects'))
45
+ File.join('/projects')
41
46
  end
42
47
 
43
48
  private_class_method :projects_uri
44
49
 
45
- def self.branches_uri(project_hash_id, auth_token)
50
+ def self.branches_uri(project_hash_id)
46
51
  # https://semaphoreci.com/docs/branches-and-builds-api.html#project_branches
47
52
  # GET /api/v1/projects/:hash_id/branches
48
- request_uri(auth_token, path: File.join('projects', project_hash_id, 'branches'))
53
+ File.join('/projects', project_hash_id, 'branches')
49
54
  end
50
55
 
51
56
  private_class_method :branches_uri
52
57
 
53
- def self.status_uri(project_hash_id, branch_id, auth_token)
58
+ def self.status_uri(project_hash_id, branch_id)
54
59
  # https://semaphoreci.com/docs/branches-and-builds-api.html#branch_status
55
60
  # GET /api/v1/projects/:hash_id/:id/status
56
- request_uri(auth_token, path: File.join('projects', project_hash_id, branch_id, 'status'))
61
+ File.join('/projects', project_hash_id, branch_id, 'status')
57
62
  end
58
63
 
59
64
  private_class_method :status_uri
60
65
 
61
- def self.history_uri(project_hash_id, branch_id, auth_token, page = 1)
66
+ def self.history_uri(project_hash_id, branch_id)
62
67
  # https://semaphoreci.com/docs/branches-and-builds-api.html#branch_history
63
68
  # GET /api/v1/projects/:hash_id/:id
64
- request_uri(auth_token, path: File.join('projects', project_hash_id, branch_id), page: page)
69
+ File.join('/projects', project_hash_id, branch_id)
65
70
  end
66
71
 
67
72
  private_class_method :history_uri
68
73
 
69
- def self.information_uri(project_hash_id, branch_id, build_number, auth_token)
74
+ def self.information_uri(project_hash_id, branch_id, build_number)
70
75
  # https://semaphoreci.com/docs/branches-and-builds-api.html#build_information
71
76
  # GET /api/v1/projects/:hash_id/:id/builds/:number
72
- request_uri(auth_token, path: File.join('projects', project_hash_id, branch_id, 'builds', build_number))
77
+ File.join('/projects', project_hash_id, branch_id, 'builds', build_number)
73
78
  end
74
79
 
75
80
  private_class_method :information_uri
76
81
 
77
- def self.log_uri(project_hash_id, branch_id, build_number, auth_token)
82
+ def self.log_uri(project_hash_id, branch_id, build_number)
78
83
  # https://semaphoreci.com/docs/branches-and-builds-api.html#build_log
79
84
  # GET /api/v1/projects/:hash_id/:id/builds/:number/log
80
- request_uri(auth_token, path: File.join('projects', project_hash_id, branch_id, 'builds', build_number, 'log'))
85
+ File.join('/projects', project_hash_id, branch_id, 'builds', build_number, 'log')
81
86
  end
82
87
 
83
88
  private_class_method :log_uri
84
89
 
85
- def self.last_revision_uri(project_hash_id, branch_id, auth_token)
90
+ def self.last_revision_uri(project_hash_id, branch_id)
86
91
  # https://semaphoreci.com/docs/branches-and-builds-api.html#rebuild
87
92
  # POST /api/v1/projects/:project_hash_id/:branch_id/build
88
- request_uri(auth_token, path: File.join('projects', project_hash_id, branch_id, 'build'))
93
+ File.join('/projects', project_hash_id, branch_id, 'build')
89
94
  end
90
95
 
91
96
  private_class_method :last_revision_uri
92
97
 
93
- # more private helper functions
94
-
95
- def self.get_response(uri, action = :get)
96
- response = ::Net::HTTP.start(uri.host, uri.port, use_ssl: (uri.scheme == 'https'), verify_mode: ::OpenSSL::SSL::VERIFY_NONE) do |net_http|
97
- case action
98
- when :get
99
- net_http.get uri.request_uri
100
- when :post
101
- net_http.post uri.request_uri, uri.query
102
- else
103
- raise 'Unsupported action'
104
- end
105
- end
106
-
107
- def response.json_body
108
- # "application/json; charset=utf-8"
109
- raise 'JSON body expected' \
110
- unless self['content-type'] =~ %r{\Aapplication/json}
111
- JSON.parse(body)
112
- end
113
-
114
- response
115
- end
116
-
117
- private_class_method :get_response
118
-
119
- def self.get_paginated_response(uri, action = :get)
120
- response = get_response(uri, action)
121
- body = response.json_body
122
- loop do
123
- pagination_header = response['Pagination']
124
- break unless pagination_header
125
- pagination = JSON.parse(pagination_header)
126
- break if pagination['last_page']
127
- uri.query = uri.query.sub(/page=(\d+)/, "page=#{pagination['next_page']}")
128
- response = get_response(uri, action)
129
- yield(body, response.json_body)
130
- end
131
- body
132
- end
133
-
134
- private_class_method :get_paginated_response
135
-
136
- def self.get_json(uri, action = :get)
137
- get_response(uri, action).json_body
138
- end
139
-
140
- private_class_method :get_json
141
-
142
- # https://semaphoreci.com/docs/
143
- SEMAPHORE_API_HOST = 'semaphoreci.com'.freeze
144
- SEMAPHORE_API_URI = '/api/v1/'.freeze
145
-
146
- def self.request_uri(auth_token, options = {})
147
- page = options.delete(:page) # API pagination
148
- options[:host] ||= SEMAPHORE_API_HOST
149
- options[:path].prepend SEMAPHORE_API_URI
150
- options[:query] = "auth_token=#{auth_token}"
151
- options[:query] << "&page=#{page}" if page
152
- URI::HTTPS.build(options)
153
- end
154
-
155
- private_class_method :request_uri
156
-
157
98
  end
158
99
  end
159
100
  end
@@ -3,39 +3,39 @@ module Git
3
3
  class API
4
4
  class Cache
5
5
 
6
- def self.projects(refresh, auth_token)
6
+ def self.projects(refresh)
7
7
  @projects ||= Git::Semaphore.from_json_cache(projects_cache, refresh) do
8
- API::Enrich.projects auth_token
8
+ API::Enrich.projects
9
9
  end
10
10
  end
11
11
 
12
- def self.branches(project_hash_id, refresh, auth_token)
12
+ def self.branches(project_hash_id, refresh)
13
13
  @branches ||= Git::Semaphore.from_json_cache(branches_cache(project_hash_id), refresh) do
14
- API.branches project_hash_id, auth_token
14
+ API.branches project_hash_id
15
15
  end
16
16
  end
17
17
 
18
- def self.status(project_hash_id, branch_id, refresh, auth_token)
18
+ def self.status(project_hash_id, branch_id, refresh)
19
19
  @status ||= Git::Semaphore.from_json_cache(status_cache(project_hash_id, branch_id), refresh) do
20
- API::Enrich.status project_hash_id, branch_id, auth_token
20
+ API::Enrich.status project_hash_id, branch_id
21
21
  end
22
22
  end
23
23
 
24
- def self.history(project_hash_id, branch_id, refresh, auth_token)
24
+ def self.history(project_hash_id, branch_id, refresh)
25
25
  @history ||= Git::Semaphore.from_json_cache(history_cache(project_hash_id, branch_id), refresh) do
26
- API::Enrich.history project_hash_id, branch_id, auth_token
26
+ API::Enrich.history project_hash_id, branch_id
27
27
  end
28
28
  end
29
29
 
30
- def self.information(project_hash_id, branch_id, build_number, refresh, auth_token)
30
+ def self.information(project_hash_id, branch_id, build_number, refresh)
31
31
  @information ||= Git::Semaphore.from_json_cache(information_cache(project_hash_id, branch_id, build_number), refresh) do
32
- API.information project_hash_id, branch_id, build_number, auth_token
32
+ API.information project_hash_id, branch_id, build_number
33
33
  end
34
34
  end
35
35
 
36
- def self.log(project_hash_id, branch_id, build_number, refresh, auth_token)
36
+ def self.log(project_hash_id, branch_id, build_number, refresh)
37
37
  @log ||= Git::Semaphore.from_json_cache(log_cache(project_hash_id, branch_id, build_number), refresh) do
38
- API.log project_hash_id, branch_id, build_number, auth_token
38
+ API.log project_hash_id, branch_id, build_number
39
39
  end
40
40
  end
41
41
 
@@ -3,8 +3,8 @@ module Git
3
3
  class API
4
4
  class Enrich
5
5
 
6
- def self.projects(auth_token)
7
- API.projects(auth_token).tap do |results|
6
+ def self.projects
7
+ API.projects.tap do |results|
8
8
  results.each do |project|
9
9
  # full repository name on github.com: 'pvdb/git-semaphore'
10
10
  project['full_name'] = [project['owner'], project['name']].join('/')
@@ -14,16 +14,16 @@ module Git
14
14
  end
15
15
  end
16
16
 
17
- def self.history(project_hash_id, branch_id, auth_token)
18
- API.history(project_hash_id, branch_id, auth_token).tap do |history|
17
+ def self.history(project_hash_id, branch_id)
18
+ API.history(project_hash_id, branch_id).tap do |history|
19
19
  history['builds'].each do |build|
20
20
  enrich(build)
21
21
  end
22
22
  end
23
23
  end
24
24
 
25
- def self.status(project_hash_id, branch_id, auth_token)
26
- API.status(project_hash_id, branch_id, auth_token).tap do |status|
25
+ def self.status(project_hash_id, branch_id)
26
+ API.status(project_hash_id, branch_id).tap do |status|
27
27
  enrich(status)
28
28
  end
29
29
  end
@@ -110,7 +110,7 @@ module Git
110
110
  #
111
111
 
112
112
  def self.all(refresh = false)
113
- Git::Semaphore::API::Cache.projects(refresh, Git::Semaphore.auth_token)
113
+ Git::Semaphore::API::Cache.projects(refresh)
114
114
  end
115
115
 
116
116
  class << self
@@ -118,27 +118,27 @@ module Git
118
118
  end
119
119
 
120
120
  def branches(refresh = false)
121
- Git::Semaphore::API::Cache.branches(project_hash_id, refresh, @auth_token)
121
+ Git::Semaphore::API::Cache.branches(project_hash_id, refresh)
122
122
  end
123
123
 
124
124
  def status(refresh = false)
125
- Git::Semaphore::API::Cache.status(project_hash_id, branch_id, refresh, @auth_token)
125
+ Git::Semaphore::API::Cache.status(project_hash_id, branch_id, refresh)
126
126
  end
127
127
 
128
128
  def history(refresh = false)
129
- Git::Semaphore::API::Cache.history(project_hash_id, branch_id, refresh, @auth_token)
129
+ Git::Semaphore::API::Cache.history(project_hash_id, branch_id, refresh)
130
130
  end
131
131
 
132
132
  def information(refresh = false)
133
- Git::Semaphore::API::Cache.information(project_hash_id, branch_id, build_number, refresh, @auth_token)
133
+ Git::Semaphore::API::Cache.information(project_hash_id, branch_id, build_number, refresh)
134
134
  end
135
135
 
136
136
  def log(refresh = false)
137
- Git::Semaphore::API::Cache.log(project_hash_id, branch_id, build_number, refresh, @auth_token)
137
+ Git::Semaphore::API::Cache.log(project_hash_id, branch_id, build_number, refresh)
138
138
  end
139
139
 
140
140
  def rebuild
141
- Git::Semaphore::API.rebuild(project_hash_id, branch_id, @auth_token)
141
+ Git::Semaphore::API.rebuild(project_hash_id, branch_id)
142
142
  end
143
143
 
144
144
  def browse
@@ -1,7 +1,7 @@
1
1
  module Git
2
2
  module Semaphore
3
3
  NAME = 'git-semaphore'.freeze
4
- VERSION = '2.8.0'.freeze
4
+ VERSION = '3.0.0'.freeze
5
5
 
6
6
  def self.version
7
7
  "#{NAME} v#{VERSION}"
@@ -0,0 +1,72 @@
1
+ module SemaphoreCI
2
+ module API
3
+ class Client
4
+ def initialize(token, url, prefix, link_parser_class)
5
+ @token = token
6
+ @url = url
7
+ @prefix = prefix
8
+ @link_parser = link_parser_class.new
9
+
10
+ @conn = Faraday.new(url: @url) do |conn|
11
+ # uncomment to enable Faraday debugging
12
+ # conn.response :logger
13
+ # conn.token_auth token # FIXME: make we work for V2 API
14
+ conn.adapter :semaphore_net_http
15
+ end
16
+ end
17
+
18
+ def get(path)
19
+ response = @conn.get(path.prepend(@prefix), auth_token: @token)
20
+ result = json_from(response)
21
+
22
+ while (next_link = @link_parser.parse(response).by_rel('next'))
23
+ response = @conn.get(next_link.target.to_s)
24
+ next_result = json_from(response)
25
+
26
+ case [result.class, next_result.class]
27
+ when [Array, Array]
28
+ # V2 pagination
29
+ result.concat(next_result)
30
+ when [Hash, Hash]
31
+ # V1 pagination
32
+ next_result.each do |key, value|
33
+ if value.is_a? Array
34
+ result[key].concat(value)
35
+ elsif value.is_a? Hash
36
+ result[key].merge(value)
37
+ else
38
+ result[key] = value
39
+ end
40
+ end
41
+ else raise 'Unsupported API response'
42
+ end
43
+ end
44
+
45
+ result
46
+ end
47
+
48
+ private
49
+
50
+ def json_from(response)
51
+ if (content_type = response['content-type'])
52
+ # should be something like "application/json; charset=utf-8"
53
+ content_type['application/json'] || raise('JSON body expected')
54
+ end
55
+
56
+ JSON.parse(response.body)
57
+ end
58
+ end
59
+
60
+ class V1 < Client
61
+ def initialize(token)
62
+ super(token, 'https://semaphoreci.com/', '/api/v1', Semlink::Parser)
63
+ end
64
+ end
65
+
66
+ class V2 < Client
67
+ def initialize(token)
68
+ super(token, 'https://api.semaphoreci.com/', '/v2', Nitlink::Parser)
69
+ end
70
+ end
71
+ end
72
+ end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-semaphore
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Vandenberk
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-03-14 00:00:00.000000000 Z
11
+ date: 2019-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.15'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nitlink
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.1'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: rugged
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -130,6 +158,8 @@ files:
130
158
  - bin/setup
131
159
  - exe/git-semaphore
132
160
  - git-semaphore.gemspec
161
+ - lib/ext/faraday.rb
162
+ - lib/ext/nitlink.rb
133
163
  - lib/git/semaphore.rb
134
164
  - lib/git/semaphore/api.rb
135
165
  - lib/git/semaphore/api_cache.rb
@@ -137,6 +167,7 @@ files:
137
167
  - lib/git/semaphore/gemspec.rb
138
168
  - lib/git/semaphore/project.rb
139
169
  - lib/git/semaphore/version.rb
170
+ - lib/semaphore_ci/api.rb
140
171
  homepage: https://github.com/pvdb/git-semaphore
141
172
  licenses:
142
173
  - MIT