djin 0.1.0 → 0.5.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 +34 -0
- data/.rubocop.yml +8 -0
- data/.rubocop_todo.yml +17 -0
- data/CHANGELOG.md +15 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +38 -13
- data/README.md +125 -5
- data/Rakefile +6 -4
- data/Vertofile +45 -0
- data/bin/console +4 -3
- data/djin.gemspec +25 -20
- data/djin.yml +28 -2
- data/examples/djin.yml +3 -1
- data/exe/djin +3 -0
- data/lib/djin.rb +35 -22
- data/lib/djin/cli.rb +13 -1
- data/lib/djin/entities/task.rb +4 -1
- data/lib/djin/entities/types.rb +2 -0
- data/lib/djin/executor.rb +24 -10
- data/lib/djin/extensions/hash_extensions.rb +3 -1
- data/lib/djin/interpreter.rb +32 -50
- 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 +19 -0
- data/lib/djin/task_contract.rb +39 -7
- data/lib/djin/template_renderer.rb +34 -0
- data/lib/djin/version.rb +3 -1
- metadata +64 -12
- data/lib/djin/extensions/custom_predicates.rb +0 -18
@@ -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
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class TaskRepository
|
4
|
+
def initialize(tasks = [])
|
5
|
+
@tasks = tasks
|
6
|
+
end
|
7
|
+
|
8
|
+
def add(*tasks)
|
9
|
+
@tasks += tasks
|
10
|
+
end
|
11
|
+
|
12
|
+
def all
|
13
|
+
@tasks
|
14
|
+
end
|
15
|
+
|
16
|
+
def find_by_names(names)
|
17
|
+
@tasks.select { |task| names.include?(task.name) }
|
18
|
+
end
|
19
|
+
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,30 +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
|
47
|
+
|
48
|
+
optional(:local).filled do
|
49
|
+
hash(LocalSchema)
|
50
|
+
end
|
51
|
+
|
52
|
+
optional(:depends_on).each(:str?)
|
35
53
|
end
|
36
54
|
|
37
|
-
rule(:docker, :"docker-compose") do
|
38
|
-
|
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
|
39
59
|
end
|
40
60
|
|
41
|
-
rule(:'docker-compose',docker: [
|
42
|
-
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)
|
43
67
|
end
|
44
68
|
|
69
|
+
# TODO: Extract validations to command builders
|
70
|
+
|
45
71
|
rule(docker: :build) do
|
46
72
|
result, errors = validate_for(value, Hash => BuildSchema, String => NOT_EMPTY, NilClass => OK)
|
47
73
|
|
48
74
|
key.failure(errors) unless result
|
49
75
|
end
|
50
76
|
|
51
|
-
rule(
|
77
|
+
rule('docker-compose': :run) do
|
52
78
|
result, errors = validate_for(value, Hash => RunSchema, Array => NOT_EMPTY, NilClass => OK)
|
53
79
|
|
54
80
|
key.failure(errors) unless result
|
@@ -60,6 +86,12 @@ module Djin
|
|
60
86
|
key.failure(errors) unless result
|
61
87
|
end
|
62
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
|
+
|
63
95
|
private
|
64
96
|
|
65
97
|
def validate_for(value, validations)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Djin
|
4
|
+
class TemplateRenderer
|
5
|
+
def self.render(template_file)
|
6
|
+
new(template_file).render
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(template_file)
|
10
|
+
@template_file = template_file
|
11
|
+
end
|
12
|
+
|
13
|
+
def render
|
14
|
+
Mustache.render(@template_file,
|
15
|
+
args: args.join(' '),
|
16
|
+
args?: args.any?,
|
17
|
+
**env)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def args
|
23
|
+
index = ARGV.index('--')
|
24
|
+
|
25
|
+
return [] unless index
|
26
|
+
|
27
|
+
ARGV.slice((index + 1)..ARGV.size)
|
28
|
+
end
|
29
|
+
|
30
|
+
def env
|
31
|
+
@env ||= ENV.to_h.map { |k, v| [k.to_sym, v] }.to_h
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
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.5.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-07-14 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,47 @@ 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
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: vseries
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.1.0
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.1.0
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: bundler
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,20 +94,34 @@ dependencies:
|
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
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'
|
69
111
|
- !ruby/object:Gem::Dependency
|
70
112
|
name: rake
|
71
113
|
requirement: !ruby/object:Gem::Requirement
|
72
114
|
requirements:
|
73
115
|
- - "~>"
|
74
116
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
117
|
+
version: '13.0'
|
76
118
|
type: :development
|
77
119
|
prerelease: false
|
78
120
|
version_requirements: !ruby/object:Gem::Requirement
|
79
121
|
requirements:
|
80
122
|
- - "~>"
|
81
123
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
124
|
+
version: '13.0'
|
83
125
|
- !ruby/object:Gem::Dependency
|
84
126
|
name: rspec
|
85
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,7 +137,7 @@ dependencies:
|
|
95
137
|
- !ruby/object:Gem::Version
|
96
138
|
version: '3.0'
|
97
139
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
140
|
+
name: rubocop
|
99
141
|
requirement: !ruby/object:Gem::Requirement
|
100
142
|
requirements:
|
101
143
|
- - ">="
|
@@ -116,15 +158,20 @@ executables:
|
|
116
158
|
extensions: []
|
117
159
|
extra_rdoc_files: []
|
118
160
|
files:
|
161
|
+
- ".github/workflows/ruby.yml"
|
119
162
|
- ".gitignore"
|
120
163
|
- ".rspec"
|
164
|
+
- ".rubocop.yml"
|
165
|
+
- ".rubocop_todo.yml"
|
121
166
|
- ".travis.yml"
|
167
|
+
- CHANGELOG.md
|
122
168
|
- Dockerfile
|
123
169
|
- Gemfile
|
124
170
|
- Gemfile.lock
|
125
171
|
- LICENSE.txt
|
126
172
|
- README.md
|
127
173
|
- Rakefile
|
174
|
+
- Vertofile
|
128
175
|
- bin/console
|
129
176
|
- bin/setup
|
130
177
|
- djin.gemspec
|
@@ -137,10 +184,15 @@ files:
|
|
137
184
|
- lib/djin/entities/task.rb
|
138
185
|
- lib/djin/entities/types.rb
|
139
186
|
- lib/djin/executor.rb
|
140
|
-
- lib/djin/extensions/custom_predicates.rb
|
141
187
|
- lib/djin/extensions/hash_extensions.rb
|
142
188
|
- lib/djin/interpreter.rb
|
189
|
+
- lib/djin/interpreter/base_command_builder.rb
|
190
|
+
- lib/djin/interpreter/docker_command_builder.rb
|
191
|
+
- lib/djin/interpreter/docker_compose_command_builder.rb
|
192
|
+
- lib/djin/interpreter/local_command_builder.rb
|
193
|
+
- lib/djin/repositories/task_repository.rb
|
143
194
|
- lib/djin/task_contract.rb
|
195
|
+
- lib/djin/template_renderer.rb
|
144
196
|
- lib/djin/version.rb
|
145
197
|
homepage: https://github.com/catks/djin
|
146
198
|
licenses:
|
@@ -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
|
-
|