concourse.rb 0.2.0 → 0.5.0.pre.2

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: e418cdfd2f7f6b6dcedd8ca3d7a9131bc604c2c6cd855f917a0aeebdb85e9b12
4
- data.tar.gz: 6089cc188fcbcf8f6733d8f5f8d79acc13e79806f25e260854831264fdbc2ea2
3
+ metadata.gz: de769701f997cd906e1cee096307afce8c3f08b4a2eb4e68137fa66516417500
4
+ data.tar.gz: 4bc8c9b5ba34282cdb999d8e5e35093b62eeff428fda05e702727b98e90d2124
5
5
  SHA512:
6
- metadata.gz: 94cf6b94a5a7d55bc53170ea34defdf80baa44023f23b9b72ed199c59907e91c59a15200bfd46a627d51b32be85dd289bedcd79ad0914424d60c0029aeeb8058
7
- data.tar.gz: cbcd88a607aa38e55f7253813f57410c054137f58f869241630eb1aa0c7f2c41aa55bc7dc23cd192ea679851ac0d084dd54257883de9ecada5521874e2cf1b55
6
+ metadata.gz: 8aa1ffe5f928858f969e95922bb1d7d31f7b59eb526e2d4478bfdba0652526fd36eb242cf307b2f77ea07b481433e94d3af91df25682ad5a3f9ccc804ef88140
7
+ data.tar.gz: 3bf29fb22485c13fee35c7d399b9810291418d8dc640cb288f3c1c1611e64c05b8506e1c7534a3522f223a4e371b6f1a16b5145779073b65637ac1514701e317
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,15 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- concourse.rb (0.2.0)
5
- dry-schema (~> 0.5)
6
- excon (~> 0.72)
7
- semantic (~> 1.5)
4
+ concourse.rb (0.5.0.pre.2)
5
+ excon (>= 0.72, < 1)
6
+ semantic (>= 1.5, < 2)
8
7
 
9
8
  GEM
10
9
  remote: https://rubygems.org/
11
10
  specs:
12
- activesupport (6.1.0)
11
+ activesupport (6.1.3.1)
13
12
  concurrent-ruby (~> 1.0, >= 1.0.2)
14
13
  i18n (>= 1.6, < 2)
15
14
  minitest (>= 5.1)
@@ -17,63 +16,39 @@ GEM
17
16
  zeitwerk (~> 2.3)
18
17
  addressable (2.7.0)
19
18
  public_suffix (>= 2.0.2, < 5.0)
19
+ ast (2.4.2)
20
20
  colored2 (3.1.2)
21
- concurrent-ruby (1.1.7)
21
+ concurrent-ruby (1.1.8)
22
22
  diff-lcs (1.4.4)
23
- dry-configurable (0.12.0)
24
- concurrent-ruby (~> 1.0)
25
- dry-core (~> 0.5, >= 0.5.0)
26
- dry-container (0.7.2)
27
- concurrent-ruby (~> 1.0)
28
- dry-configurable (~> 0.1, >= 0.1.3)
29
- dry-core (0.5.0)
30
- concurrent-ruby (~> 1.0)
31
- dry-equalizer (0.3.0)
32
- dry-inflector (0.2.0)
33
- dry-initializer (3.0.4)
34
- dry-logic (1.1.0)
35
- concurrent-ruby (~> 1.0)
36
- dry-core (~> 0.5, >= 0.5)
37
- dry-schema (0.6.0)
38
- concurrent-ruby (~> 1.0)
39
- dry-configurable (~> 0.8, >= 0.8.0)
40
- dry-core (~> 0.4)
41
- dry-equalizer (~> 0.2)
42
- dry-initializer (~> 3.0)
43
- dry-logic (~> 1.0)
44
- dry-types (~> 1.0)
45
- dry-types (1.4.0)
46
- concurrent-ruby (~> 1.0)
47
- dry-container (~> 0.3)
48
- dry-core (~> 0.4, >= 0.4.4)
49
- dry-equalizer (~> 0.3)
50
- dry-inflector (~> 0.1, >= 0.1.2)
51
- dry-logic (~> 1.0, >= 1.0.2)
52
- excon (0.78.1)
53
- faker (2.15.1)
23
+ excon (0.79.0)
24
+ faker (2.17.0)
54
25
  i18n (>= 1.6, < 2)
