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
         |