concourse-fuselage 0.1.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 +7 -0
- data/.gitignore +3 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +19 -0
- data/LICENSE.txt +13 -0
- data/README.org +63 -0
- data/concourse-fuselage.gemspec +16 -0
- data/lib/concourse-fuselage/check.rb +31 -0
- data/lib/concourse-fuselage/in.rb +41 -0
- data/lib/concourse-fuselage/out.rb +39 -0
- data/lib/concourse-fuselage/step.rb +10 -0
- data/lib/concourse-fuselage/support/build_metadata.rb +50 -0
- data/lib/concourse-fuselage/support/config.rb +16 -0
- data/lib/concourse-fuselage/support/params.rb +17 -0
- data/lib/concourse-fuselage/support/source.rb +17 -0
- data/lib/concourse-fuselage/support/work_dir.rb +20 -0
- data/lib/concourse-fuselage.rb +3 -0
- metadata +80 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 975402edab7f41d684ccf38764222e64c329697f
|
4
|
+
data.tar.gz: b04adc7c4b1fda6d307c4523a3806c0a73cfcec7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 136fc2d48953ec7ca86e76b26d2de562356f3c2b607fc1d5178bbb13e2710bf6d2900f2544d9fcf98b10e7151c41e5fe11403d7288b33f91d6c32a40158b4a04
|
7
|
+
data.tar.gz: 5e367ca85563d78961de384a4d66dcfaaf5abeb71bf2b0fb11e2b9f31d7d020170fbb818ad94d090c28b0364bd00e30939185cbac186537aa46e3e32c4e08b66
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
concourse-fuselage (0.1.0)
|
5
|
+
contracts (~> 0.13, >= 0.13.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
contracts (0.13.0)
|
11
|
+
|
12
|
+
PLATFORMS
|
13
|
+
ruby
|
14
|
+
|
15
|
+
DEPENDENCIES
|
16
|
+
concourse-fuselage!
|
17
|
+
|
18
|
+
BUNDLED WITH
|
19
|
+
1.11.2
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright 2016 Chris Olstrom <chris@olstrom.com>
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
data/README.org
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
#+TITLE: fuselage
|
2
|
+
#+SUBTITLE: Simplifying Concourse Resources in Ruby
|
3
|
+
#+LATEX: \pagebreak
|
4
|
+
|
5
|
+
* Overview
|
6
|
+
|
7
|
+
~fuselage~ simplifies development of resources for Concourse by providing
|
8
|
+
classes for standard resource steps, interface contracts between Concourse and
|
9
|
+
your resource, and clear errors for most failure conditions.
|
10
|
+
|
11
|
+
* Implementing a Resource
|
12
|
+
|
13
|
+
#+BEGIN_SRC ruby
|
14
|
+
require 'concourse-fuselage'
|
15
|
+
#+END_SRC
|
16
|
+
|
17
|
+
Inherit from the appropriate class and implement the required methods.
|
18
|
+
|
19
|
+
** ~Fuselage::Check~
|
20
|
+
|
21
|
+
~Check~ is used to poll for new versions.
|
22
|
+
|
23
|
+
*** ~#latest~
|
24
|
+
|
25
|
+
Should return a ~Hash~ that describes the latest version. This will be called
|
26
|
+
when no prior version has been detected.
|
27
|
+
|
28
|
+
*** ~#since(version)~
|
29
|
+
|
30
|
+
Will be passed a ~Hash~ in the form ~Out#version~ returns.
|
31
|
+
|
32
|
+
Should return an ~Array~ of ~Hashes~, similar to what ~#latest~ would return.
|
33
|
+
|
34
|
+
** ~Fuselage::In~
|
35
|
+
|
36
|
+
~In~ is called for the ~get~ step of a resource.
|
37
|
+
|
38
|
+
*** ~#fetch!~
|
39
|
+
|
40
|
+
Fetch ~#version~ place it in ~#workdir~.
|
41
|
+
|
42
|
+
Should fail if ~#version~ is unavailable.
|
43
|
+
|
44
|
+
** ~Fuselage::Out~
|
45
|
+
|
46
|
+
~Out~ is called for the ~put~ step of a resource.
|
47
|
+
|
48
|
+
*** ~#update!~
|
49
|
+
|
50
|
+
Update the resource. All outputs from prior steps are available in ~#workdir~.
|
51
|
+
|
52
|
+
*** ~#version~
|
53
|
+
|
54
|
+
Should return a ~Hash~ that describes the resulting version.
|
55
|
+
|
56
|
+
* License
|
57
|
+
|
58
|
+
Apache 2.0 License, see ~LICENSE.txt~ for details.
|
59
|
+
|
60
|
+
* Contributors
|
61
|
+
|
62
|
+
- [[https://colstrom.github.io/][Chris Olstrom]] | [[mailto:chris@olstrom.com][e-mail]] | [[https://twitter.com/ChrisOlstrom][Twitter]]
|
63
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Gem::Specification.new do |gem|
|
2
|
+
gem.name = 'concourse-fuselage'
|
3
|
+
gem.version = '0.1.0'
|
4
|
+
gem.authors = ['Chris Olstrom']
|
5
|
+
gem.email = 'chris@olstrom.com'
|
6
|
+
gem.license = 'MIT'
|
7
|
+
gem.summary = 'Helpers for Concourse Resources'
|
8
|
+
gem.description = 'Helper classes and methods for implementing Concourse Resources'
|
9
|
+
|
10
|
+
gem.files = `git ls-files`.split("\n")
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
12
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
13
|
+
gem.require_paths = ['lib']
|
14
|
+
|
15
|
+
gem.add_runtime_dependency 'contracts', '~> 0.13', '>= 0.13.0'
|
16
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative 'step'
|
3
|
+
|
4
|
+
module Fuselage
|
5
|
+
class Check < Step
|
6
|
+
Contract None => Maybe[HashOf[String, String]]
|
7
|
+
def version
|
8
|
+
config['version']
|
9
|
+
end
|
10
|
+
|
11
|
+
Contract None => HashOf[String, String]
|
12
|
+
def latest
|
13
|
+
fail NotImplementedError
|
14
|
+
end
|
15
|
+
|
16
|
+
Contract HashOf[String, String] => ArrayOf[HashOf[String, String]]
|
17
|
+
def since(version)
|
18
|
+
fail NotImplementedError
|
19
|
+
end
|
20
|
+
|
21
|
+
Contract None => ArrayOf[HashOf[String, String]]
|
22
|
+
def output
|
23
|
+
version.nil? ? [latest] : since(version)
|
24
|
+
end
|
25
|
+
|
26
|
+
Contract None => String
|
27
|
+
def run
|
28
|
+
JSON.dump output
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative 'step'
|
3
|
+
require_relative 'support/build_metadata'
|
4
|
+
require_relative 'support/params'
|
5
|
+
require_relative 'support/work_dir'
|
6
|
+
|
7
|
+
module Fuselage
|
8
|
+
class In < Step
|
9
|
+
include Support::BuildMetadata
|
10
|
+
include Support::Params
|
11
|
+
include Support::WorkDir
|
12
|
+
|
13
|
+
Contract None => HashOf[String, String]
|
14
|
+
def version
|
15
|
+
@version ||= config.fetch 'version'
|
16
|
+
rescue KeyError
|
17
|
+
STDERR.puts 'Configuration payload is missing version'
|
18
|
+
end
|
19
|
+
|
20
|
+
Contract None => ArrayOf[Maybe[HashOf[String, String]]]
|
21
|
+
def metadata
|
22
|
+
[]
|
23
|
+
end
|
24
|
+
|
25
|
+
Contract None => String
|
26
|
+
def output
|
27
|
+
JSON.dump version: version, metadata: metadata
|
28
|
+
end
|
29
|
+
|
30
|
+
Contract None => Any
|
31
|
+
def fetch!
|
32
|
+
fail NotImplementedError
|
33
|
+
end
|
34
|
+
|
35
|
+
Contract None => String
|
36
|
+
def run
|
37
|
+
fetch!
|
38
|
+
output
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative 'step'
|
3
|
+
require_relative 'support/build_metadata'
|
4
|
+
require_relative 'support/params'
|
5
|
+
require_relative 'support/work_dir'
|
6
|
+
|
7
|
+
module Fuselage
|
8
|
+
class Out < Step
|
9
|
+
include Support::BuildMetadata
|
10
|
+
include Support::Params
|
11
|
+
include Support::WorkDir
|
12
|
+
|
13
|
+
Contract None => HashOf[String, String]
|
14
|
+
def version
|
15
|
+
fail NotImplementedError
|
16
|
+
end
|
17
|
+
|
18
|
+
Contract None => ArrayOf[Maybe[HashOf[String, String]]]
|
19
|
+
def metadata
|
20
|
+
[]
|
21
|
+
end
|
22
|
+
|
23
|
+
Contract None => String
|
24
|
+
def output
|
25
|
+
JSON.dump version: version, metadata: metadata
|
26
|
+
end
|
27
|
+
|
28
|
+
Contract None => Any
|
29
|
+
def update!
|
30
|
+
fail NotImplementedError
|
31
|
+
end
|
32
|
+
|
33
|
+
Contract None => String
|
34
|
+
def run
|
35
|
+
update!
|
36
|
+
output
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'contracts'
|
2
|
+
|
3
|
+
module Fuselage
|
4
|
+
module Support
|
5
|
+
module BuildMetadata
|
6
|
+
include ::Contracts::Core
|
7
|
+
include ::Contracts::Builtin
|
8
|
+
|
9
|
+
Contract None => Maybe[String]
|
10
|
+
def build_id
|
11
|
+
ENV.fetch 'BUILD_ID'
|
12
|
+
rescue KeyError
|
13
|
+
STDERR.puts 'Environment is missing BUILD_ID'
|
14
|
+
abort
|
15
|
+
end
|
16
|
+
|
17
|
+
Contract None => Maybe[String]
|
18
|
+
def build_name
|
19
|
+
ENV.fetch 'BUILD_NAME'
|
20
|
+
rescue KeyError
|
21
|
+
STDERR.puts 'Environment is missing BUILD_NAME'
|
22
|
+
abort
|
23
|
+
end
|
24
|
+
|
25
|
+
Contract None => Maybe[String]
|
26
|
+
def build_job_name
|
27
|
+
ENV.fetch 'BUILD_JOB_NAME'
|
28
|
+
rescue KeyError
|
29
|
+
STDERR.puts 'Environment is missing BUILD_JOB_NAME'
|
30
|
+
abort
|
31
|
+
end
|
32
|
+
|
33
|
+
Contract None => Maybe[String]
|
34
|
+
def build_pipeline_name
|
35
|
+
ENV.fetch 'BUILD_PIPELINE_NAME'
|
36
|
+
rescue KeyError
|
37
|
+
STDERR.puts 'Environment is missing BUILD_PIPELINE_NAME'
|
38
|
+
abort
|
39
|
+
end
|
40
|
+
|
41
|
+
Contract None => Maybe[String]
|
42
|
+
def atc_external_url
|
43
|
+
ENV.fetch 'ATC_EXTERNAL_URL'
|
44
|
+
rescue KeyError
|
45
|
+
STDERR.puts 'Environment is missing ATC_EXTERNAL_URL'
|
46
|
+
abort
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'contracts'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Fuselage
|
5
|
+
module Support
|
6
|
+
module Config
|
7
|
+
include ::Contracts::Core
|
8
|
+
include ::Contracts::Builtin
|
9
|
+
|
10
|
+
Contract None => Hash
|
11
|
+
def config
|
12
|
+
@config ||= JSON.load STDIN || {}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'contracts'
|
2
|
+
require_relative 'config'
|
3
|
+
|
4
|
+
module Fuselage
|
5
|
+
module Support
|
6
|
+
module Params
|
7
|
+
include ::Contracts::Core
|
8
|
+
include ::Contracts::Builtin
|
9
|
+
include Config
|
10
|
+
|
11
|
+
Contract None => Hash
|
12
|
+
def params
|
13
|
+
@params ||= config.fetch 'params', {}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'contracts'
|
2
|
+
require_relative 'config'
|
3
|
+
|
4
|
+
module Fuselage
|
5
|
+
module Support
|
6
|
+
module Source
|
7
|
+
include ::Contracts::Core
|
8
|
+
include ::Contracts::Builtin
|
9
|
+
include Config
|
10
|
+
|
11
|
+
Contract None => Hash
|
12
|
+
def source
|
13
|
+
@source ||= config.fetch 'source', {}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'contracts'
|
2
|
+
|
3
|
+
module Fuselage
|
4
|
+
module Support
|
5
|
+
module WorkDir
|
6
|
+
include ::Contracts::Core
|
7
|
+
include ::Contracts::Builtin
|
8
|
+
|
9
|
+
Contract None => String
|
10
|
+
def workdir
|
11
|
+
@workdir ||= ARGV.first.tap do |workdir|
|
12
|
+
fail ArgumentError if workdir.nil?
|
13
|
+
end
|
14
|
+
rescue ArgumentError
|
15
|
+
STDERR.puts 'Working directory missing, expected as first argument'
|
16
|
+
abort
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: concourse-fuselage
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Olstrom
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-02-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: contracts
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.13'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.13.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.13'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.13.0
|
33
|
+
description: Helper classes and methods for implementing Concourse Resources
|
34
|
+
email: chris@olstrom.com
|
35
|
+
executables: []
|
36
|
+
extensions: []
|
37
|
+
extra_rdoc_files: []
|
38
|
+
files:
|
39
|
+
- ".gitignore"
|
40
|
+
- Gemfile
|
41
|
+
- Gemfile.lock
|
42
|
+
- LICENSE.txt
|
43
|
+
- README.org
|
44
|
+
- concourse-fuselage.gemspec
|
45
|
+
- lib/concourse-fuselage.rb
|
46
|
+
- lib/concourse-fuselage/check.rb
|
47
|
+
- lib/concourse-fuselage/in.rb
|
48
|
+
- lib/concourse-fuselage/out.rb
|
49
|
+
- lib/concourse-fuselage/step.rb
|
50
|
+
- lib/concourse-fuselage/support/build_metadata.rb
|
51
|
+
- lib/concourse-fuselage/support/config.rb
|
52
|
+
- lib/concourse-fuselage/support/params.rb
|
53
|
+
- lib/concourse-fuselage/support/source.rb
|
54
|
+
- lib/concourse-fuselage/support/work_dir.rb
|
55
|
+
homepage:
|
56
|
+
licenses:
|
57
|
+
- MIT
|
58
|
+
metadata: {}
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 2.5.1
|
76
|
+
signing_key:
|
77
|
+
specification_version: 4
|
78
|
+
summary: Helpers for Concourse Resources
|
79
|
+
test_files: []
|
80
|
+
has_rdoc:
|