55
26
  faraday (1.3.0)
56
27
  faraday-net_http (~> 1.0)
57
28
  multipart-post (>= 1.2, < 3)
58
29
  ruby2_keywords
59
- faraday-net_http (1.0.0)
60
- gem-release (2.2.0)
30
+ faraday-net_http (1.0.1)
31
+ gem-release (2.2.1)
61
32
  hamster (3.0.0)
62
33
  concurrent-ruby (~> 1.0)
63
- i18n (1.8.6)
34
+ i18n (1.8.10)
64
35
  concurrent-ruby (~> 1.0)
65
36
  jwt (2.2.2)
66
- lino (1.7.0)
37
+ lino (1.9.0)
67
38
  hamster (~> 3.0)
68
39
  open4 (~> 1.3)
69
- minitest (5.14.2)
40
+ minitest (5.14.4)
70
41
  multipart-post (2.1.1)
71
42
  octokit (4.20.0)
72
43
  faraday (>= 0.9)
73
44
  sawyer (~> 0.8.0, >= 0.5.3)
74
45
  open4 (1.3.4)
75
46
  openssl (2.2.0)
47
+ parallel (1.20.1)
48
+ parser (3.0.0.0)
49
+ ast (~> 2.4.1)
76
50
  public_suffix (4.0.6)
51
+ rainbow (3.0.0)
77
52
  rake (13.0.3)
78
53
  rake_circle_ci (0.9.0)
79
54
  colored2 (~> 3.1)
@@ -95,6 +70,8 @@ GEM
95
70
  colored2 (~> 3.1)
96
71
  rake_factory (~> 0.23)
97
72
  sshkey (~> 2.0)
73
+ regexp_parser (2.1.1)
74
+ rexml (3.2.4)
98
75
  rspec (3.10.0)
99
76
  rspec-core (~> 3.10.0)
100
77
  rspec-expectations (~> 3.10.0)
@@ -104,11 +81,28 @@ GEM
104
81
  rspec-expectations (3.10.1)
105
82
  diff-lcs (>= 1.2.0, < 2.0)
106
83
  rspec-support (~> 3.10.0)
107
- rspec-mocks (3.10.1)
84
+ rspec-mocks (3.10.2)
108
85
  diff-lcs (>= 1.2.0, < 2.0)
109
86
  rspec-support (~> 3.10.0)
110
- rspec-support (3.10.1)
111
- ruby2_keywords (0.0.2)
87
+ rspec-support (3.10.2)
88
+ rubocop (1.12.0)
89
+ parallel (~> 1.10)
90
+ parser (>= 3.0.0.0)
91
+ rainbow (>= 2.2.2, < 4.0)
92
+ regexp_parser (>= 1.8, < 3.0)
93
+ rexml
94
+ rubocop-ast (>= 1.2.0, < 2.0)
95
+ ruby-progressbar (~> 1.7)
96
+ unicode-display_width (>= 1.4.0, < 3.0)
97
+ rubocop-ast (1.4.1)
98
+ parser (>= 2.7.1.5)
99
+ rubocop-rake (0.5.1)
100
+ rubocop
101
+ rubocop-rspec (2.2.0)
102
+ rubocop (~> 1.0)
103
+ rubocop-ast (>= 1.1.0)
104
+ ruby-progressbar (1.11.0)
105
+ ruby2_keywords (0.0.4)
112
106
  ruby_gpg2 (0.8.0)
113
107
  lino (>= 1.5)
114
108
  sawyer (0.8.2)
@@ -118,6 +112,7 @@ GEM
118
112
  sshkey (2.0.0)
119
113
  tzinfo (2.0.4)
120
114
  concurrent-ruby (~> 1.0)
115
+ unicode-display_width (2.0.0)
121
116
  zeitwerk (2.4.2)
122
117
 
123
118
  PLATFORMS
@@ -126,18 +121,21 @@ PLATFORMS
126
121
  x86_64-linux
