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.
@@ -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,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
- key.failure('docker, docker-compose or depends_on key is required') unless values[:docker] || values[:"docker-compose"] || values[:depends_on]
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: [: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]
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(:'docker-compose' => :run) do
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)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Djin
2
- VERSION = "0.4.0"
4
+ VERSION = '0.8.0'
3
5
  end
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.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-06-25 00:00:00.000000000 Z
11
+ date: 2020-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: dry-struct
14
+ name: dry-cli
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.3.0
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: 1.3.0
26
+ version: 0.6.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: dry-cli
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.6.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.6.0
40
+ version: 0.3.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: dry-validation
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.5.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.5.1
54
+ version: 1.3.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: vseries
56
+ name: dry-validation
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.1.0
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: 0.1.0
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: rake
112
+ name: byebug
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - "~>"
115
+ - - ">="
102
116
  - !ruby/object:Gem::Version
103
- version: '13.0'
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: '13.0'
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
- name: rspec
126
+ name: rake
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: '3.0'
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: '3.0'
138
+ version: '13.0'
125
139
  - !ruby/object:Gem::Dependency
126
- name: rubocop
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: byebug
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
- rubygems_version: 3.0.3
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
-