dockerfile-rb 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0f7550872225ced2ce677f0e8af5022518091692f9b3e85b8e8bf3a464b54e55
4
+ data.tar.gz: f6f6bc21c3160f00e9595aa9e8b2933d0143d787bdfaed006699d521cfe267ee
5
+ SHA512:
6
+ metadata.gz: b52821ac6315a6728aaa172458751a4603089539058425e42a01ce1b035556d22a7ae6b922f056073b5e8ebc9603b5a01eeca762aee8f64c67ffbf296001a269
7
+ data.tar.gz: b797d2d4510c97a48bee02309ba18a7af726f8266e72913846242f6c6d3811cf3934d1b8ea3fc24fe2838cd4cf2f643ae63e6f15fb88a72b4b5b8c9ffcb143ab
@@ -0,0 +1,20 @@
1
+ name: Rake Test
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+
8
+ runs-on: ubuntu-latest
9
+
10
+ steps:
11
+ - uses: actions/checkout@v1
12
+ - name: With Ruby 2.6
13
+ uses: actions/setup-ruby@v1
14
+ with:
15
+ ruby-version: 2.6.x
16
+ - name: Run rake
17
+ run: |
18
+ gem install bundler
19
+ bundle install --jobs 4 --retry 3
20
+ bundle exec rake
@@ -0,0 +1,29 @@
1
+ name: Release Gem
2
+
3
+ on:
4
+ create:
5
+ tags:
6
+ - v*
7
+
8
+ jobs:
9
+ build:
10
+ name: Build + Publish
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+ - name: Set up Ruby 2.6
16
+ uses: actions/setup-ruby@v1
17
+ with:
18
+ ruby-version: 2.6.x
19
+
20
+ - name: Publish to RubyGems
21
+ run: |
22
+ mkdir -p $HOME/.gem
23
+ touch $HOME/.gem/credentials
24
+ chmod 0600 $HOME/.gem/credentials
25
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
26
+ gem build *.gemspec
27
+ gem push *.gem
28
+ env:
29
+ GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_AUTH_TOKEN}}
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.5.1
7
+ before_install: gem install bundler -v 2.0.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in dockerfile-rb.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,37 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ dockerfile-rb (0.1.0)
5
+ citrus
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ citrus (3.0.2)
11
+ diff-lcs (1.3)
12
+ rake (13.0.1)
13
+ rspec (3.9.0)
14
+ rspec-core (~> 3.9.0)
15
+ rspec-expectations (~> 3.9.0)
16
+ rspec-mocks (~> 3.9.0)
17
+ rspec-core (3.9.1)
18
+ rspec-support (~> 3.9.1)
19
+ rspec-expectations (3.9.0)
20
+ diff-lcs (>= 1.2.0, < 2.0)
21
+ rspec-support (~> 3.9.0)
22
+ rspec-mocks (3.9.1)
23
+ diff-lcs (>= 1.2.0, < 2.0)
24
+ rspec-support (~> 3.9.0)
25
+ rspec-support (3.9.2)
26
+
27
+ PLATFORMS
28
+ ruby
29
+
30
+ DEPENDENCIES
31
+ bundler (~> 1.17)
32
+ dockerfile-rb!
33
+ rake (~> 13.0)
34
+ rspec (~> 3.0)
35
+
36
+ BUNDLED WITH
37
+ 1.17.3
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 gscho
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # DockerfileRB
2
+
3
+ ![](https://github.com/gscho/dockerfile-rb/workflows/Rake%20Test/badge.svg)
4
+
5
+ The intent of this gem is to use a PEG (citrus) to parse a Dockerfile into a Ruby object .
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'dockerfile-rb'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install dockerfile-rb
22
+
23
+ ## Usage
24
+
25
+ Example usage:
26
+
27
+ ```
28
+ require 'dockerfile-rb'
29
+
30
+ dockerfile = DockerfileRB.parse('/path/to/Dockerfile')
31
+ ```
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/gscho/dockerfile-rb.
36
+
37
+ ## License
38
+
39
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "dockerfile/rb"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,33 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "dockerfile-rb/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "dockerfile-rb"
7
+ spec.version = DockerfileRB::VERSION
8
+ spec.authors = ["gscho"]
9
+ spec.email = ["greg.c.schofield@gmail.com"]
10
+
11
+ spec.summary = %q{A Dockerfile parser implemented in ruby}
12
+ spec.homepage = "https://github.com/gscho/dockerfile-rb"
13
+ spec.license = "MIT"
14
+
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = "https://github.com/gscho/dockerfile-rb"
18
+ spec.metadata["changelog_uri"] = "https://github.com/gscho/dockerfile-rb/CHANGELOG.md"
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.17"
30
+ spec.add_development_dependency "rake", "~> 13.0"
31
+ spec.add_development_dependency "rspec", "~> 3.0"
32
+ spec.add_dependency "citrus"
33
+ end
@@ -0,0 +1,28 @@
1
+ require 'citrus'
2
+ require "dockerfile-rb/add"
3
+ require "dockerfile-rb/arg"
4
+ require "dockerfile-rb/cmd"
5
+ require "dockerfile-rb/copy"
6
+ require "dockerfile-rb/entrypoint"
7
+ require "dockerfile-rb/env"
8
+ require "dockerfile-rb/expose"
9
+ require "dockerfile-rb/healthcheck"
10
+ require "dockerfile-rb/from"
11
+ require "dockerfile-rb/label"
12
+ require "dockerfile-rb/maintainer"
13
+ require "dockerfile-rb/run"
14
+ require "dockerfile-rb/stopsignal"
15
+ require "dockerfile-rb/user"
16
+ require "dockerfile-rb/version"
17
+ require "dockerfile-rb/volume"
18
+ require "dockerfile-rb/workdir"
19
+
20
+ Citrus.load "#{File.expand_path('dockerfile-rb/grammars/dockerfile.citrus', __dir__)}"
21
+
22
+ module DockerfileRB
23
+ class Error < StandardError; end
24
+
25
+ def self.parse(content)
26
+ DockerfileRB::Dockerfile.parse(content).value
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ module DockerfileRB
2
+ class Add
3
+ attr_reader :arg, :name, :user, :group, :src, :dest
4
+ def initialize(arg, src, dest)
5
+ string_arg = arg.to_s
6
+ @arg = string_arg.to_s.split('=')[0] unless string_arg.nil?
7
+ split_args = string_arg.split(':')
8
+ @user = split_args[0].gsub(/--.+=/,'') unless split_args[0].nil?
9
+ @group = split_args[1] unless split_args.nil?
10
+ @src = src
11
+ @dest = dest
12
+ end
13
+ end
14
+ module AddParser
15
+ def value
16
+ Add.new(capture(:arg_term), capture(:src_term), capture(:dest_term))
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ module DockerfileRB
2
+ class Arg
3
+ attr_reader :name, :default_value
4
+ def initialize(name, default_value)
5
+ @name = name
6
+ @default_value = default_value
7
+ end
8
+ end
9
+ module ArgParser
10
+ def value
11
+ Arg.new(capture(:arg_name_term), capture(:arg_value_term))
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ module DockerfileRB
2
+ class Cmd
3
+ attr_reader :executable, :parameters
4
+ def initialize(executable, parameters)
5
+ @executable = executable
6
+ @parameters = parameters
7
+ end
8
+ end
9
+ module CmdParser
10
+ def value
11
+ cmd = captures(:cmd_term)
12
+ Cmd.new(cmd[0], cmd[1..-1])
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ module DockerfileRB
2
+ class Copy
3
+ attr_reader :arg, :name, :user, :group, :src, :dest
4
+ def initialize(arg, src, dest)
5
+ string_arg = arg.to_s
6
+ @arg = string_arg.to_s.split('=')[0] unless string_arg.nil?
7
+ split_args = string_arg.split(':')
8
+ @user = split_args[0].gsub(/--.+=/,'') unless split_args[0].nil?
9
+ @group = split_args[1] unless split_args.nil?
10
+ @src = src
11
+ @dest = dest
12
+ end
13
+ end
14
+ module CopyParser
15
+ def value
16
+ Copy.new(capture(:arg_term), capture(:src_term), capture(:dest_term))
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ module DockerfileRB
2
+ class Entrypoint
3
+ attr_reader :executable, :parameters
4
+ def initialize(executable, parameters)
5
+ @executable = executable
6
+ @parameters = parameters
7
+ end
8
+ end
9
+ module EntrypointExecParser
10
+ def value
11
+ entrypoint = captures(:entrypoint_term)
12
+ Entrypoint.new(entrypoint[0], entrypoint[1..-1])
13
+ end
14
+ end
15
+ module EntrypointShellParser
16
+ def value
17
+ entrypoint = captures(:entrypoint_term)
18
+ Entrypoint.new(entrypoint[0], entrypoint[1..-1])
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ module DockerfileRB
2
+ class Env
3
+ attr_reader :pairs
4
+ def initialize(pairs)
5
+ @pairs = pairs
6
+ end
7
+ end
8
+ module EnvWhitespaceParser
9
+ def value
10
+ Env.new({capture(:key_term).to_s => capture(:value_term).to_s})
11
+ end
12
+ end
13
+ module EnvKeyValueParser
14
+ def value
15
+ keys = captures(:key_term).map{ |c| c.value.strip }
16
+ values = captures(:value_term).map{ |c| c.value.strip }
17
+ Env.new(Hash[keys.zip(values)])
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ module DockerfileRB
2
+ class Expose
3
+ attr_reader :port, :protocol
4
+ def initialize(port, protocol)
5
+ @port = port.to_i
6
+ @protocol = (protocol || 'tcp').downcase
7
+ end
8
+ end
9
+ module ExposeParser
10
+ def value
11
+ expose = capture(:expose_term).to_s.split('/')
12
+ Expose.new(expose[0], expose[1])
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ module DockerfileRB
2
+ class From
3
+ attr_reader :image, :image_tag, :image_digest, :name
4
+ def initialize(from_value, as_value)
5
+ @name = as_value
6
+ @image = from_value.value.split(':')[0]
7
+ @image_tag = from_value.value.split(':')[1]
8
+ @image_digest = from_value.value.split('@')[1]
9
+ end
10
+ end
11
+ module FromParser
12
+ def value
13
+ as = capture(:as).value.first unless capture(:as).nil?
14
+ From.new(capture(:from_term), as)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,186 @@
1
+ grammar DockerfileRB::Dockerfile
2
+ rule dockerfile
3
+ (
4
+ comment |
5
+ add | add_with_whitespace |
6
+ arg |
7
+ copy | copy_with_whitespace |
8
+ cmd_exec | cmd_shell |
9
+ entrypoint_exec | entrypoint_shell |
10
+ env_with_whitespace | env_key_value |
11
+ expose |
12
+ healthcheck_none |
13
+ from |
14
+ label |
15
+ maintainer |
16
+ run_exec |
17
+ run_shell |
18
+ stopsignal |
19
+ user |
20
+ volume_json |
21
+ volume_string |
22
+ workdir |
23
+ line_break
24
+ )*
25
+ {
26
+ parsed = matches.map(&:value).compact
27
+ value = Hash.new {|h,k| h[k] = [] }
28
+ parsed.each{|p| value[p.class.name.split('::').last.downcase].push p }
29
+ value
30
+ }
31
+ end
32
+
33
+ rule add
34
+ ('ADD' space arg_term:('--chown=' [a-zA-Z0-9.@/_\-\$\\]+ ':' [a-zA-Z0-9:.@/_\-\$\\]+)? space? src_term:(string) space dest_term:(string) ) <DockerfileRB::AddParser>
35
+ end
36
+
37
+ rule add_with_whitespace
38
+ ('ADD' space arg_term:('--chown=' [a-zA-Z0-9.@/_\-\$\\]+ ':' [a-zA-Z0-9:.@/_\-\$\\]+)? space? '[' quote src_term:(string_with_whitespace) quote comma quote dest_term:(string_with_whitespace) quote ']' ) <DockerfileRB::AddParser>
39
+ end
40
+
41
+ rule arg
42
+ ('ARG' space arg_name_term:(string) '=' arg_value_term:(string)) <DockerfileRB::ArgParser>
43
+ end
44
+
45
+ rule as
46
+ ('AS' space as_term:(string)) {
47
+ captures(:as_term)
48
+ }
49
+ end
50
+
51
+ rule comment
52
+ '#' space? (string_with_whitespace | '\'' | '=' | '"')* line_break
53
+ end
54
+
55
+ rule copy
56
+ ('COPY' space arg_term:('--chown=' [a-zA-Z0-9.@/_\-\$\\]+ ':' [a-zA-Z0-9:.@/_\-\$\\]+)? space? src_term:(string) space dest_term:(string) ) <DockerfileRB::CopyParser>
57
+ end
58
+
59
+ rule copy_with_whitespace
60
+ ('COPY' space arg_term:('--chown=' [a-zA-Z0-9.@/_\-\$\\]+ ':' [a-zA-Z0-9:.@/_\-\$\\]+)? space? '[' quote src_term:(string_with_whitespace) quote comma quote dest_term:(string_with_whitespace) quote ']' ) <DockerfileRB::CopyParser>
61
+ end
62
+
63
+ rule cmd_exec
64
+ ('CMD' space '[' (quote cmd_term:(string) quote comma?)* ']') <DockerfileRB::CmdParser>
65
+ end
66
+
67
+ rule cmd_shell
68
+ ('CMD' space (cmd_term:(string) space?)*) <DockerfileRB::CmdParser>
69
+ end
70
+
71
+ rule entrypoint_exec
72
+ ('ENTRYPOINT' space '[' (quote entrypoint_term:(string) quote comma?)* ']') <DockerfileRB::EntrypointExecParser>
73
+ end
74
+
75
+ rule entrypoint_shell
76
+ ('ENTRYPOINT' space (entrypoint_term:(string) space?)*) <DockerfileRB::EntrypointShellParser>
77
+ end
78
+
79
+ rule env_with_whitespace
80
+ ('ENV' space key_term:(string) space value_term:(string_with_whitespace)) <DockerfileRB::EnvWhitespaceParser>
81
+ end
82
+
83
+ rule env_key_value
84
+ ('ENV' space (key_term:(escaped_string) space? '=' quote? space? value_term:(escaped_string) quote? line_continuation?)+) <DockerfileRB::EnvKeyValueParser>
85
+ end
86
+
87
+ rule expose
88
+ ('EXPOSE' space expose_term:(string)) <DockerfileRB::ExposeParser>
89
+ end
90
+
91
+ rule healthcheck_none
92
+ 'HEALTHCHECK NONE' <DockerfileRB::HealthcheckNoneParser>
93
+ end
94
+
95
+ rule from
96
+ ('FROM' space from_term:(string) space? as?) <DockerfileRB::FromParser>
97
+ end
98
+
99
+ rule label
100
+ ('LABEL' space label_term:(quote? string_with_whitespace quote? '=' quote? string_with_whitespace quote? line_continuation?)+) <DockerfileRB::LabelParser>
101
+ end
102
+
103
+ rule maintainer
104
+ ('MAINTAINER' space maintainer_term:(string)) <DockerfileRB::MaintainerParser>
105
+ end
106
+
107
+ rule run_exec
108
+ ('RUN' space '[' (quote run_term:(string_with_whitespace) quote comma?)* ']') <DockerfileRB::RunExecParser>
109
+ end
110
+
111
+ rule run_shell
112
+ ('RUN' space (run_term:(run_string) space? line_continuation? (comment)*)*) <DockerfileRB::RunShellParser>
113
+ end
114
+
115
+ rule stopsignal
116
+ ('STOPSIGNAL' space signal_term:(signal)) <DockerfileRB::StopsignalParser>
117
+ end
118
+
119
+ rule user
120
+ ('USER' space user_term:(string)) <DockerfileRB::UserParser>
121
+ end
122
+
123
+ rule volume_string
124
+ ('VOLUME' space (volume_term:(string) space?)* (']')?) <DockerfileRB::VolumeStringParser>
125
+ end
126
+
127
+ rule volume_json
128
+ ('VOLUME' space '[' (quote volume_term:(string) quote comma?)* ']') <DockerfileRB::VolumeJSONParser>
129
+ end
130
+
131
+ rule workdir
132
+ ('WORKDIR' space quote? workdir_term:(path) quote?) <DockerfileRB::WorkdirParser>
133
+ end
134
+
135
+ rule path
136
+ [a-zA-Z0-9:.@/_\-\$\[\]\\]+
137
+ end
138
+
139
+ rule string
140
+ [a-zA-Z0-9:;!#<>*&^,(){}+#.@/_\-\$\[\]\|$?]+
141
+ end
142
+
143
+ rule string_with_whitespace
144
+ (string | ' ')+
145
+ end
146
+
147
+ rule escaped_string
148
+ (escape? string_with_whitespace escape?)+
149
+ end
150
+
151
+ rule run_string
152
+ [a-zA-Z0-9:;!#<>*&^,(){}+#.@/_\-\$\[\]\|$ ='"?]+ | '\\'
153
+ end
154
+
155
+ rule comma
156
+ space? ',' space?
157
+ end
158
+
159
+ rule escape
160
+ ('\\' &' ')*
161
+ end
162
+
163
+ rule quote
164
+ space? '"' space?
165
+ end
166
+
167
+ rule line_continuation
168
+ space? '\\' space? line_break
169
+ end
170
+
171
+ rule space
172
+ [ \t]*
173
+ end
174
+
175
+ rule indent
176
+ [ \t\r\n]*
177
+ end
178
+
179
+ rule line_break
180
+ (space? "\n" | space? "\r\n") { nil }
181
+ end
182
+
183
+ rule signal
184
+ [\d] | "SIG"[A-Z]+
185
+ end
186
+ end
@@ -0,0 +1,13 @@
1
+ module DockerfileRB
2
+ class Healthcheck
3
+ attr_reader :none
4
+ def initialize(none = false)
5
+ @none = none
6
+ end
7
+ end
8
+ module HealthcheckNoneParser
9
+ def value
10
+ Healthcheck.new(true)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module DockerfileRB
2
+ class Label
3
+ attr_reader :pairs
4
+ def initialize(pairs)
5
+ @pairs = pairs
6
+ end
7
+ end
8
+ module LabelParser
9
+ def value
10
+ delimiters = ['=', "\""]
11
+ labels = capture(:label_term).to_s.split(Regexp.union(delimiters))
12
+ .reject { |capture| capture.empty? }
13
+ .map { |capture| capture.gsub("\n",'').gsub('\\','').strip }
14
+ Label.new(Hash[*labels])
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module DockerfileRB
2
+ class Maintainer
3
+ attr_reader :name
4
+ def initialize(name)
5
+ @name = name
6
+ end
7
+ end
8
+ module MaintainerParser
9
+ def value
10
+ Maintainer.new(capture(:maintainer_term))
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ module DockerfileRB
2
+ class Run
3
+ attr_reader :executable, :parameters, :command
4
+ def initialize
5
+ end
6
+
7
+ def shell(command)
8
+ @command = command
9
+ self
10
+ end
11
+
12
+ def exec(executable, parameters)
13
+ @executable = executable
14
+ @parameters = parameters
15
+ self
16
+ end
17
+ end
18
+ module RunExecParser
19
+ def value
20
+ run = captures(:run_term)
21
+ Run.new.exec(run[0], run[1..-1])
22
+ end
23
+ end
24
+ module RunShellParser
25
+ def value
26
+ run = captures(:run_term)
27
+ run.each { |r| r.string.strip! }
28
+ Run.new.shell(run.join(' '))
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,13 @@
1
+ module DockerfileRB
2
+ class Stopsignal
3
+ attr_reader :signal
4
+ def initialize(signal)
5
+ @signal = signal
6
+ end
7
+ end
8
+ module StopsignalParser
9
+ def value
10
+ Stopsignal.new(capture(:signal_term))
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module DockerfileRB
2
+ class User
3
+ attr_reader :user_id, :group_id
4
+ def initialize(user, group)
5
+ @user_id = user
6
+ @group_id = group
7
+ end
8
+ end
9
+ module UserParser
10
+ def value
11
+ user = capture(:user_term).value.split(':')
12
+ User.new(user[0], user[1])
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module DockerfileRB
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,18 @@
1
+ module DockerfileRB
2
+ class Volume
3
+ attr_reader :directories
4
+ def initialize(directories)
5
+ @directories = directories
6
+ end
7
+ end
8
+ module VolumeStringParser
9
+ def value
10
+ Volume.new(captures(:volume_term))
11
+ end
12
+ end
13
+ module VolumeJSONParser
14
+ def value
15
+ Volume.new(captures(:volume_term))
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module DockerfileRB
2
+ class Workdir
3
+ attr_reader :path
4
+ def initialize(path)
5
+ @path = path
6
+ end
7
+ end
8
+ module WorkdirParser
9
+ def value
10
+ Workdir.new(capture(:workdir_term))
11
+ end
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dockerfile-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - gscho
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-05-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.17'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.17'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '13.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '13.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: citrus
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description:
70
+ email:
71
+ - greg.c.schofield@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".github/workflows/rake.yml"
77
+ - ".github/workflows/release.yml"
78
+ - ".gitignore"
79
+ - ".rspec"
80
+ - ".travis.yml"
81
+ - Gemfile
82
+ - Gemfile.lock
83
+ - LICENSE.txt
84
+ - README.md
85
+ - Rakefile
86
+ - bin/console
87
+ - bin/setup
88
+ - dockerfile-rb.gemspec
89
+ - lib/dockerfile-rb.rb
90
+ - lib/dockerfile-rb/add.rb
91
+ - lib/dockerfile-rb/arg.rb
92
+ - lib/dockerfile-rb/cmd.rb
93
+ - lib/dockerfile-rb/copy.rb
94
+ - lib/dockerfile-rb/entrypoint.rb
95
+ - lib/dockerfile-rb/env.rb
96
+ - lib/dockerfile-rb/expose.rb
97
+ - lib/dockerfile-rb/from.rb
98
+ - lib/dockerfile-rb/grammars/dockerfile.citrus
99
+ - lib/dockerfile-rb/healthcheck.rb
100
+ - lib/dockerfile-rb/label.rb
101
+ - lib/dockerfile-rb/maintainer.rb
102
+ - lib/dockerfile-rb/run.rb
103
+ - lib/dockerfile-rb/stopsignal.rb
104
+ - lib/dockerfile-rb/user.rb
105
+ - lib/dockerfile-rb/version.rb
106
+ - lib/dockerfile-rb/volume.rb
107
+ - lib/dockerfile-rb/workdir.rb
108
+ homepage: https://github.com/gscho/dockerfile-rb
109
+ licenses:
110
+ - MIT
111
+ metadata:
112
+ homepage_uri: https://github.com/gscho/dockerfile-rb
113
+ source_code_uri: https://github.com/gscho/dockerfile-rb
114
+ changelog_uri: https://github.com/gscho/dockerfile-rb/CHANGELOG.md
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubygems_version: 3.0.3
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: A Dockerfile parser implemented in ruby
134
+ test_files: []