127
122
 
128
123
  DEPENDENCIES
129
- bundler (~> 2.0)
124
+ bundler
130
125
  concourse.rb!
131
- faker (~> 2.15)
132
- gem-release (~> 2.0)
133
- jwt (~> 2.2)
134
- openssl (~> 2.2)
135
- rake (~> 13.0)
136
- rake_circle_ci (~> 0.9)
137
- rake_github (~> 0.5)
138
- rake_gpg (~> 0.12)
139
- rake_ssh (~> 0.4)
140
- rspec (~> 3.9)
126
+ faker
127
+ gem-release
128
+ jwt
129
+ openssl
130
+ rake
131
+ rake_circle_ci
132
+ rake_github
133
+ rake_gpg
134
+ rake_ssh
135
+ rspec
136
+ rubocop
137
+ rubocop-rake
138
+ rubocop-rspec
141
139
 
142
140
  BUNDLED WITH
143
- 2.2.4
141
+ 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,21 @@ 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
- spec.add_dependency 'dry-schema', '~> 0.5'
30
- spec.add_dependency 'semantic', '~> 1.5'
31
-
32
- spec.add_development_dependency 'bundler', '~> 2.0'
33
- spec.add_development_dependency 'rake', '~> 13.0'
34
- spec.add_development_dependency 'rake_circle_ci', '~> 0.9'
35
- spec.add_development_dependency 'rake_github', '~> 0.5'
36
- spec.add_development_dependency 'rake_ssh', '~> 0.4'
37
- spec.add_development_dependency 'rake_gpg', '~> 0.12'
38
- 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'
39
+ spec.add_dependency 'excon', '>= 0.72', '< 1'
40
+ spec.add_dependency 'semantic', '>= 1.5', '< 2'
41
+
42
+ spec.add_development_dependency 'bundler'
43
+ spec.add_development_dependency 'faker'
44
+ spec.add_development_dependency 'gem-release'
45
+ spec.add_development_dependency 'jwt'
46
+ spec.add_development_dependency 'openssl'
47
+ spec.add_development_dependency 'rake'
48
+ spec.add_development_dependency 'rake_circle_ci'
49
+ spec.add_development_dependency 'rake_github'
50
+ spec.add_development_dependency 'rake_gpg'
51
+ spec.add_development_dependency 'rake_ssh'
52
+ spec.add_development_dependency 'rspec'
53
+ spec.add_development_dependency 'rubocop'
54
+ spec.add_development_dependency 'rubocop-rake'
55
+ spec.add_development_dependency 'rubocop-rspec'
43
56
  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.2.0'
4
+ VERSION = '0.5.0.pre.2'
3
5
  end
metadata CHANGED
@@ -1,211 +1,251 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: concourse.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.5.0.pre.2
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
14
  name: excon
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0.72'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '1'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '0.72'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '1'
27
33
  - !ruby/object:Gem::Dependency
28
- name: dry-schema
34
+ name: semantic
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - "~>"
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
- version: '0.5'
39
+ version: '1.5'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '2'
34
43
  type: :runtime
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
- - - "~>"
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '1.5'
50
+ - - "<"
39
51
  - !ruby/object:Gem::Version
40
- version: '0.5'
52
+ version: '2'
41
53
  - !ruby/object:Gem::Dependency
42
- name: semantic
54
+ name: bundler
43
55
  requirement: !ruby/object:Gem::Requirement
44
56
  requirements:
45
- - - "~>"
57
+ - - ">="
46
58
  - !ruby/object:Gem::Version
47
- version: '1.5'
48
- type: :runtime
59
+ version: '0'
60
+ type: :development
49
61
  prerelease: false
50
62
  version_requirements: !ruby/object:Gem::Requirement
51
63
  requirements:
52
- - - "~>"
64
+ - - ">="
53
65
  - !ruby/object:Gem::Version
54
- version: '1.5'
66
+ version: '0'
55
67
  - !ruby/object:Gem::Dependency
56
- name: bundler
68
+ name: faker
57
69
  requirement: !ruby/object:Gem::Requirement
58
70
  requirements:
