djin 0.2.0 → 0.6.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 +4 -4
- data/.github/workflows/ruby.yml +14 -0
- data/.rubocop.yml +8 -0
- data/.rubocop_todo.yml +17 -0
- data/CHANGELOG.md +21 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +33 -10
- data/README.md +133 -32
- data/Rakefile +6 -4
- data/Vertofile +45 -0
- data/bin/console +4 -3
- data/djin.gemspec +25 -21
- data/djin.yml +26 -13
- data/examples/djin.yml +25 -23
- data/exe/djin +3 -0
- data/lib/djin.rb +30 -23
- data/lib/djin/cli.rb +13 -1
- data/lib/djin/config_loader.rb +94 -0
- data/lib/djin/entities/task.rb +2 -0
- data/lib/djin/entities/types.rb +2 -0
- data/lib/djin/executor.rb +2 -0
- data/lib/djin/extensions/hash_extensions.rb +7 -1
- data/lib/djin/interpreter.rb +11 -63
- data/lib/djin/interpreter/base_command_builder.rb +26 -0
- data/lib/djin/interpreter/docker_command_builder.rb +29 -0
- data/lib/djin/interpreter/docker_compose_command_builder.rb +17 -0
- data/lib/djin/interpreter/local_command_builder.rb +11 -0
- data/lib/djin/repositories/task_repository.rb +2 -0
- data/lib/djin/task_contract.rb +37 -7
- data/lib/djin/version.rb +3 -1
- metadata +48 -11
- data/lib/djin/extensions/custom_predicates.rb +0 -18
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Djin
|
4
|
+
class Interpreter
|
5
|
+
class BaseCommandBuilder
|
6
|
+
def self.call(*options)
|
7
|
+
new.call(*options)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def build_run_params(run_params)
|
13
|
+
run_command = run_params
|
14
|
+
|
15
|
+
if run_params.is_a?(Hash)
|
16
|
+
run_command = run_params['commands']
|
17
|
+
run_options = run_params['options']
|
18
|
+
end
|
19
|
+
|
20
|
+
run_command = run_command.join(' && ') if run_command.is_a?(Array)
|
21
|
+
|
22
|
+
[run_command, run_options]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Djin
|
4
|
+
class Interpreter
|
5
|
+
class DockerCommandBuilder < BaseCommandBuilder
|
6
|
+
def call(params, task_name:)
|
7
|
+
current_folder_name = Pathname.getwd.basename.to_s
|
8
|
+
image = params['image'] || "djin_#{current_folder_name}_#{task_name}"
|
9
|
+
|
10
|
+
build_params = params['build']
|
11
|
+
|
12
|
+
if build_params.is_a?(Hash)
|
13
|
+
build_context = build_params['context']
|
14
|
+
build_options = build_params['options']
|
15
|
+
end
|
16
|
+
|
17
|
+
build_context ||= build_params
|
18
|
+
|
19
|
+
run_command, run_options = build_run_params(params['run'])
|
20
|
+
|
21
|
+
command = %(docker run #{run_options} #{image} sh -c "#{run_command}").squeeze(' ')
|
22
|
+
|
23
|
+
build_command = "docker build #{build_context} #{build_options} -t #{image}".squeeze(' ') if build_context
|
24
|
+
|
25
|
+
[command, build_command]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Djin
|
4
|
+
class Interpreter
|
5
|
+
class DockerComposeCommandBuilder < BaseCommandBuilder
|
6
|
+
def call(params, **_)
|
7
|
+
service = params['service']
|
8
|
+
|
9
|
+
compose_options = params['options']
|
10
|
+
|
11
|
+
run_command, run_options = build_run_params(params['run'])
|
12
|
+
|
13
|
+
[%(docker-compose #{compose_options} run #{run_options} #{service} sh -c "#{run_command}").squeeze(' '), nil]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/djin/task_contract.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Djin
|
2
4
|
class TaskContract < Dry::Validation::Contract
|
3
|
-
NOT_EMPTY = ->
|
4
|
-
OK = ->
|
5
|
+
NOT_EMPTY = ->(value) { !value.empty? }
|
6
|
+
OK = ->(_) { true }
|
7
|
+
NOT_OK = ->(_) { false }
|
5
8
|
|
6
9
|
BuildSchema = Dry::Schema.Params do
|
7
10
|
required(:context).filled(:string)
|
@@ -13,6 +16,10 @@ module Djin
|
|
13
16
|
required(:options).filled(:string)
|
14
17
|
end
|
15
18
|
|
19
|
+
RunLocalSchema = Dry::Schema.Params do
|
20
|
+
required(:commands).filled
|
21
|
+
end
|
22
|
+
|
16
23
|
DockerSchema = Dry::Schema.Params do
|
17
24
|
optional(:image).maybe(:string)
|
18
25
|
optional(:build)
|
@@ -25,32 +32,49 @@ module Djin
|
|
25
32
|
required(:run).filled
|
26
33
|
end
|
27
34
|
|
35
|
+
LocalSchema = Dry::Schema.Params do
|
36
|
+
required(:run).filled
|
37
|
+
end
|
38
|
+
|
28
39
|
params do
|
29
40
|
optional(:docker).filled do
|
30
41
|
hash(DockerSchema)
|
31
42
|
end
|
43
|
+
|
32
44
|
optional(:"docker-compose").filled do
|
33
45
|
hash(DockerComposeSchema)
|
34
46
|
end
|
35
47
|
|
48
|
+
optional(:local).filled do
|
49
|
+
hash(LocalSchema)
|
50
|
+
end
|
51
|
+
|
36
52
|
optional(:depends_on).each(:str?)
|
37
53
|
end
|
38
54
|
|
39
|
-
rule(:docker, :"docker-compose", :depends_on) do
|
40
|
-
|
55
|
+
rule(:docker, :"docker-compose", :local, :depends_on) do
|
56
|
+
unless values[:docker] || values[:"docker-compose"] || values[:depends_on] || values[:local]
|
57
|
+
key.failure('docker, docker-compose, local or depends_on key is required')
|
58
|
+
end
|
41
59
|
end
|
42
60
|
|
43
|
-
rule(:depends_on, :'docker-compose',docker: [
|
44
|
-
key.failure('image or build param is required for docker tasks') unless values.dig(:docker, :image) ||
|
61
|
+
rule(:depends_on, :'docker-compose', :local, docker: %i[image build]) do
|
62
|
+
key.failure('image or build param is required for docker tasks') unless values.dig(:docker, :image) ||
|
63
|
+
values.dig(:docker, :build) ||
|
64
|
+
values[:'docker-compose'] ||
|
65
|
+
values[:depends_on] ||
|
66
|
+
values.dig(:local, :run)
|
45
67
|
end
|
46
68
|
|
69
|
+
# TODO: Extract validations to command builders
|
70
|
+
|
47
71
|
rule(docker: :build) do
|
48
72
|
result, errors = validate_for(value, Hash => BuildSchema, String => NOT_EMPTY, NilClass => OK)
|
49
73
|
|
50
74
|
key.failure(errors) unless result
|
51
75
|
end
|
52
76
|
|
53
|
-
rule(
|
77
|
+
rule('docker-compose': :run) do
|
54
78
|
result, errors = validate_for(value, Hash => RunSchema, Array => NOT_EMPTY, NilClass => OK)
|
55
79
|
|
56
80
|
key.failure(errors) unless result
|
@@ -62,6 +86,12 @@ module Djin
|
|
62
86
|
key.failure(errors) unless result
|
63
87
|
end
|
64
88
|
|
89
|
+
rule(local: :run) do
|
90
|
+
result, errors = validate_for(value, Hash => RunLocalSchema, Array => NOT_EMPTY, NilClass => OK)
|
91
|
+
|
92
|
+
key.failure(errors) unless result
|
93
|
+
end
|
94
|
+
|
65
95
|
private
|
66
96
|
|
67
97
|
def validate_for(value, validations)
|
data/lib/djin/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: djin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carlos Atkinson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dry-cli
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.6.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.6.0
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: dry-struct
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -25,33 +39,33 @@ dependencies:
|
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: 1.3.0
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: dry-
|
42
|
+
name: dry-validation
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - "~>"
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
47
|
+
version: 1.5.1
|
34
48
|
type: :runtime
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
52
|
- - "~>"
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
54
|
+
version: 1.5.1
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
56
|
+
name: mustache
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.
|
61
|
+
version: 1.1.1
|
48
62
|
type: :runtime
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.
|
68
|
+
version: 1.1.1
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: vseries
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +94,20 @@ dependencies:
|
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '2.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: byebug
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: rake
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,7 +137,7 @@ dependencies:
|
|
109
137
|
- !ruby/object:Gem::Version
|
110
138
|
version: '3.0'
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
140
|
+
name: rubocop
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
114
142
|
requirements:
|
115
143
|
- - ">="
|
@@ -133,13 +161,17 @@ files:
|
|
133
161
|
- ".github/workflows/ruby.yml"
|
134
162
|
- ".gitignore"
|
135
163
|
- ".rspec"
|
164
|
+
- ".rubocop.yml"
|
165
|
+
- ".rubocop_todo.yml"
|
136
166
|
- ".travis.yml"
|
167
|
+
- CHANGELOG.md
|
137
168
|
- Dockerfile
|
138
169
|
- Gemfile
|
139
170
|
- Gemfile.lock
|
140
171
|
- LICENSE.txt
|
141
172
|
- README.md
|
142
173
|
- Rakefile
|
174
|
+
- Vertofile
|
143
175
|
- bin/console
|
144
176
|
- bin/setup
|
145
177
|
- djin.gemspec
|
@@ -149,12 +181,16 @@ files:
|
|
149
181
|
- exe/djin
|
150
182
|
- lib/djin.rb
|
151
183
|
- lib/djin/cli.rb
|
184
|
+
- lib/djin/config_loader.rb
|
152
185
|
- lib/djin/entities/task.rb
|
153
186
|
- lib/djin/entities/types.rb
|
154
187
|
- lib/djin/executor.rb
|
155
|
-
- lib/djin/extensions/custom_predicates.rb
|
156
188
|
- lib/djin/extensions/hash_extensions.rb
|
157
189
|
- lib/djin/interpreter.rb
|
190
|
+
- lib/djin/interpreter/base_command_builder.rb
|
191
|
+
- lib/djin/interpreter/docker_command_builder.rb
|
192
|
+
- lib/djin/interpreter/docker_compose_command_builder.rb
|
193
|
+
- lib/djin/interpreter/local_command_builder.rb
|
158
194
|
- lib/djin/repositories/task_repository.rb
|
159
195
|
- lib/djin/task_contract.rb
|
160
196
|
- lib/djin/version.rb
|
@@ -177,7 +213,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
213
|
- !ruby/object:Gem::Version
|
178
214
|
version: '0'
|
179
215
|
requirements: []
|
180
|
-
|
216
|
+
rubyforge_project:
|
217
|
+
rubygems_version: 2.7.6
|
181
218
|
signing_key:
|
182
219
|
specification_version: 4
|
183
220
|
summary: djin is a make-like utility for docker containers
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module Djin
|
2
|
-
module CustomPredicates
|
3
|
-
refine Dry::Logic::Predicates::Methods do
|
4
|
-
def is_one_of?(value, *options)
|
5
|
-
options.map do |option|
|
6
|
-
return option.call(value) if respond_to?(:call)
|
7
|
-
|
8
|
-
value.is_a?(option)
|
9
|
-
end.any?
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
refine Dry::Logic::Predicates do
|
14
|
-
extend Dry::Logic::Predicates::Methods
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|