rumrunner 0.2.4 → 0.2.5

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: ccce65ebe39fca8b6c649ee4584cc97763ff0f0341434b810f92b3de7b498157
4
- data.tar.gz: 1f679cd595b16cda478a2b3b416e8040c17ec84fe889f9e969807a25435d6850
3
+ metadata.gz: 21ff1aee760e860283bf640e87bbdd97f5e6995caa5cdce7187c829e29417a67
4
+ data.tar.gz: f2acce2d5a033fce78a9010395063a8f44c8a45348de6eb08728aea43d873720
5
5
  SHA512:
6
- metadata.gz: c4252be1a723094c039c2a4c8b15e0bde5947c3e967f1486653b71f36af91c5be08c944f58ce2c3a7eb998f9159abb81e2b2be7642c23284bc437ba4f48d596b
7
- data.tar.gz: 1a79e2c3b769db27f089c92ce90fa9ea3aebe7fd2218f5e7db5c34ac91157e5d49cff8d51e998cbad044e948204aedf9ffac115f9ab6618d19114ff7c4a955a3
6
+ metadata.gz: 3b04b16707b81b88364e880fd3ba15dab605853735eaa67b537a1f9f293824a341befbceea5634ef1d8b6bbcdcf9bd63be841c0dfb768af97a8d662ad0870456
7
+ data.tar.gz: c9116ff64a6b9f4d77e724f49ec903f3c917a81acaab9b7905d4a96c0623aae6c77a3c9503dcb7aae4597c65458ee269dbf755ff629d4208d3df9ba7a4cfaa3d
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
- <img alt="rumrunner" src="./docs/icon.png"/>
2
1
 