59
- - - "~>"
71
+ - - ">="
60
72
  - !ruby/object:Gem::Version
61
- version: '2.0'
73
+ version: '0'
62
74
  type: :development
63
75
  prerelease: false
64
76
  version_requirements: !ruby/object:Gem::Requirement
65
77
  requirements:
66
- - - "~>"
78
+ - - ">="
67
79
  - !ruby/object:Gem::Version
68
- version: '2.0'
80
+ version: '0'
69
81
  - !ruby/object:Gem::Dependency
70
- name: rake
82
+ name: gem-release
71
83
  requirement: !ruby/object:Gem::Requirement
72
84
  requirements:
73
- - - "~>"
85
+ - - ">="
74
86
  - !ruby/object:Gem::Version
75
- version: '13.0'
87
+ version: '0'
76
88
  type: :development
77
89
  prerelease: false
78
90
  version_requirements: !ruby/object:Gem::Requirement
79
91
  requirements:
80
- - - "~>"
92
+ - - ">="
81
93
  - !ruby/object:Gem::Version
82
- version: '13.0'
94
+ version: '0'
83
95
  - !ruby/object:Gem::Dependency
84
- name: rake_circle_ci
96
+ name: jwt
85
97
  requirement: !ruby/object:Gem::Requirement
86
98
  requirements:
87
- - - "~>"
99
+ - - ">="
88
100
  - !ruby/object:Gem::Version
89
- version: '0.9'
101
+ version: '0'
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
93
105
  requirements:
94
- - - "~>"
106
+ - - ">="
95
107
  - !ruby/object:Gem::Version
96
- version: '0.9'
108
+ version: '0'
97
109
  - !ruby/object:Gem::Dependency
98
- name: rake_github
110
+ name: openssl
99
111
  requirement: !ruby/object:Gem::Requirement
100
112
  requirements:
101
- - - "~>"
113
+ - - ">="
102
114
  - !ruby/object:Gem::Version
103
- version: '0.5'
115
+ version: '0'
104
116
  type: :development
105
117
  prerelease: false
106
118
  version_requirements: !ruby/object:Gem::Requirement
107
119
  requirements:
108
- - - "~>"
120
+ - - ">="
109
121
  - !ruby/object:Gem::Version
110
- version: '0.5'
122
+ version: '0'
111
123
  - !ruby/object:Gem::Dependency
112
- name: rake_ssh
124
+ name: rake
113
125
  requirement: !ruby/object:Gem::Requirement
114
126
  requirements:
115
- - - "~>"
127
+ - - ">="
116
128
  - !ruby/object:Gem::Version
117
- version: '0.4'
129
+ version: '0'
118
130
  type: :development
119
131
  prerelease: false
120
132
  version_requirements: !ruby/object:Gem::Requirement
121
133
  requirements:
122
- - - "~>"
134
+ - - ">="
123
135
  - !ruby/object:Gem::Version
124
- version: '0.4'
136
+ version: '0'
137
+ - !ruby/object:Gem::Dependency
138
+ name: rake_circle_ci
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ - !ruby/object:Gem::Dependency
152
+ name: rake_github
153
+ requirement: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ type: :development
159
+ prerelease: false
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
125
165
  - !ruby/object:Gem::Dependency
126
166
  name: rake_gpg
127
167
  requirement: !ruby/object:Gem::Requirement
128
168
  requirements:
129
- - - "~>"
169
+ - - ">="
130
170
  - !ruby/object:Gem::Version
131
- version: '0.12'
171
+ version: '0'
132
172
  type: :development
133
173
  prerelease: false
134
174
  version_requirements: !ruby/object:Gem::Requirement
135
175
  requirements:
136
- - - "~>"
176
+ - - ">="
137
177
  - !ruby/object:Gem::Version
138
- version: '0.12'
178
+ version: '0'
139
179
  - !ruby/object:Gem::Dependency
140
- name: rspec
180
+ name: rake_ssh
141
181
  requirement: !ruby/object:Gem::Requirement
142
182
  requirements:
143
- - - "~>"
183
+ - - ">="
144
184
  - !ruby/object:Gem::Version
