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.
@@ -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
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Djin
4
+ class Interpreter
5
+ class LocalCommandBuilder < BaseCommandBuilder
6
+ def call(params, **_)
7
+ build_run_params(params['run'])
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class TaskRepository
2
4
  def initialize(tasks = [])
3
5
  @tasks = tasks
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Djin
2
4
  class TaskContract < Dry::Validation::Contract
3
- NOT_EMPTY = -> (value) { ! value.empty? }
4
- OK = -> (_) { true }
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
- key.failure('docker, docker-compose or depends_on key is required') unless values[:docker] || values[:"docker-compose"] || values[:depends_on]
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: [:image, :build]) do
44
- key.failure('image or build param is required for docker tasks') unless values.dig(:docker, :image) || values.dig(:docker, :build) || values[:'docker-compose'] || values[:depends_on]
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(:'docker-compose' => :run) do
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)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Djin
2
- VERSION = "0.2.0"
4
+ VERSION = '0.6.1'
3
5
  end
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.2.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-03-31 00:00:00.000000000 Z
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-cli
42
+ name: dry-validation
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: 0.5.0
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: 0.5.0
54
+ version: 1.5.1
41
55
  - !ruby/object:Gem::Dependency
42
- name: dry-validation
56
+ name: mustache
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: 1.5.0
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.5.0
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: byebug
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
- rubygems_version: 3.0.3
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
-