djin 0.4.0 → 0.8.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 +4 -4
- data/.github/workflows/ruby.yml +14 -0
- data/.rubocop.yml +8 -0
- data/.rubocop_todo.yml +17 -0
- data/CHANGELOG.md +16 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +6 -5
- data/README.md +122 -57
- data/Rakefile +6 -4
- data/Vertofile +4 -3
- data/bin/console +4 -3
- data/djin.gemspec +26 -23
- data/djin.yml +29 -20
- data/examples/djin.yml +25 -23
- data/exe/djin +2 -1
- data/lib/djin.rb +30 -23
- data/lib/djin/cli.rb +7 -5
- data/lib/djin/config_loader.rb +106 -0
- data/lib/djin/entities/file_config.rb +17 -0
- data/lib/djin/entities/task.rb +5 -5
- data/lib/djin/entities/types.rb +2 -0
- data/lib/djin/executor.rb +4 -11
- data/lib/djin/extensions/hash_extensions.rb +7 -1
- data/lib/djin/interpreter.rb +16 -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 +38 -7
- data/lib/djin/version.rb +3 -1
- metadata +52 -30
- 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,50 @@ 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
|
+
|
52
|
+
optional(:aliases).each(:str?)
|
36
53
|
optional(:depends_on).each(:str?)
|
37
54
|
end
|
38
55
|
|
39
|
-
rule(:docker, :"docker-compose", :depends_on) do
|
40
|
-
|
56
|
+
rule(:docker, :"docker-compose", :local, :depends_on) do
|
57
|
+
unless values[:docker] || values[:"docker-compose"] || values[:depends_on] || values[:local]
|
58
|
+
key.failure('docker, docker-compose, local or depends_on key is required')
|
59
|
+
end
|
41
60
|
end
|
42
61
|
|
43
|
-
rule(:depends_on, :'docker-compose',docker: [
|
44
|
-
key.failure('image or build param is required for docker tasks') unless values.dig(:docker, :image) ||
|
62
|
+
rule(:depends_on, :'docker-compose', :local, docker: %i[image build]) do
|
63
|
+
key.failure('image or build param is required for docker tasks') unless values.dig(:docker, :image) ||
|
64
|
+
values.dig(:docker, :build) ||
|
65
|
+
values[:'docker-compose'] ||
|
66
|
+
values[:depends_on] ||
|
67
|
+
values.dig(:local, :run)
|
45
68
|
end
|
46
69
|
|
70
|
+
# TODO: Extract validations to command builders
|
71
|
+
|
47
72
|
rule(docker: :build) do
|
48
73
|
result, errors = validate_for(value, Hash => BuildSchema, String => NOT_EMPTY, NilClass => OK)
|
49
74
|
|
50
75
|
key.failure(errors) unless result
|
51
76
|
end
|
52
77
|
|
53
|
-
rule(
|
78
|
+
rule('docker-compose': :run) do
|
54
79
|
result, errors = validate_for(value, Hash => RunSchema, Array => NOT_EMPTY, NilClass => OK)
|
55
80
|
|
56
81
|
key.failure(errors) unless result
|
@@ -62,6 +87,12 @@ module Djin
|
|
62
87
|
key.failure(errors) unless result
|
63
88
|
end
|
64
89
|
|
90
|
+
rule(local: :run) do
|
91
|
+
result, errors = validate_for(value, Hash => RunLocalSchema, Array => NOT_EMPTY, NilClass => OK)
|
92
|
+
|
93
|
+
key.failure(errors) unless result
|
94
|
+
end
|
95
|
+
|
65
96
|
private
|
66
97
|
|
67
98
|
def validate_for(value, validations)
|
data/lib/djin/version.rb
CHANGED
metadata
CHANGED
@@ -1,71 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: djin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
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-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: dry-
|
14
|
+
name: dry-cli
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.6.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.6.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: dry-
|
28
|
+
name: dry-equalizer
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.3.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.3.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name: dry-
|
42
|
+
name: dry-struct
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.
|
47
|
+
version: 1.3.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.
|
54
|
+
version: 1.3.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: dry-validation
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 1.5.1
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 1.5.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: mustache
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 1.1.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: vseries
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.1.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.1.0
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: bundler
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,49 +109,49 @@ dependencies:
|
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '2.0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
112
|
+
name: byebug
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
|
-
- - "
|
115
|
+
- - ">="
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
117
|
+
version: '0'
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
|
-
- - "
|
122
|
+
- - ">="
|
109
123
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
126
|
+
name: rake
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - "~>"
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
131
|
+
version: '13.0'
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - "~>"
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
138
|
+
version: '13.0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
140
|
+
name: rspec
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
|
-
- - "
|
143
|
+
- - "~>"
|
130
144
|
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
145
|
+
version: '3.0'
|
132
146
|
type: :development
|
133
147
|
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
|
-
- - "
|
150
|
+
- - "~>"
|
137
151
|
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
152
|
+
version: '3.0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
154
|
+
name: rubocop
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
142
156
|
requirements:
|
143
157
|
- - ">="
|
@@ -161,6 +175,8 @@ files:
|
|
161
175
|
- ".github/workflows/ruby.yml"
|
162
176
|
- ".gitignore"
|
163
177
|
- ".rspec"
|
178
|
+
- ".rubocop.yml"
|
179
|
+
- ".rubocop_todo.yml"
|
164
180
|
- ".travis.yml"
|
165
181
|
- CHANGELOG.md
|
166
182
|
- Dockerfile
|
@@ -179,12 +195,17 @@ files:
|
|
179
195
|
- exe/djin
|
180
196
|
- lib/djin.rb
|
181
197
|
- lib/djin/cli.rb
|
198
|
+
- lib/djin/config_loader.rb
|
199
|
+
- lib/djin/entities/file_config.rb
|
182
200
|
- lib/djin/entities/task.rb
|
183
201
|
- lib/djin/entities/types.rb
|
184
202
|
- lib/djin/executor.rb
|
185
|
-
- lib/djin/extensions/custom_predicates.rb
|
186
203
|
- lib/djin/extensions/hash_extensions.rb
|
187
204
|
- lib/djin/interpreter.rb
|
205
|
+
- lib/djin/interpreter/base_command_builder.rb
|
206
|
+
- lib/djin/interpreter/docker_command_builder.rb
|
207
|
+
- lib/djin/interpreter/docker_compose_command_builder.rb
|
208
|
+
- lib/djin/interpreter/local_command_builder.rb
|
188
209
|
- lib/djin/repositories/task_repository.rb
|
189
210
|
- lib/djin/task_contract.rb
|
190
211
|
- lib/djin/version.rb
|
@@ -207,7 +228,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
207
228
|
- !ruby/object:Gem::Version
|
208
229
|
version: '0'
|
209
230
|
requirements: []
|
210
|
-
|
231
|
+
rubyforge_project:
|
232
|
+
rubygems_version: 2.7.6
|
211
233
|
signing_key:
|
212
234
|
specification_version: 4
|
213
235
|
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
|
-
|