2
+ ![Rum Runner](https://github.com/amancevice/rumrunner/blob/master/rumrunner.png?raw=true)
3
3
  [![Build Status](https://travis-ci.com/amancevice/rumrunner.svg?branch=master)](https://travis-ci.com/amancevice/rumrunner)
4
4
  [![codecov](https://codecov.io/gh/amancevice/rumrunner/branch/master/graph/badge.svg)](https://codecov.io/gh/amancevice/rumrunner)
5
5
  [![Gem Version](https://badge.fury.io/rb/rumrunner.svg)](https://badge.fury.io/rb/rumrunner)
@@ -23,6 +23,8 @@ Rum Runner has the following features:
23
23
 
24
24
  This project was born from using Makefiles to drive multi-stage builds. For the most part this worked really well, but it became a bit of an ordeal to write for more complex projects. This tool is an attempt to recreate that general technique with minimal annotation and limited assumptions.
25
25
 
26
+ View the docs on [rubydoc.info](https://www.rubydoc.info/github/amancevice/rumrunner)
27
+
26
28
  ## Installation
27
29
 
28
30
  ```bash
@@ -1,7 +1,15 @@
1
+ # frozen_string_literal: true
1
2
  require "rake"
2
3
 
3
4
  module Rum
5
+
6
+ ##
7
+ # Rum main application object. When invoking +rum+ from the
8
+ # command line, a Rum::Application object is created and run.
4
9
  class Application < Rake::Application
10
+
11
+ ##
12
+ # Default names for Rum Runner manifests.
5
13
  DEFAULT_RAKEFILES = [
6
14
  "rumfile",
7
15
  "Rumfile",
@@ -9,6 +17,7 @@ module Rum
9
17
  "Rumfile.rb",
10
18
  ]
11
19
 
20
+ ##
12
21
  # Initialize a Rumfile::Application object.
13
22
  def initialize
14
23
  super
@@ -16,6 +25,7 @@ module Rum
16
25
  @rakefiles = DEFAULT_RAKEFILES.dup
17
26
  end
18
27
 
28
+ ##
19
29
  # Initialize the command line parameters and app name.
20
30
  def init(app_name="rum", argv = ARGV)
21
31
  super "rum", argv
@@ -1,8 +1,32 @@
1
+ # frozen_string_literal: true
1
2
  require "forwardable"
2
3
 
3
4
  module Rum
5
+
6
+ ##
7
+ # Docker-specific objects and mixins.
4
8
  module Docker
9
+
10
+ ##
11
+ # Mixin to enable adding instance methods to a class that
12
+ # gets or sets-and-returns the given attr of the instance.
5
13
  module AttrCallable
14
+
15
+ ##
16
+ # Method to define a method-accessor for each argument supplied.
17
+ # When extended by a class
18
+ #
19
+ # Example:
20
+ # class Fizz
21
+ # extend AttrCallable
22
+ # attr_method_accessor :buzz
23
+ # end
24
+ #
25
+ # fizz = Fizz.new
26
+ # fizz.buzz "foo"
27
+ # fizz.buzz
28
+ # # => "foo"
29
+ #
6
30
  def attr_method_accessor(*args)
7
31
  args.each do |var|
8
32
  define_method var do |value = nil|
@@ -17,54 +41,96 @@ module Rum
17
41
  end
18
42
  end
19
43
 
44
+ ##
45
+ # Mixin to enable runtime Docker command manipulation.
20
46
  module Executable
21
47
  include Enumerable
22
48
 
49
+ ##
50
+ # The +OPTIONS+ portion of a Docker command.
23
51
  attr_reader :options
24
52
 
53
+ ##
54
+ # Initialize Docker executable with +OPTIONS+ and evaluate the
55
+ # <tt>&block</tt> if given.
25
56
  def initialize(options:nil, &block)
26
57
  @options = options || Options.new
27
58
  instance_eval(&block) if block_given?
28
59
  end
29
60
 
61
+ ##
62
+ # Yield Docker command word by word.
30
63
  def each
31
64
  self.class.name.split(/::/)[1..-1].each{|x| yield x.downcase }
32
65
  @options.each{|x| yield x }
33
66
  end
34
67
 
68
+ ##
69
+ # Interpret missing methods as +OPTION+.
35
70
  def method_missing(m, *args, &block)
36
71
  @options.send(m, *args, &block)
37
72
  args.any? ? self : @options[m]
38
73
  end
39
74
 
75
+ ##
76
+ # Convert Docker command to string.
40
77
  def to_s
41
78
  to_a.join(" ")
42
79
  end
43
80
 
44
- def with_defaults(options = {}, &block)
81
+ ##
82
+ # Assign default values to Docker command if not explicitly set.
83
+ #
84
+ # Example:
85
+ # Run.new(&block).with_defaults(user: "fizz")
86
+ #
87
+ # Unless the <tt>&block</tt> contains a directive to set a value for +user+,
88
+ # it will be set to "fizz".
89
+ def with_defaults(options = {})
45
90
  options.reject{|k,v| @options.include? k }.each{|k,v| @options[k] << v }
46
91
  self
47
92
  end
48
93
  end
49
94
 
95
+ ##
96
+ # Collection of Docker command options to be applied on execution.
50
97
  class Options
51
98
  extend Forwardable
52
99
  include Enumerable
53
100
 
54
- attr_reader :data
55
-
56
101
  def_delegators :@data, :[], :[]=, :include?, :to_h, :update
57
102
 
103
+ ##
104
+ # Initialize a new +OPTIONS+ collection for Docker executable.
105
+ # Evaluates the <tt>&block</tt> if given.
58
106
  def initialize(options = {}, &block)
59
107
  @data = Hash.new{|hash, key| hash[key] = [] }.update(options)
60
108
  instance_eval(&block) if block_given?
61
109
  end
62
110
 
111
+ ##
112
+ # Missing methods are interpreted as options to be added to the
113
+ # underlying collection.
114
+ #
115
+ # Example:
116
+ # opts = Options.new
117
+ # opts.fizz "buzz"
118
+ # # => @data={:fizz=>["buzz"]}
119
+ #
63
120
  def method_missing(m, *args, &block)
64
121
  @data[m] += args unless args.empty?
65
122
  self
66
123
  end
67
124
 
125
+ ##
126
+ # Yield each option as a CLI flag/option, with +-+ or +--+ prefix.
127
+ #
128
+ # Example:
129
+ # opts = Options.new
130
+ # opts.fizz "buzz"
131
+ # opts.to_a
132
+ # # => ["--fizz", "buzz"]
133
+ #
68
134
  def each
69
135
  @data.each do |name, values|
70
136
  option = name.length == 1 ? "-#{name}" : "--#{name.to_s.gsub(/_/, "-")}"
@@ -76,7 +142,7 @@ module Rum
76
142
  yield val
77
143
  end
78
144
  elsif [true, false].include? value
79
- yield option
145
+ yield "#{option}=#{value}"
80
146
  else
81
147
  yield option
82
148
  yield value.to_s
@@ -85,40 +151,67 @@ module Rum
85
151
  end
86
152
  end
87
153
 
154
+ ##
155
+ # Convert options to string.
156
+ #
157
+ # Example:
158
+ # opts = Options.new
159
+ # opts.fizz "buzz"
160
+ # opts.to_s
161
+ # # => "--fizz buzz"
162
+ #
88
163
  def to_s
89
164
  to_a.join(" ")
90
165
  end
91
166
  end
92
167
 
168
+ ##
169
+ # Docker build command object.
93
170
  class Build
94
171
  extend AttrCallable
95
172
  include Executable
96
173
 
174
+ ##
175
+ # Access +PATH+ with method.
97
176
  attr_method_accessor :path
98
177
 
178
+ ##
179
+ # Initialize Docker build command with +OPTIONS+ and +PATH+.
180
+ # Evaluates the <tt>&block</tt> if given.
99
181
  def initialize(options:nil, path:nil, &block)
100
182
  @path = path
101
183
  super options: options, &block
102
184
  end
103
185
 
186
+ ##
187
+ # Yield the Docker build commmand word-by-word.
104
188
  def each
105
189
  super{|x| yield x }
106
190
  yield @path || "."
107
191
  end
108
192
  end
109
193
 
194
+ ##
195
+ # Docker run command object.
110
196
  class Run
111
197
  extend AttrCallable
112
198
  include Executable
113
199
 
200
+ ##
201
+ # Access +IMAGE+ and +CMD+ with method.
114
202
  attr_method_accessor :image, :cmd
115
203
 
204
+ ##
205
+ # Initialize Docker run command with +OPTIONS+, +IMAGE+, and +CMD+.
206
+ # Evaluates the <tt>&block</tt> if given.
116
207
  def initialize(options:nil, image:nil, cmd:nil, &block)
117
208
  @image = image
118
209
  @cmd = cmd
119
210
  super options: options, &block
120
211
  end
121
212
 
213
+ ##
214
+ # Yield the Docker run commmand word-by-word.
122
215
  def each
123
216
  super{|x| yield x }
124
217
  yield @image
@@ -126,12 +219,19 @@ module Rum
126
219
  end
127
220
  end
128
221
 
222
+ ##
223
+ # Docker image object.
129
224
  class Image
130
225
  extend AttrCallable
131
226
  include Enumerable
132
227
 
228
+ ##
229
+ # Access components of the image reference by method.
133
230
  attr_method_accessor :registry, :username, :name, :tag
134
231
 
232
+ ##
233
+ # Initialize image by reference component.
234
+ # Evaluates <tt>&block</tt> if given.
135
235
  def initialize(name:, registry:nil, username:nil, tag:nil, &block)
136
236
  @registry = registry
137
237
  @username = username
@@ -140,19 +240,37 @@ module Rum
140
240
  instance_eval(&block) if block_given?
141
241
  end
142
242
 
243
+ ##
244
+ # Yield each non-nil component of the image reference in order.
143
245
  def each
144
246
  [@registry, @username, @name, @tag].compact.each{|x| yield x }
145
247
  end
146
248
 
249
+ ##
250
+ # Get the image reference without the @tag component.
147
251
  def family
148
252
  File.join *[@registry, @username, @name].compact.map(&:to_s)
149
253
  end
150
254
 
255
+ ##
256
+ # Convert the image reference to string.
151
257
  def to_s
152
258
  "#{family}:#{@tag || :latest}"
153
259
  end
154
260
 
155
261
  class << self
262
+
263
+ ##
264
+ # Parse a string as a Docker image reference
265
+ #
266
+ # Example:
267
+ # Image.parse("image")
268
+ # Image.parse("image:tag")
269
+ # Image.parse("username/image")
270
+ # Image.parse("username/image:tag")
271
+ # Image.parse("registry:5000/username/image")
272
+ # Image.parse("registry:5000/username/image:tag")
273
+ #
156
274
  def parse(string_or_symbol)
157
275
  string = string_or_symbol.to_s
158
276
  if string.count("/").zero? && string.count(":").zero?
@@ -1,15 +1,24 @@
1
+ # frozen_string_literal: true
1
2
  require "rake"
2
3
 
3
4
  require "rumrunner/manifest"
4
5
 
5
6
  module Rum
7
+
8
+ ##
9
+ # Defines the DSL methods for Rum Runner.
6
10
  module DSL
7
11
 
8
12
  private
9
13
 
10
- # :call-seq:
11
- # rum image_name
12
- # rum image_name: digest_dir
14
+ ##
15
+ # Rum base task block.
16
+ #
17
+ # Example
18
+ # rum :amancevice/rumrunner do
19
+ # tag %x(git describe --tags --always)
20
+ # # ...
21
+ # end
13
22
  #
14
23
  def rum(*args, &block)
15
24
  name, _, deps = Rake.application.resolve_args(args)
@@ -2,6 +2,13 @@ require "rumrunner/docker"
2
2
 
3
3
  module Rum
4
4
  class << self
5
+
6
+ ##
7
+ # Helper to initialize a +Rumfile+
8
+ #
9
+ # Example:
10
+ # $ ruby -r rumrunner -e Rum.init > Rumfile
11
+ #
5
12
  def init(input = nil, stdin = $stdin, stdout = $stdout, stderr = $stderr)
6
13
  # Get image name from stdin
7
14
  stderr.write "Docker image name [#{default = File.split(Dir.pwd).last}]: "
@@ -2,16 +2,28 @@ require "forwardable"
2
2
  require "rake"
3
3
 
4
4
  module Rum
5
+
6
+ ##
7
+ # Rum Runner Manifest for managing Docker commands.
5
8
  class Manifest
6
9
  extend Forwardable
7
10
  include Rake::DSL if defined? Rake::DSL
8
11
 
12
+ ##
13
+ # Access Docker image object.
9
14
  attr_reader :image
10
15
 
11
16
  def_delegator :@env, :<<, :env
12
17
  def_delegator :@root, :to_s, :root
13
18
  def_delegators :@image, :registry, :username, :name, :tag
14
19
 
20
+ ##
21
+ # Initialize new manifest with name and root path for caching
22
+ # build digests. Evaluates <tt>&block</tt> if given.
23
+ #
24
+ # Example:
25
+ # Manifest.new(name: "my_image", root: ".docker")
26
+ #
15
27
  def initialize(name:, root:nil, &block)
16
28
  @name = name
17
29
  @root = root || :".docker"
@@ -20,11 +32,25 @@ module Rum
20
32
  instance_eval(&block) if block_given?
21
33
  end
22
34
 
35
+ ##
36
+ # Defines the default task for +rum+ executable.
37
+ #
38
+ # Example:
39
+ # default :task_or_file
40
+ # default :task_or_file => [:deps]
41
+ #
23
42
  def default(*args, &block)
24
43
  name = Rake.application.resolve_args(args).first
25
44
  task :default => name
26
45
  end
27
46
 
47
+ ##
48
+ # Defines generic +docker build+ task.
49
+ #
50
+ # Example:
51
+ # build :name
52
+ # build :name => [:deps]
53
+ #
28
54
  def build(*args, &block)
29
55
  name, _, deps = Rake.application.resolve_args(args)
30
56
  task name => deps do
@@ -32,6 +58,13 @@ module Rum
32
58
  end
33
59
  end
34
60
 
61
+ ##
62
+ # Defines generic +docker run+ task.
63
+ #
64
+ # Example:
65
+ # run :name
66
+ # run :name => [:deps]
67
+ #
35
68
  def run(*args, &block)
36
69
  name, _, deps = Rake.application.resolve_args(args)
37
70
  task name => deps do
@@ -39,6 +72,13 @@ module Rum
39
72
  end
40
73
  end
41
74
 
75
+ ##
76
+ # Defines +docker build+ task for the given stage.
77
+ #
78
+ # Example:
79
+ # stage :name
80
+ # stage :name => [:deps]
81
+ #
42
82
  def stage(*args, &block)
43
83
  name, _, deps = Rake.application.resolve_args(args)
44
84
 
@@ -96,6 +136,14 @@ module Rum
96
136
  deps.each{|dep| task :"#{dep}:clean" => :"#{name}:clean" }
97
137
  end
98
138
 
139
+ ##
140
+ # Defines +docker run+ task for redirecting a file from a running
141
+ # instance of the dependent stage's container to the local file
142
+ # system.
143
+ #
144
+ # Example:
145
+ # artifact :name => [:stage]
146
+ #
99
147
  def artifact(*args, &block)
100
148
  name, _, deps = Rake.application.resolve_args(args)
101
149
 
@@ -125,6 +173,13 @@ module Rum
125
173
  end
126
174
  end
127
175
 
176
+ ##
177
+ # Defines +docker run+ task for shelling into the given stage.
178
+ #
179
+ # Example:
180
+ # shell :stage
181
+ # shell :stage => [:deps]
182
+ #
128
183
  def shell(*args, &block)
129
184
  target = Rake.application.resolve_args(args).first
130
185
  name = :"#{target}:shell"
@@ -143,6 +198,8 @@ module Rum
143
198
  end
144
199
  end
145
200
 
201
+ ##
202
+ # Install any remaining tasks for the manifest.
146
203
  def install
147
204
  install_clean
148
205
 
@@ -151,14 +208,21 @@ module Rum
151
208
 
152
209
  private
153
210
 
211
+ ##
212
+ # Get the shared build options for the Manifest.
154
213
  def build_options
155
214
  Docker::Options.new(build_arg: @env) unless @env.empty?
156
215
  end
157
216
 
217
+ ##
218
+ # Get the shared run options for the Manifest.
158
219
  def run_options
159
220
  Docker::Options.new(env: @env) unless @env.empty?
160
221
  end
161
222
 
223
+ ##
224
+ # Install :clean task for removing temporary Docker images and
225
+ # iidfiles.
162
226
  def install_clean
163
227
  desc "Remove any temporary images and products"
164
228
  task :clean do
@@ -1,3 +1,5 @@
1
1
  module Rum
2
- VERSION = "0.2.4"
2
+ ##
3
+ # Rum Runner gem version.
4
+ VERSION = "0.2.5"
3
5
  end
data/lib/rumrunner.rb CHANGED
@@ -5,7 +5,6 @@ require "rumrunner/dsl_definition"
5
5
  require "rumrunner/application"
6
6
  require "rumrunner/init"
7
7
 
8
- module Rum
9
- class Error < StandardError
10
- end
11
- end
8
+ ##
9
+ # Rum Runner namespace.
10
+ module Rum; end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rumrunner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Mancevice
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-23 00:00:00.000000000 Z
11
+ date: 2019-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake