concourse.rb 0.1.0.pre.9 → 0.5.0.pre.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c17350ce827332dcb7f0076201b9be48309f090920aa656ffad7d461afb21ba
4
- data.tar.gz: 99e24787cb1991955470efa01b4662b858db172764a2373054e465c909c377dc
3
+ metadata.gz: ca2610029d784fee0b28516c246eb64b9f49f939d24e1854dfcca52af05a5c74
4
+ data.tar.gz: cc90d5d0f12729d4170c5df3b7a0037d3faf0e376aa92754085b1729fbe76ef6
5
5
  SHA512:
6
- metadata.gz: c210f3e79d3cdf71c6131dd2559310736b06521b855f5723bf29ca5d098af545138b76e69696d4a7593be9681e9b1eb5e5a265787f938fb6ca93c3181b4481f2
7
- data.tar.gz: 601a367520b17e19effbe710a90754f6fa1a9d5d2429eb69dbef8083e92efe15d63d6b48bac6d597a055749612fa69ec15e24feba573a1a7df3d495591699577
6
+ metadata.gz: a49670a70d1841e4fef6fe713192e005edc80e069d0d0abafb983b56c19ab3c7d0ed740b074844aa7e2e8c70c6bd21d8432e2b8125cf15692f78c0b1a296799f
7
+ data.tar.gz: e686d1181b9252e0f50d244fb1a40ada9aa3a4e8b29cdb22838b69d1e16c4491ce8a5ca358603817940498daf28f60e3a61fa0e9c4ddfde7e7e3973d28dc94a4
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify dependencies in concourse.rb.gemspec
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- concourse.rb (0.1.0.pre.9)
4
+ concourse.rb (0.5.0.pre.1)
5
5
  dry-schema (~> 0.5)
6
6
  excon (~> 0.72)
7
7
  semantic (~> 1.5)
@@ -17,6 +17,7 @@ GEM
17
17
  zeitwerk (~> 2.3)
18
18
  addressable (2.7.0)
19
19
  public_suffix (>= 2.0.2, < 5.0)
20
+ ast (2.4.2)
20
21
  colored2 (3.1.2)
21
22
  concurrent-ruby (1.1.7)
22
23
  diff-lcs (1.4.4)
@@ -73,7 +74,11 @@ GEM
73
74
  sawyer (~> 0.8.0, >= 0.5.3)
74
75
  open4 (1.3.4)
75
76
  openssl (2.2.0)
77
+ parallel (1.20.1)
78
+ parser (3.0.0.0)
79
+ ast (~> 2.4.1)
76
80
  public_suffix (4.0.6)
81
+ rainbow (3.0.0)
77
82
  rake (13.0.3)
78
83
  rake_circle_ci (0.9.0)
79
84
  colored2 (~> 3.1)
@@ -95,6 +100,8 @@ GEM
95
100
  colored2 (~> 3.1)
96
101
  rake_factory (~> 0.23)
97
102
  sshkey (~> 2.0)
103
+ regexp_parser (2.1.1)
104
+ rexml (3.2.4)
98
105
  rspec (3.10.0)
99
106
  rspec-core (~> 3.10.0)
100
107
  rspec-expectations (~> 3.10.0)
@@ -108,6 +115,23 @@ GEM
108
115
  diff-lcs (>= 1.2.0, < 2.0)
109
116
  rspec-support (~> 3.10.0)
110
117
  rspec-support (3.10.1)
118
+ rubocop (1.12.0)
119
+ parallel (~> 1.10)
120
+ parser (>= 3.0.0.0)
121
+ rainbow (>= 2.2.2, < 4.0)
122
+ regexp_parser (>= 1.8, < 3.0)
123
+ rexml
124
+ rubocop-ast (>= 1.2.0, < 2.0)
125
+ ruby-progressbar (~> 1.7)
126
+ unicode-display_width (>= 1.4.0, < 3.0)
127
+ rubocop-ast (1.4.1)
128
+ parser (>= 2.7.1.5)
129
+ rubocop-rake (0.5.1)
130
+ rubocop
131
+ rubocop-rspec (2.2.0)
132
+ rubocop (~> 1.0)
133
+ rubocop-ast (>= 1.1.0)
134
+ ruby-progressbar (1.11.0)
111
135
  ruby2_keywords (0.0.2)