145
- version: '3.9'
185
+ version: '0'
146
186
  type: :development
147
187
  prerelease: false
148
188
  version_requirements: !ruby/object:Gem::Requirement
149
189
  requirements:
150
- - - "~>"
190
+ - - ">="
151
191
  - !ruby/object:Gem::Version
152
- version: '3.9'
192
+ version: '0'
153
193
  - !ruby/object:Gem::Dependency
154
- name: jwt
194
+ name: rspec
155
195
  requirement: !ruby/object:Gem::Requirement
156
196
  requirements:
157
- - - "~>"
197
+ - - ">="
158
198
  - !ruby/object:Gem::Version
159
- version: '2.2'
199
+ version: '0'
160
200
  type: :development
161
201
  prerelease: false
162
202
  version_requirements: !ruby/object:Gem::Requirement
163
203
  requirements:
164
- - - "~>"
204
+ - - ">="
165
205
  - !ruby/object:Gem::Version
166
- version: '2.2'
206
+ version: '0'
167
207
  - !ruby/object:Gem::Dependency
168
- name: openssl
208
+ name: rubocop
169
209
  requirement: !ruby/object:Gem::Requirement
170
210
  requirements:
171
- - - "~>"
211
+ - - ">="
172
212
  - !ruby/object:Gem::Version
173
- version: '2.2'
213
+ version: '0'
174
214
  type: :development
175
215
  prerelease: false
176
216
  version_requirements: !ruby/object:Gem::Requirement
177
217
  requirements:
178
- - - "~>"
218
+ - - ">="
179
219
  - !ruby/object:Gem::Version
180
- version: '2.2'
220
+ version: '0'
181
221
  - !ruby/object:Gem::Dependency
182
- name: faker
222
+ name: rubocop-rake
183
223
  requirement: !ruby/object:Gem::Requirement
184
224
  requirements:
185
- - - "~>"
225
+ - - ">="
186
226
  - !ruby/object:Gem::Version
187
- version: '2.15'
227
+ version: '0'
188
228
  type: :development
189
229
  prerelease: false
190
230
  version_requirements: !ruby/object:Gem::Requirement
191
231
  requirements:
192
- - - "~>"
232
+ - - ">="
193
233
  - !ruby/object:Gem::Version
194
- version: '2.15'
234
+ version: '0'
195
235
  - !ruby/object:Gem::Dependency
196
- name: gem-release
236
+ name: rubocop-rspec
197
237
  requirement: !ruby/object:Gem::Requirement
198
238
  requirements:
199
- - - "~>"
239
+ - - ">="
200
240
  - !ruby/object:Gem::Version
201
- version: '2.0'
241
+ version: '0'
202
242
  type: :development
203
243
  prerelease: false
204
244
  version_requirements: !ruby/object:Gem::Requirement
205
245
  requirements:
206
- - - "~>"
246
+ - - ">="
207
247
  - !ruby/object:Gem::Version
208
- version: '2.0'
248
+ version: '0'
209
249
  description: A Ruby SDK for the Concourse CI API.
210
250
  email:
211
251
  - tobyclemson@gmail.com
@@ -224,7 +264,11 @@ files:
224
264
  - concourse.rb.gemspec
225
265
  - lib/concourse.rb
226
266
  - lib/concourse/client.rb
267
+ - lib/concourse/errors.rb
227
268
  - lib/concourse/headers.rb
269
+ - lib/concourse/http.rb
270
+ - lib/concourse/models.rb
271
+ - lib/concourse/models/token.rb
228
272
  - lib/concourse/sub_clients.rb
229
273
  - lib/concourse/sub_clients/skymarshal_client.rb
230
274
  - lib/concourse/urls.rb
@@ -244,9 +288,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
244
288
  version: 2.6.0
245
289
  required_rubygems_version: !ruby/object:Gem::Requirement
246
290
  requirements:
247
- - - ">="
291
+ - - ">"
248
292
  - !ruby/object:Gem::Version
249
- version: '0'
293
+ version: 1.3.1
250
294
  requirements: []
251
295
  rubygems_version: 3.0.1
252
296
  signing_key: