djin 0.1.1 → 0.2.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 +20 -0
- data/Gemfile.lock +6 -4
- data/README.md +47 -2
- data/djin.gemspec +2 -1
- data/djin.yml +8 -3
- data/lib/djin/entities/task.rb +2 -1
- data/lib/djin/executor.rb +22 -10
- data/lib/djin/interpreter.rb +29 -6
- data/lib/djin/repositories/task_repository.rb +17 -0
- data/lib/djin/task_contract.rb +6 -4
- data/lib/djin/version.rb +1 -1
- data/lib/djin.rb +12 -5
- metadata +20 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8941dba802fcd1d42ea6f6e52639928f8311b4f5379470a38082f3474985a3fb
|
4
|
+
data.tar.gz: 818fe3e599d48da784364fe96e8a9c413def53a4268adf44f3760d43235a2398
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 259f4f7a133336dd41286ecc43a0b7c4e91de62eb51fea4de258b7b934abd54bb7628e12707668b37acea748d32b3bea04c148a13e3c167669de45430b4ead23
|
7
|
+
data.tar.gz: 10f7bb94540315c5f72fc4fdddeb4bae8221c61d7e87dc3a346937bf354105ae6bc9d534f04d6347f44cab5f9862777a3a65ccf9340c5d1320ab2fb4c420a2b8
|
@@ -0,0 +1,20 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on: [push]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ubuntu-16.04
|
8
|
+
strategy:
|
9
|
+
matrix:
|
10
|
+
ruby: [ '2.4', '2.5', '2.6' ]
|
11
|
+
name: Ruby ${{ matrix.ruby }}
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@v2
|
14
|
+
- uses: actions/setup-ruby@v1
|
15
|
+
with:
|
16
|
+
ruby-version: ${{ matrix.ruby }}
|
17
|
+
- run: |
|
18
|
+
gem install bundler
|
19
|
+
bundle install --jobs 4 --retry 3
|
20
|
+
bundle exec rake
|
data/Gemfile.lock
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
djin (0.
|
4
|
+
djin (0.2.0)
|
5
5
|
dry-cli (~> 0.5.0)
|
6
6
|
dry-struct (~> 1.3.0)
|
7
7
|
dry-validation (~> 1.5.0)
|
8
|
+
vseries (~> 0.1.0)
|
8
9
|
|
9
10
|
GEM
|
10
11
|
remote: https://rubygems.org/
|
@@ -14,7 +15,7 @@ GEM
|
|
14
15
|
diff-lcs (1.3)
|
15
16
|
dry-cli (0.5.1)
|
16
17
|
concurrent-ruby (~> 1.0)
|
17
|
-
dry-configurable (0.11.
|
18
|
+
dry-configurable (0.11.5)
|
18
19
|
concurrent-ruby (~> 1.0)
|
19
20
|
dry-core (~> 0.4, >= 0.4.7)
|
20
21
|
dry-equalizer (~> 0.2)
|
@@ -58,7 +59,7 @@ GEM
|
|
58
59
|
dry-initializer (~> 3.0)
|
59
60
|
dry-schema (~> 1.5)
|
60
61
|
ice_nine (0.11.2)
|
61
|
-
rake (
|
62
|
+
rake (13.0.1)
|
62
63
|
rspec (3.9.0)
|
63
64
|
rspec-core (~> 3.9.0)
|
64
65
|
rspec-expectations (~> 3.9.0)
|
@@ -72,6 +73,7 @@ GEM
|
|
72
73
|
diff-lcs (>= 1.2.0, < 2.0)
|
73
74
|
rspec-support (~> 3.9.0)
|
74
75
|
rspec-support (3.9.2)
|
76
|
+
vseries (0.1.0)
|
75
77
|
|
76
78
|
PLATFORMS
|
77
79
|
ruby
|
@@ -80,7 +82,7 @@ DEPENDENCIES
|
|
80
82
|
bundler (~> 2.0)
|
81
83
|
byebug
|
82
84
|
djin!
|
83
|
-
rake (~>
|
85
|
+
rake (~> 13.0)
|
84
86
|
rspec (~> 3.0)
|
85
87
|
|
86
88
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -1,16 +1,32 @@
|
|
1
1
|
# Djin
|
2
2
|
|
3
|
+

|
4
|
+
|
5
|
+
Djin is a make-like utility for docker containers
|
6
|
+
|
3
7
|
## Installation
|
4
8
|
|
5
9
|
Djin is distributed as a Ruby Gem, to install simple run:
|
6
10
|
|
7
11
|
$ gem install djin
|
8
12
|
|
13
|
+
### With Rbenv
|
14
|
+
|
15
|
+
If you use Rbenv you can install djin only once and create a alias in your .basrc, .zshrc, etc:
|
16
|
+
|
17
|
+
#### ZSH
|
18
|
+
$ RBENV_VERSION=$(rbenv global) gem install djin && echo "alias djin='RBENV_VERSION=$(rbenv global) djin'" >> ~/.zshrc
|
19
|
+
|
20
|
+
### Bash
|
21
|
+
$ RBENV_VERSION=$(rbenv global) gem install djin && echo "alias djin='RBENV_VERSION=$(rbenv global) djin'" >> ~/.bashrc
|
22
|
+
|
9
23
|
## Usage
|
10
24
|
|
11
25
|
To use djin first you need to create a djin.yml file:
|
12
26
|
|
13
27
|
```yaml
|
28
|
+
djin_version: '0.2.0'
|
29
|
+
|
14
30
|
# With a docker image
|
15
31
|
script:
|
16
32
|
docker:
|
@@ -30,6 +46,36 @@ test:
|
|
30
46
|
|
31
47
|
```
|
32
48
|
|
49
|
+
You can also set task dependencies with depends_on option:
|
50
|
+
|
51
|
+
|
52
|
+
```yaml
|
53
|
+
djin_version: '0.2.0'
|
54
|
+
|
55
|
+
_default_run_options: &default_run_options
|
56
|
+
options: "--rm"
|
57
|
+
|
58
|
+
"db:create":
|
59
|
+
docker-compose:
|
60
|
+
service: app
|
61
|
+
run:
|
62
|
+
commands: rake db:create
|
63
|
+
<<: *default_run_options
|
64
|
+
|
65
|
+
"db:migrate":
|
66
|
+
docker-compose:
|
67
|
+
service: app
|
68
|
+
run:
|
69
|
+
commands: rake db:migrate
|
70
|
+
<<: *default_run_options
|
71
|
+
|
72
|
+
"db:setup":
|
73
|
+
depends_on:
|
74
|
+
- "db:create"
|
75
|
+
- "db:migrate"
|
76
|
+
|
77
|
+
```
|
78
|
+
|
33
79
|
After that you can run `djin {{task_name}}`, like `djin script` or `djin test`
|
34
80
|
|
35
81
|
## Development
|
@@ -40,8 +86,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
40
86
|
|
41
87
|
## TODO:
|
42
88
|
|
43
|
-
1.
|
44
|
-
2. Adds a `-f` option to load custom djin files
|
89
|
+
1. Adds a `-f` option to load custom djin files
|
45
90
|
|
46
91
|
## Contributing
|
47
92
|
|
data/djin.gemspec
CHANGED
@@ -28,8 +28,9 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_dependency "dry-struct", "~> 1.3.0"
|
29
29
|
spec.add_dependency "dry-cli", "~> 0.5.0"
|
30
30
|
spec.add_dependency "dry-validation", "~> 1.5.0"
|
31
|
+
spec.add_dependency "vseries", "~> 0.1.0"
|
31
32
|
spec.add_development_dependency "bundler", "~> 2.0"
|
32
|
-
spec.add_development_dependency "rake", "~>
|
33
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
33
34
|
spec.add_development_dependency "rspec", "~> 3.0"
|
34
35
|
spec.add_development_dependency "byebug"
|
35
36
|
end
|
data/djin.yml
CHANGED
@@ -1,13 +1,18 @@
|
|
1
|
+
djin_version: '0.2.0'
|
2
|
+
|
3
|
+
_default_run_options: &default_run_options
|
4
|
+
options: "--rm --entrypoint=''"
|
5
|
+
|
1
6
|
test:
|
2
7
|
docker-compose:
|
3
8
|
service: app
|
4
9
|
run:
|
5
10
|
commands: "cd /usr/src/djin && rspec"
|
6
|
-
|
11
|
+
<<: *default_run_options
|
12
|
+
|
7
13
|
sh:
|
8
14
|
docker-compose:
|
9
15
|
service: app
|
10
16
|
run:
|
11
17
|
commands: "sh"
|
12
|
-
|
13
|
-
|
18
|
+
<<: *default_run_options
|
data/lib/djin/entities/task.rb
CHANGED
@@ -3,7 +3,8 @@ module Djin
|
|
3
3
|
attribute :name, Types::String
|
4
4
|
attribute :description, Types::String.optional.default(nil)
|
5
5
|
attribute :build_command, Types::String.optional.default(nil)
|
6
|
-
attribute :command, Types::String
|
6
|
+
attribute :command, Types::String.optional.default(nil)
|
7
|
+
attribute :depends_on, Types::Array.of(Types::String).optional.default([].freeze)
|
7
8
|
|
8
9
|
def ==(other)
|
9
10
|
name == other.name &&
|
data/lib/djin/executor.rb
CHANGED
@@ -1,16 +1,28 @@
|
|
1
1
|
module Djin
|
2
2
|
class Executor
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
run task.command
|
7
|
-
end
|
8
|
-
end
|
3
|
+
def initialize(task_repository: Djin.task_repository)
|
4
|
+
@task_repository = task_repository
|
5
|
+
end
|
9
6
|
|
10
|
-
|
7
|
+
def call(*tasks)
|
8
|
+
tasks.each do |task|
|
9
|
+
run_task(task)
|
10
|
+
end
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
private
|
14
|
+
|
15
|
+
def run_task(task)
|
16
|
+
@task_repository.find_by_names(task.depends_on).each do |dependent_task|
|
17
|
+
run_task dependent_task
|
18
|
+
end
|
19
|
+
|
20
|
+
run task.build_command if task.build_command
|
21
|
+
run task.command if task.command
|
22
|
+
end
|
23
|
+
|
24
|
+
def run(command)
|
25
|
+
system command
|
26
|
+
end
|
15
27
|
end
|
16
28
|
end
|
data/lib/djin/interpreter.rb
CHANGED
@@ -2,22 +2,37 @@ module Djin
|
|
2
2
|
class Interpreter
|
3
3
|
using Djin::HashExtensions
|
4
4
|
|
5
|
-
RESERVED_WORDS = %w[
|
5
|
+
RESERVED_WORDS = %w[djin_version _default_options].freeze
|
6
6
|
|
7
|
-
|
7
|
+
InvalidConfigurationError = Class.new(StandardError)
|
8
|
+
MissingVersionError = Class.new(InvalidConfigurationError)
|
9
|
+
VersionNotSupportedError = Class.new(InvalidConfigurationError)
|
10
|
+
InvalidSyntaxError = Class.new(InvalidConfigurationError)
|
8
11
|
|
9
12
|
class << self
|
10
13
|
def load!(params)
|
11
|
-
|
14
|
+
version = params['djin_version']
|
15
|
+
raise MissingVersionError, 'Missing djin_version' unless version
|
16
|
+
raise VersionNotSupportedError, "Version #{version} is not supported, use #{Djin::VERSION} or higher" unless version_supported?(version)
|
17
|
+
|
18
|
+
tasks_params = params.except(*RESERVED_WORDS).reject { |task| task.start_with?('_') }
|
12
19
|
contract = TaskContract.new
|
13
20
|
|
14
|
-
|
21
|
+
tasks_params.map do |task_name, options|
|
15
22
|
result = contract.call(options)
|
16
23
|
|
17
|
-
raise
|
24
|
+
raise InvalidSyntaxError, result.errors.to_h if result.failure?
|
18
25
|
|
19
26
|
command, build_command = build_commands(options, task_name: task_name)
|
20
|
-
|
27
|
+
|
28
|
+
task_params = {
|
29
|
+
name: task_name,
|
30
|
+
build_command: build_command,
|
31
|
+
command: command,
|
32
|
+
depends_on: options['depends_on']
|
33
|
+
}.compact
|
34
|
+
|
35
|
+
Djin::Task.new(**task_params)
|
21
36
|
end
|
22
37
|
end
|
23
38
|
|
@@ -76,6 +91,14 @@ module Djin
|
|
76
91
|
|
77
92
|
[run_command, run_options]
|
78
93
|
end
|
94
|
+
|
95
|
+
def validate_version!(version)
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
def version_supported?(version)
|
100
|
+
Vseries::SemanticVersion.new(Djin::VERSION) >= Vseries::SemanticVersion.new(version)
|
101
|
+
end
|
79
102
|
end
|
80
103
|
end
|
81
104
|
end
|
data/lib/djin/task_contract.rb
CHANGED
@@ -32,14 +32,16 @@ module Djin
|
|
32
32
|
optional(:"docker-compose").filled do
|
33
33
|
hash(DockerComposeSchema)
|
34
34
|
end
|
35
|
+
|
36
|
+
optional(:depends_on).each(:str?)
|
35
37
|
end
|
36
38
|
|
37
|
-
rule(:docker, :"docker-compose") do
|
38
|
-
key.failure('docker
|
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]
|
39
41
|
end
|
40
42
|
|
41
|
-
rule(:'docker-compose',docker: [:image, :build]) do
|
42
|
-
key.failure('image or build param is required for docker tasks') unless values.dig(:docker, :image) || values.dig(:docker, :build) || values[:'docker-compose']
|
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]
|
43
45
|
end
|
44
46
|
|
45
47
|
rule(docker: :build) do
|
data/lib/djin/version.rb
CHANGED
data/lib/djin.rb
CHANGED
@@ -3,6 +3,7 @@ require "pathname"
|
|
3
3
|
require "yaml"
|
4
4
|
require "dry-struct"
|
5
5
|
require "dry-validation"
|
6
|
+
require "vseries"
|
6
7
|
require "dry/cli"
|
7
8
|
require "djin/extensions/hash_extensions"
|
8
9
|
require "djin/extensions/custom_predicates"
|
@@ -12,6 +13,7 @@ require "djin/interpreter"
|
|
12
13
|
require "djin/executor"
|
13
14
|
require "djin/cli"
|
14
15
|
require "djin/task_contract"
|
16
|
+
require "djin/repositories/task_repository"
|
15
17
|
|
16
18
|
module Djin
|
17
19
|
class Error < StandardError; end
|
@@ -20,17 +22,22 @@ module Djin
|
|
20
22
|
def self.load_tasks!(path = Pathname.getwd.join('djin.yml'))
|
21
23
|
abort 'Error: djin.yml not found' unless path.exist?
|
22
24
|
|
23
|
-
djin_file = YAML.
|
24
|
-
|
25
|
+
djin_file = YAML.safe_load(path.read, [], [], true)
|
26
|
+
tasks = Djin::Interpreter.load!(djin_file)
|
25
27
|
|
26
|
-
|
28
|
+
@task_repository = TaskRepository.new(tasks)
|
29
|
+
CLI.load_tasks!(tasks)
|
27
30
|
|
28
|
-
rescue Djin::Interpreter::
|
31
|
+
rescue Djin::Interpreter::InvalidConfigurationError => ex
|
29
32
|
abort(ex.message)
|
30
33
|
end
|
31
34
|
|
32
35
|
def self.tasks
|
33
|
-
|
36
|
+
task_repository.all
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.task_repository
|
40
|
+
@task_repository ||= TaskRepository.new
|
34
41
|
end
|
35
42
|
end
|
36
43
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: djin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.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-03-
|
11
|
+
date: 2020-03-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-struct
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 1.5.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: vseries
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.1.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.1.0
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: bundler
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +86,14 @@ dependencies:
|
|
72
86
|
requirements:
|
73
87
|
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
89
|
+
version: '13.0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
96
|
+
version: '13.0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rspec
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -116,6 +130,7 @@ executables:
|
|
116
130
|
extensions: []
|
117
131
|
extra_rdoc_files: []
|
118
132
|
files:
|
133
|
+
- ".github/workflows/ruby.yml"
|
119
134
|
- ".gitignore"
|
120
135
|
- ".rspec"
|
121
136
|
- ".travis.yml"
|
@@ -140,6 +155,7 @@ files:
|
|
140
155
|
- lib/djin/extensions/custom_predicates.rb
|
141
156
|
- lib/djin/extensions/hash_extensions.rb
|
142
157
|
- lib/djin/interpreter.rb
|
158
|
+
- lib/djin/repositories/task_repository.rb
|
143
159
|
- lib/djin/task_contract.rb
|
144
160
|
- lib/djin/version.rb
|
145
161
|
homepage: https://github.com/catks/djin
|