112
136
  ruby_gpg2 (0.8.0)
113
137
  lino (>= 1.5)
@@ -118,6 +142,7 @@ GEM
118
142
  sshkey (2.0.0)
119
143
  tzinfo (2.0.4)
120
144
  concurrent-ruby (~> 1.0)
145
+ unicode-display_width (2.0.0)
121
146
  zeitwerk (2.4.2)
122
147
 
123
148
  PLATFORMS
@@ -138,6 +163,9 @@ DEPENDENCIES
138
163
  rake_gpg (~> 0.12)
139
164
  rake_ssh (~> 0.4)
140
165
  rspec (~> 3.9)
166
+ rubocop (~> 1.12)
167
+ rubocop-rake (~> 0.5)
168
+ rubocop-rspec (~> 2.2)
141
169
 
142
170
  BUNDLED WITH
143
- 2.2.4
171
+ 2.2.15
data/README.md CHANGED
@@ -24,15 +24,35 @@ Add usage here.
24
24
 
25
25
  ## Development
26
26
 
27
- After checking out the repo, run `bin/setup` to install dependencies. Then, run
28
- `rake spec` to run the tests. You can also run `bin/console` for an interactive
29
- prompt that will allow you to experiment.
30
-
31
- To install this gem onto your local machine, run `bundle exec rake install`. To
32
- release a new version, update the version number in `version.rb`, and then run
33
- `bundle exec rake release`, which will create a git tag for the version, push
34
- git commits and tags, and push the `.gem` file to
35
- [rubygems.org](https://rubygems.org).
27
+ To install dependencies and run the build, run the pre-commit build:
28
+
29
+ ```shell script
30
+ ./go
31
+ ```
32
+
33
+ This runs all unit tests and other checks including coverage and code linting /
34
+ formatting.
35
+
36
+ To run only the unit tests, including coverage:
37
+
38
+ ```shell script
39
+ ./go test:unit
40
+ ```
41
+
42
+ To attempt to fix any code linting / formatting issues:
43
+
44
+ ```shell script
45
+ ./go library:fix
46
+ ```
47
+
48
+ To check for code linting / formatting issues without fixing:
49
+
50
+ ```shell script
51
+ ./go library:check
52
+ ```
53
+
54
+ You can also run `bin/console` for an interactive prompt that will allow you to
55
+ experiment.
36
56
 
37
57
  ### Common Tasks
38
58
 
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'yaml'
2
4
  require 'rake_circle_ci'
3
5
  require 'rake_github'
@@ -5,13 +7,16 @@ require 'rake_ssh'
5
7
  require 'rake_gpg'
6
8
  require 'securerandom'
7
9
  require 'rspec/core/rake_task'
10
+ require 'rubocop/rake_task'
8
11
 
9
- task :default => :spec
10
-
11
- RSpec::Core::RakeTask.new(:spec)
12
+ task default: %i[
13
+ library:fix
14
+ test:unit
15
+ ]
12
16
 
13
17
  namespace :encryption do
14
18
  namespace :passphrase do
19
+ desc 'Generate encryption passphrase for CI GPG key'
15
20
  task :generate do
16
21
  File.open('config/secrets/ci/encryption.passphrase', 'w') do |f|
17
22
  f.write(SecureRandom.base64(36))
@@ -23,86 +28,103 @@ end
23
28
  namespace :keys do
24
29
  namespace :deploy do
25
30
  RakeSSH.define_key_tasks(
26
- path: 'config/secrets/ci/',
27
- comment: 'maintainers@infrablocks.io')
31
+ path: 'config/secrets/ci/',
32
+ comment: 'maintainers@infrablocks.io'
33
+ )
28
34
  end
29
35
 
30
36
  namespace :gpg do
31
37
  RakeGPG.define_generate_key_task(
32
- output_directory: 'config/secrets/ci',
33
- name_prefix: 'gpg',
34
- owner_name: 'InfraBlocks Maintainers',
35
- owner_email: 'maintainers@infrablocks.io',
36
- owner_comment: 'concourse.rb CI Key')
38
+ output_directory: 'config/secrets/ci',
39
+ name_prefix: 'gpg',
40
+ owner_name: 'InfraBlocks Maintainers',
41
+ owner_email: 'maintainers@infrablocks.io',
42
+ owner_comment: 'concourse.rb CI Key'
43
+ )
37
44
  end
38
45
  end
39
46
 
47
+ RuboCop::RakeTask.new
48
+
49
+ namespace :library do
50
+ desc 'Run all checks of the library'
51
+ task check: [:rubocop]
52
+
53
+ desc 'Attempt to automatically fix issues with the library'
54
+ task fix: [:'rubocop:auto_correct']
55
+ end
56
+
57
+ namespace :test do
58
+ RSpec::Core::RakeTask.new(:unit)
59
+ end
60
+
40
61
  RakeCircleCI.define_project_tasks(
41
- namespace: :circle_ci,
42
- project_slug: 'github/infrablocks/concourse.rb'
62
+ namespace: :circle_ci,
63
+ project_slug: 'github/infrablocks/concourse.rb'
43
64
  ) do |t|
44
65
  circle_ci_config =
45
- YAML.load_file('config/secrets/circle_ci/config.yaml')
66
+ YAML.load_file('config/secrets/circle_ci/config.yaml')
46
67
 
47
- t.api_token = circle_ci_config["circle_ci_api_token"]
68
+ t.api_token = circle_ci_config['circle_ci_api_token']
48
69
  t.environment_variables = {
49
- ENCRYPTION_PASSPHRASE:
50
- File.read('config/secrets/ci/encryption.passphrase')
51
- .chomp
70
+ ENCRYPTION_PASSPHRASE:
71
+ File.read('config/secrets/ci/encryption.passphrase')
72
+ .chomp
52
73
  }
53
74
  t.checkout_keys = []
54
75
  t.ssh_keys = [
55
- {
56
- hostname: "github.com",
57
- private_key: File.read('config/secrets/ci/ssh.private')
58
- }
76
+ {
77
+ hostname: 'github.com',
78
+ private_key: File.read('config/secrets/ci/ssh.private')
79
+ }
59
80
  ]
60
81
  end
61
82
 
62
83
  RakeGithub.define_repository_tasks(
63
- namespace: :github,
64
- repository: 'infrablocks/concourse.rb',
84
+ namespace: :github,
85
+ repository: 'infrablocks/concourse.rb'
65
86
  ) do |t|
66
87
  github_config =
67
- YAML.load_file('config/secrets/github/config.yaml')
88
+ YAML.load_file('config/secrets/github/config.yaml')
68
89
 
69
- t.access_token = github_config["github_personal_access_token"]
90
+ t.access_token = github_config['github_personal_access_token']
70
91
  t.deploy_keys = [
71
- {
72
- title: 'CircleCI',
73
- public_key: File.read('config/secrets/ci/ssh.public')
74
- }
92
+ {
93
+ title: 'CircleCI',
94
+ public_key: File.read('config/secrets/ci/ssh.public')
95
+ }
75
96
  ]
76
97
  end
77
98
 
78
99
  namespace :pipeline do
79
- task :prepare => [
80
- :'circle_ci:project:follow',
81
- :'circle_ci:env_vars:ensure',
82
- :'circle_ci:checkout_keys:ensure',
83
- :'circle_ci:ssh_keys:ensure',
84
- :'github:deploy_keys:ensure'
100
+ desc 'Prepare CircleCI Pipeline'
101
+ task prepare: %i[
102
+ circle_ci:project:follow
103
+ circle_ci:env_vars:ensure
104
+ circle_ci:checkout_keys:ensure
105
+ circle_ci:ssh_keys:ensure
106
+ github:deploy_keys:ensure
85
107
  ]
86
108
  end
87
109
 
88
110
  namespace :version do
89
- desc "Bump version for specified type (pre, major, minor, patch)"
111
+ desc 'Bump version for specified type (pre, major, minor, patch)'
90
112
  task :bump, [:type] do |_, args|
91
113
  bump_version_for(args.type)
92
114
  end
93
115
  end
94
116
 
95
- desc "Release gem"
117
+ desc 'Release gem'
96
118
  task :release do
97
- sh "gem release --tag --push"
119
+ sh 'gem release --tag --push'
98
120
  end
99
121
 
100
122
  def bump_version_for(version_type)
101
- sh "gem bump " +
102
- "--skip-ci " +
103
- "--version #{version_type} " +
104
- "--file lib/concourse/version.rb " +
105
- "&& bundle install " +
106
- "&& export LAST_MESSAGE=\"$(git log -1 --pretty=%B)\" " +
107
- "&& git commit -a --amend -m \"${LAST_MESSAGE}\""
123
+ sh 'gem bump ' \
124
+ '--skip-ci ' \
125
+ "--version #{version_type} " \
126
+ '--file lib/concourse/version.rb ' \
127
+ '&& bundle install ' \
128
+ '&& export LAST_MESSAGE="$(git log -1 --pretty=%B)" ' \
129
+ '&& git commit -a --amend -m "${LAST_MESSAGE}"'
108
130
  end
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'concourse'
data/concourse.rb.gemspec CHANGED
@@ -1,23 +1,34 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'concourse/version'
5
6
  require 'date'
6
7
 
8
+ files = %w[
9
+ bin
10
+ lib
11
+ CODE_OF_CONDUCT.md
12
+ concourse.rb.gemspec
13
+ Gemfile
14
+ LICENSE.txt
15
+ Rakefile
16
+ README.md
17
+ ]
18
+
7
19
  Gem::Specification.new do |spec|
8
20
  spec.name = 'concourse.rb'
9
21
  spec.version = Concourse::VERSION
10
22
  spec.authors = ['Toby Clemson']
11
23
  spec.email = ['tobyclemson@gmail.com']
12
24
 
13
- spec.date = Date.today.to_s
14
25
  spec.summary = 'A Ruby SDK for the Concourse CI API.'
15
26
  spec.description = 'A Ruby SDK for the Concourse CI API.'
16
27
  spec.homepage = 'https://github.com/infrablocks/concourse.rb'
17
28
  spec.license = 'MIT'
18
29
 
19
30
  spec.files = `git ls-files -z`.split("\x0").select do |f|
20
- f.match(%r{^(bin|lib|CODE_OF_CONDUCT\.md|concourse\.rb\.gemspec|Gemfile|LICENSE\.txt|Rakefile|README\.md)})
31
+ f.match(/^(#{files.map { |g| Regexp.escape(g) }.join('|')})/)
21
32
  end
22
33
  spec.bindir = 'exe'
23
34
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
@@ -25,19 +36,22 @@ Gem::Specification.new do |spec|
25
36
 
26
37
  spec.required_ruby_version = '>= 2.6.0'
27
38
 
28
- spec.add_dependency 'excon', '~> 0.72'
29
39
  spec.add_dependency 'dry-schema', '~> 0.5'
40
+ spec.add_dependency 'excon', '~> 0.72'
30
41
  spec.add_dependency 'semantic', '~> 1.5'
31
42
 
32
43
  spec.add_development_dependency 'bundler', '~> 2.0'
44
+ spec.add_development_dependency 'faker', '~> 2.15'
45
+ spec.add_development_dependency 'gem-release', '~> 2.0'
46
+ spec.add_development_dependency 'jwt', '~> 2.2'
47
+ spec.add_development_dependency 'openssl', '~> 2.2'
33
48
  spec.add_development_dependency 'rake', '~> 13.0'
34
49
  spec.add_development_dependency 'rake_circle_ci', '~> 0.9'
35
50
  spec.add_development_dependency 'rake_github', '~> 0.5'
36
- spec.add_development_dependency 'rake_ssh', '~> 0.4'
37
51
  spec.add_development_dependency 'rake_gpg', '~> 0.12'
52
+ spec.add_development_dependency 'rake_ssh', '~> 0.4'
38
53
  spec.add_development_dependency 'rspec', '~> 3.9'
39
- spec.add_development_dependency 'jwt', '~> 2.2'
40
- spec.add_development_dependency 'openssl', '~> 2.2'
41
- spec.add_development_dependency 'faker', '~> 2.15'
42
- spec.add_development_dependency 'gem-release', '~> 2.0'
54
+ spec.add_development_dependency 'rubocop', '~> 1.12'
55
+ spec.add_development_dependency 'rubocop-rake', '~> 0.5'
56
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.2'
43
57
  end
data/lib/concourse.rb CHANGED
@@ -1,4 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'concourse/version'
4
+ require_relative 'concourse/models'
5
+ require_relative 'concourse/errors'
6
+ require_relative 'concourse/http'
2
7
  require_relative 'concourse/client'
3
8
  require_relative 'concourse/urls'
4
9
  require_relative 'concourse/headers'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'excon'
2
4
  require 'json'
3
5
 
@@ -11,15 +13,19 @@ module Concourse
11
13
 
12
14
  def for_skymarshal
13
15
  Concourse::SubClients::SkymarshalClient.new(
14
- @options.merge(version: get_info[:version]))
16
+ @options.merge(version: get_info[:version])
17
+ )
15
18
  end
16
19
 
20
+ # rubocop:disable Naming/AccessorMethodName
17
21
  def get_info
18
22
  JSON.parse(
19
- Excon.get(Concourse::Urls.info_url(@options[:url]))
20
- .body,
21
- symbolize_names: true)
23
+ Excon.get(Concourse::Urls.info_url(@options[:url]))
24
+ .body,
25
+ symbolize_names: true
26
+ )
22
27
  end
28
+ # rubocop:enable Naming/AccessorMethodName
23
29
 
24
30
  def ==(other)
25
31
  other.class == self.class && other.state == state
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Concourse
4
+ module Errors
5
+ class ApiError < StandardError
6
+ def initialize(parameters)
7
+ @request = parameters[:request]
8
+ @response = parameters[:response]
9
+
10
+ super("Request to #{@request.url} failed " \
11
+ "with status #{@response.status} " \
12
+ "and body #{@response.body}")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'base64'
2
4
 
3
5
  module Concourse
@@ -17,25 +19,25 @@ module Concourse
17
19
 
18
20
  module HeaderNames
19
21
  def self.content_type
20
- "Content-Type"
22
+ 'Content-Type'
21
23
  end
22
-
24
+
23
25
  def self.authorization
24
- "Authorization"
26
+ 'Authorization'
25
27
  end
26
28
 
27
29
  def self.date
28
- "Date"
30
+ 'Date'
29
31
  end
30
32
  end
31
33
 
32
34
  module Headers
33
35
  def self.content_type(content_type)
34
- {Concourse::HeaderNames.content_type => content_type}
36
+ { Concourse::HeaderNames.content_type => content_type }
35
37
  end
36
38
 
37
39
  def self.authorization(authorization)
38
- {Concourse::HeaderNames.authorization => authorization}
40
+ { Concourse::HeaderNames.authorization => authorization }
39
41
  end
40
42
  end
41
- end
43
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Concourse
4
+ module Http
5
+ class Request
6
+ attr_reader :url, :headers, :body
7
+
8
+ def initialize(url, headers = {}, body = nil)
9
+ @url = url
10
+ @headers = headers
11
+ @body = body
12
+ end
13
+
14
+ def ==(other)
15
+ other.class == self.class && other.state == state
16
+ end
17
+
18
+ def eql?(other)
19
+ self == other
20
+ end
21
+
22
+ def hash
23
+ state.hash
24
+ end
25
+
26
+ protected
27
+
28
+ def state
29
+ [@url, @headers, @body]
30
+ end
31
+ end
32
+
33
+ def assert_successful(request, response)
34
+ raise api_error(request, response) unless response.status < 400
35
+ end
36
+
37
+ private
38
+
39
+ def api_error(request, response)
40
+ Errors::ApiError.new(request: request, response: response)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'concourse/models/token'
4
+
5
+ module Concourse
6
+ module Models
7
+ end
8
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Concourse
4
+ module Models
5
+ class Token
6
+ attr_reader :access_token, :token_type, :expires_at, :id_token
7
+
8
+ def initialize(parameters)
9
+ @access_token = parameters[:access_token]
10
+ @token_type = parameters[:token_type]
11
+ @expires_at = parameters[:expires_at]
12
+ @id_token = parameters[:id_token]
13
+ end
14
+
15
+ def ==(other)
16
+ other.class == self.class && other.state == state
17
+ end
18
+
19
+ def eql?(other)
20
+ self == other
21
+ end
22
+
23
+ def hash
24
+ state.hash
25
+ end
26
+
27
+ protected
28
+
29
+ def state
30
+ [@access_token, @token_type, @expires_at, @id_token]
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'concourse/sub_clients/skymarshal_client'
2
4
 
3
5
  module Concourse
4
6
  module SubClients
5
7
  end
6
- end
8
+ end
@@ -1,15 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'semantic'
2
4
  require 'time'
3
5
  require 'json'
4
6
 
5
7
  require 'concourse/urls'
6
8
  require 'concourse/headers'
9
+ require 'concourse/http'
7
10
 
8
11
  module Concourse
9
12
  module SubClients
10
13
  class SkymarshalClient
11
14
  VERSION_6_1 = Semantic::Version.new('6.1.0')
12
15
 
16
+ include Concourse::Http
17
+
13
18
  def initialize(options)
14
19
  @url = options[:url]
15
20
  @version = Semantic::Version.new(options[:version])
@@ -20,8 +25,10 @@ module Concourse
20
25
  headers = create_token_headers
21
26
  body = create_token_body(parameters)
22
27
 
28
+ token_request = Http::Request.new(url, headers, body)
23
29
  token_response = Excon.post(url, headers: headers, body: body)
24
30
 
31
+ assert_successful(token_request, token_response)
25
32
  token(token_response)
26
33
  end
27
34
 
@@ -38,60 +45,87 @@ module Concourse
38
45
  private
39
46
 
40
47
  def create_token_url
41
- @version >= VERSION_6_1 ?
42
- Concourse::Urls.sky_issuer_token_url(@url) :
43
- Concourse::Urls.sky_token_url(@url)
48
+ if @version >= VERSION_6_1
49
+ Concourse::Urls.sky_issuer_token_url(@url)
50
+ else
51
+ Concourse::Urls.sky_token_url(@url)
52
+ end
44
53
  end
45
54
 
46
55
  def create_token_headers
47
56
  {}
48
- .merge(Concourse::Headers.content_type(
49
- Concourse::ContentTypes::APPLICATION_WWW_FORM_URLENCODED))
50
- .merge(Concourse::Headers.authorization(
51
- Concourse::Authorization.basic(
52
- "fly", "Zmx5")))
57
+ .merge(Concourse::Headers.content_type(
58
+ Concourse::ContentTypes::APPLICATION_WWW_FORM_URLENCODED
59
+ ))
60
+ .merge(Concourse::Headers.authorization(
61
+ Concourse::Authorization.basic(
62
+ 'fly', 'Zmx5'
63
+ )
64
+ ))
53
65
  end
54
66
 
55
67
  def create_token_body(parameters)
56
68
  username = parameters[:username]
57
69
  password = parameters[:password]
58
70
 
59
- scope = @version >= VERSION_6_1 ?
60
- 'openid profile email federated:id groups' :
61
- 'openid+profile+email+federated:id+groups'
62
-
63
- URI.encode_www_form({
71
+ URI.encode_www_form(
72
+ {
64
73
  grant_type: 'password',
65
74
  username: username,
66
75
  password: password,
67
76
  scope: scope
68
- })
77
+ }
78
+ )
69
79
  end
70
80
 
71
81
  def token(token_response)
72
- token_response_date = @version >= VERSION_6_1 ?
73
- Time.parse(
74
- token_response.headers[Concourse::HeaderNames.date]) :
75
- nil
76
- token_response_body =
77
- JSON.parse(token_response.body, symbolize_names: true)
78
-
79
- @version >= VERSION_6_1 ?
80
- {
81
- access_token: token_response_body[:access_token],
82
- token_type: token_response_body[:token_type].downcase,
83
- expires_at:
84
- (token_response_date + token_response_body[:expires_in])
85
- .iso8601,
86
- id_token: token_response_body[:id_token]
87
- } :
88
- {
89
- access_token: token_response_body[:access_token],
90
- token_type: token_response_body[:token_type].downcase,
91
- expires_at: token_response_body[:expiry],
92
- id_token: token_response_body[:access_token]
93
- }
82
+ if @version >= VERSION_6_1
83
+ post_version_6_1_token(token_response)
84
+ else
85
+ pre_version_6_1_token(token_response)
86
+ end
87
+ end
88
+
89
+ def scope
90
+ if @version >= VERSION_6_1
91
+ 'openid profile email federated:id groups'
92
+ else
93
+ 'openid+profile+email+federated:id+groups'
94
+ end
95
+ end
96
+
97
+ def token_response_date(token_response)
98
+ Time.parse(token_response.headers[Concourse::HeaderNames.date])
99
+ end
100
+
101
+ def token_response_body(token_response)
102
+ JSON.parse(token_response.body, symbolize_names: true)
103
+ end
104
+
105
+ def pre_version_6_1_token(token_response)
106
+ token_response_body = token_response_body(token_response)
107
+
108
+ Models::Token.new(
109
+ access_token: token_response_body[:access_token],
110
+ token_type: token_response_body[:token_type].downcase,
111
+ expires_at: token_response_body[:expiry],
112
+ id_token: token_response_body[:access_token]
113
+ )
114
+ end
115
+
116
+ def post_version_6_1_token(token_response)
117
+ token_response_body = token_response_body(token_response)
118
+ token_response_date = token_response_date(token_response)
119
+
120
+ Models::Token.new(
121
+ access_token: token_response_body[:access_token],
122
+ token_type: token_response_body[:token_type].downcase,
123
+ expires_at:
124
+ (token_response_date + token_response_body[:expires_in])
125
+ .iso8601,
126
+ id_token: token_response_body[:id_token]
127
+ )
94
128
  end
95
129
  end
96
130
  end
97
- end
131
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Concourse
2
4
  module Urls
3
5
  def self.api_url(concourse_url)
@@ -16,8 +18,6 @@ module Concourse
16
18
  "#{api_url(concourse_url)}/info"
17
19
  end
18
20
 
19
- private
20
-
21
21
  def self.base_url(concourse_url)
22
22
  concourse_url.chomp('/')
23
23
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Concourse
2
- VERSION = '0.1.0.pre.9'
4
+ VERSION = '0.5.0.pre.1'
3
5
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: concourse.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre.9
4
+ version: 0.5.0.pre.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toby Clemson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-03 00:00:00.000000000 Z
11
+ date: 2021-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: excon
14
+ name: dry-schema
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.72'
19
+ version: '0.5'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.72'
26
+ version: '0.5'
27
27
  - !ruby/object:Gem::Dependency
28
- name: dry-schema
28
+ name: excon
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.5'
33
+ version: '0.72'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.5'
40
+ version: '0.72'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: semantic
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -67,61 +67,103 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '2.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: faker
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '13.0'
75
+ version: '2.15'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '13.0'
82
+ version: '2.15'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rake_circle_ci
84
+ name: gem-release
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.9'
89
+ version: '2.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0.9'
96
+ version: '2.0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: rake_github
98
+ name: jwt
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.5'
103
+ version: '2.2'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.5'
110
+ version: '2.2'
111
111
  - !ruby/object:Gem::Dependency
112
- name: rake_ssh
112
+ name: openssl
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '0.4'
117
+ version: '2.2'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '0.4'
124
+ version: '2.2'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '13.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '13.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rake_circle_ci
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.9'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.9'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rake_github
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.5'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.5'
125
167
  - !ruby/object:Gem::Dependency
126
168
  name: rake_gpg
127
169
  requirement: !ruby/object:Gem::Requirement
@@ -137,75 +179,75 @@ dependencies:
137
179
  - !ruby/object:Gem::Version
138
180
  version: '0.12'
139
181
  - !ruby/object:Gem::Dependency
140
- name: rspec
182
+ name: rake_ssh
141
183
  requirement: !ruby/object:Gem::Requirement
142
184
  requirements:
143
185
  - - "~>"
144
186
  - !ruby/object:Gem::Version
145
- version: '3.9'
187
+ version: '0.4'
146
188
  type: :development
147
189
  prerelease: false
148
190
  version_requirements: !ruby/object:Gem::Requirement
149
191
  requirements:
150
192
  - - "~>"
151
193
  - !ruby/object:Gem::Version
152
- version: '3.9'
194
+ version: '0.4'
153
195
  - !ruby/object:Gem::Dependency
154
- name: jwt
196
+ name: rspec
155
197
  requirement: !ruby/object:Gem::Requirement
156
198
  requirements:
157
199
  - - "~>"
158
200
  - !ruby/object:Gem::Version
159
- version: '2.2'
201
+ version: '3.9'
160
202
  type: :development
161
203
  prerelease: false
162
204
  version_requirements: !ruby/object:Gem::Requirement
163
205
  requirements:
164
206
  - - "~>"
165
207
  - !ruby/object:Gem::Version
166
- version: '2.2'
208
+ version: '3.9'
167
209
  - !ruby/object:Gem::Dependency
168
- name: openssl
210
+ name: rubocop
169
211
  requirement: !ruby/object:Gem::Requirement
170
212
  requirements:
171
213
  - - "~>"
172
214
  - !ruby/object:Gem::Version
173
- version: '2.2'
215
+ version: '1.12'
174
216
  type: :development
175
217
  prerelease: false
176
218
  version_requirements: !ruby/object:Gem::Requirement
177
219
  requirements:
178
220
  - - "~>"
179
221
  - !ruby/object:Gem::Version
180
- version: '2.2'
222
+ version: '1.12'
181
223
  - !ruby/object:Gem::Dependency
182
- name: faker
224
+ name: rubocop-rake
183
225
  requirement: !ruby/object:Gem::Requirement
184
226
  requirements:
185
227
  - - "~>"
186
228
  - !ruby/object:Gem::Version
187
- version: '2.15'
229
+ version: '0.5'
188
230
  type: :development
189
231
  prerelease: false
190
232
  version_requirements: !ruby/object:Gem::Requirement
191
233
  requirements:
192
234
  - - "~>"
193
235
  - !ruby/object:Gem::Version
194
- version: '2.15'
236
+ version: '0.5'
195
237
  - !ruby/object:Gem::Dependency
196
- name: gem-release
238
+ name: rubocop-rspec
197
239
  requirement: !ruby/object:Gem::Requirement
198
240
  requirements:
199
241
  - - "~>"
200
242
  - !ruby/object:Gem::Version
201
- version: '2.0'
243
+ version: '2.2'
202
244
  type: :development
203
245
  prerelease: false
204
246
  version_requirements: !ruby/object:Gem::Requirement
205
247
  requirements:
206
248
  - - "~>"
207
249
  - !ruby/object:Gem::Version
208
- version: '2.0'
250
+ version: '2.2'
209
251
  description: A Ruby SDK for the Concourse CI API.
210
252
  email:
211
253
  - tobyclemson@gmail.com
@@ -224,7 +266,11 @@ files:
224
266
  - concourse.rb.gemspec
225
267
  - lib/concourse.rb
226
268
  - lib/concourse/client.rb
269
+ - lib/concourse/errors.rb
227
270
  - lib/concourse/headers.rb
271
+ - lib/concourse/http.rb
272
+ - lib/concourse/models.rb
273
+ - lib/concourse/models/token.rb
228
274
  - lib/concourse/sub_clients.rb
229
275
  - lib/concourse/sub_clients/skymarshal_client.rb
230
276
  - lib/concourse/urls.rb