grimoire 0.1.4 → 0.1.6
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/CHANGELOG.md +5 -0
- data/README.md +1 -1
- data/lib/grimoire.rb +28 -0
- data/lib/grimoire/requirement_list.rb +1 -1
- data/lib/grimoire/solver.rb +23 -11
- data/lib/grimoire/system.rb +11 -0
- data/lib/grimoire/unit.rb +2 -2
- data/lib/grimoire/utility.rb +6 -0
- data/lib/grimoire/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9e488dfe4964214969754e066c275034a4663d67
         | 
| 4 | 
            +
              data.tar.gz: 015e51d0f9a05e51a00b5f0b41c4de77764c77f6
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: d4756adf5a06f61ed26b4732e7f8848b1a063f47372577578038be52ff8532e31d2c0f8e789612d9131d23aad8c27528fad05753d751b4bef6f821f8670253ce
         | 
| 7 | 
            +
              data.tar.gz: 387138f63f6e94ee25c359be79359266721441b3f0779452fc20f871f525f1e2df03954a43702cf9473de8c10899c2249aa6ca547a2df7cad887d632dced909e
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,8 @@ | |
| 1 | 
            +
            # v0.1.6
         | 
| 2 | 
            +
            * Add debug output if UI is available for output
         | 
| 3 | 
            +
            * Update exception errors to provide more detail/context
         | 
| 4 | 
            +
            * Provide better type checking prior to processing
         | 
| 5 | 
            +
             | 
| 1 6 | 
             
            # v0.1.4
         | 
| 2 7 | 
             
            * Provide simple system serialization support
         | 
| 3 8 | 
             
            * Fix dependency listing from units within path
         | 
    
        data/README.md
    CHANGED
    
    
    
        data/lib/grimoire.rb
    CHANGED
    
    | @@ -20,6 +20,34 @@ module Grimoire | |
| 20 20 | 
             
              autoload :UnitScoreKeeper, 'grimoire/unit_score_keeper'
         | 
| 21 21 | 
             
              autoload :Utility, 'grimoire/utility'
         | 
| 22 22 |  | 
| 23 | 
            +
              class << self
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                # @return [Bogo::Ui]
         | 
| 26 | 
            +
                attr_reader :ui
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                # Set Ui instance
         | 
| 29 | 
            +
                #
         | 
| 30 | 
            +
                # @param ui [Bogo::Ui]
         | 
| 31 | 
            +
                # @return [Bogo::Ui]
         | 
| 32 | 
            +
                def ui=(ui)
         | 
| 33 | 
            +
                  unless(ui.respond_to?(:debug))
         | 
| 34 | 
            +
                    raise TypeError.new "Expecting type `Bogo::Ui` but received `#{ui.class}`"
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                  @ui = ui
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
             | 
| 40 | 
            +
                # Write debug message
         | 
| 41 | 
            +
                def debug(*args)
         | 
| 42 | 
            +
                  if(ui)
         | 
| 43 | 
            +
                    if(block_given?)
         | 
| 44 | 
            +
                      args.push(yield)
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
                    ui.debug(*args)
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
             | 
| 23 51 | 
             
            end
         | 
| 24 52 |  | 
| 25 53 | 
             
            require 'grimoire/version'
         | 
| @@ -5,7 +5,7 @@ module Grimoire | |
| 5 5 | 
             
              # Requirment list for solver
         | 
| 6 6 | 
             
              class RequirementList < Utility
         | 
| 7 7 | 
             
                attribute :name, String, :required => true, :coerce => lambda{|val| val.to_s}
         | 
| 8 | 
            -
                attribute :requirements, DEPENDENCY_CLASS, :multiple => true, :default => [], :coerce => lambda{|val| DEPENDENCY_CLASS.new(val.first, *val.last)}
         | 
| 8 | 
            +
                attribute :requirements, DEPENDENCY_CLASS, :multiple => true, :default => [], :coerce => lambda{|val| Grimoire.const_get(:DEPENDENCY_CLASS).new(val.first, *val.last)}
         | 
| 9 9 | 
             
              end
         | 
| 10 10 |  | 
| 11 11 | 
             
            end
         | 
    
        data/lib/grimoire/solver.rb
    CHANGED
    
    | @@ -13,6 +13,7 @@ module Grimoire | |
| 13 13 | 
             
                attribute :requirements, RequirementList, :required => true
         | 
| 14 14 | 
             
                attribute :system, System, :required => true
         | 
| 15 15 | 
             
                attribute :score_keeper, UnitScoreKeeper
         | 
| 16 | 
            +
                attribute :result_limit, Integer, :required => true, :default => 1
         | 
| 16 17 |  | 
| 17 18 | 
             
                # @return [System] subset of full system based on requirements
         | 
| 18 19 | 
             
                attr_reader :world
         | 
| @@ -39,11 +40,16 @@ module Grimoire | |
| 39 40 | 
             
                  deps.each do |dep|
         | 
| 40 41 | 
             
                    units = root.subset(dep.name, dep.requirement)
         | 
| 41 42 | 
             
                    sha = Digest::SHA256.hexdigest(MultiJson.dump(units))
         | 
| 42 | 
            -
                     | 
| 43 | 
            +
                    if(@log.include?(sha))
         | 
| 44 | 
            +
                      debug "Units checksum already added to world. Skipping. (`#{sha}`)"
         | 
| 45 | 
            +
                      next
         | 
| 46 | 
            +
                    end
         | 
| 47 | 
            +
                    debug "Logging units checksum for world addition. (`#{sha}`)"
         | 
| 43 48 | 
             
                    @log.push(sha)
         | 
| 44 49 | 
             
                    units.each do |unit|
         | 
| 45 50 | 
             
                      build_world(unit.dependencies, my_world, root)
         | 
| 46 51 | 
             
                    end
         | 
| 52 | 
            +
                    debug "Units added to world: #{MultiJson.dump(units.map{|u| {u.name => u.version} })}"
         | 
| 47 53 | 
             
                    my_world.add_unit(units)
         | 
| 48 54 | 
             
                  end
         | 
| 49 55 | 
             
                end
         | 
| @@ -108,6 +114,9 @@ module Grimoire | |
| 108 114 | 
             
                # @raises [Error::UnitUnavailable]
         | 
| 109 115 | 
             
                def unit_for(dep)
         | 
| 110 116 | 
             
                  unit = nil
         | 
| 117 | 
            +
                  if(queues[dep.name].nil?)
         | 
| 118 | 
            +
                    raise KeyError.new "No valid units for requested name found within system! (`#{dep.name}`)"
         | 
| 119 | 
            +
                  end
         | 
| 111 120 | 
             
                  until(unit || queues[dep.name].empty?)
         | 
| 112 121 | 
             
                    unit = queues[dep.name].pop
         | 
| 113 122 | 
             
                    unit = nil unless dep.requirement.satisfied_by?(unit.version)
         | 
| @@ -158,7 +167,8 @@ module Grimoire | |
| 158 167 | 
             
                          end
         | 
| 159 168 | 
             
                        end
         | 
| 160 169 | 
             
                      end
         | 
| 161 | 
            -
                    rescue Error::ResolutionPathInvalid
         | 
| 170 | 
            +
                    rescue Error::ResolutionPathInvalid => e
         | 
| 171 | 
            +
                      debug "Resolution path deadend: #{e} (trying new path)"
         | 
| 162 172 | 
             
                      retry
         | 
| 163 173 | 
             
                    end
         | 
| 164 174 | 
             
                    deps.uniq
         | 
| @@ -169,30 +179,32 @@ module Grimoire | |
| 169 179 | 
             
                #
         | 
| 170 180 | 
             
                # @return [Bogo::PriorityQueue<Path>]
         | 
| 171 181 | 
             
                def generate!
         | 
| 182 | 
            +
                  if(requirements.requirements.empty?)
         | 
| 183 | 
            +
                    raise ArgumentError.new 'No cookbook constraints provided within Batali file!'
         | 
| 184 | 
            +
                  end
         | 
| 172 185 | 
             
                  custom_unit = Unit.new(
         | 
| 173 186 | 
             
                    :name => '~_SOLVER_UNIT_~',
         | 
| 174 187 | 
             
                    :version => '1.0.0',
         | 
| 175 188 | 
             
                    :dependencies => requirements.requirements
         | 
| 176 189 | 
             
                  )
         | 
| 177 190 | 
             
                  count = 0
         | 
| 191 | 
            +
                  debug "Solver Unit: #{MultiJson.dump(custom_unit)}"
         | 
| 192 | 
            +
                  debug{ "Solver world context of unit system: #{world.inspect}" }
         | 
| 178 193 | 
             
                  results = Bogo::PriorityQueue.new
         | 
| 179 194 | 
             
                  begin
         | 
| 180 | 
            -
                    until(count  | 
| 195 | 
            +
                    until(count >= result_limit)
         | 
| 181 196 | 
             
                      result = resolve(nil, custom_unit)
         | 
| 182 197 | 
             
                      results.push(Path.new(:units => result.slice(1, result.size)), count)
         | 
| 183 198 | 
             
                      count += 1
         | 
| 184 199 | 
             
                    end
         | 
| 185 | 
            -
                  rescue Error::UnitUnavailable
         | 
| 200 | 
            +
                  rescue Error::UnitUnavailable => e
         | 
| 201 | 
            +
                    debug "Failed to unit: #{e}"
         | 
| 186 202 | 
             
                    count = nil
         | 
| 187 203 | 
             
                  end
         | 
| 188 | 
            -
                   | 
| 189 | 
            -
                    raise Error:: | 
| 204 | 
            +
                  if(results.empty?)
         | 
| 205 | 
            +
                    raise Error::NoSolution.new("Failed to generate valid path for requirements: `#{custom_unit.dependencies}`")
         | 
| 190 206 | 
             
                  else
         | 
| 191 | 
            -
                     | 
| 192 | 
            -
                      raise Error::NoSolution.new("Failed to generate valid path for requirements: `#{custom_unit.dependencies.inspect}`")
         | 
| 193 | 
            -
                    else
         | 
| 194 | 
            -
                      results
         | 
| 195 | 
            -
                    end
         | 
| 207 | 
            +
                    results
         | 
| 196 208 | 
             
                  end
         | 
| 197 209 | 
             
                end
         | 
| 198 210 |  | 
    
        data/lib/grimoire/system.rb
    CHANGED
    
    | @@ -58,6 +58,9 @@ module Grimoire | |
| 58 58 | 
             
                  unless(constraint.respond_to?(:requirements))
         | 
| 59 59 | 
             
                    raise TypeError.new "Expecting `#{REQUIREMENT_CLASS}` but received `#{constraint.class}`"
         | 
| 60 60 | 
             
                  end
         | 
| 61 | 
            +
                  unless(units[unit_name])
         | 
| 62 | 
            +
                    raise KeyError.new("Failed to locate any units loaded in system with requested name: `#{unit_name}`")
         | 
| 63 | 
            +
                  end
         | 
| 61 64 | 
             
                  units[unit_name].find_all do |unit|
         | 
| 62 65 | 
             
                    constraint.satisfied_by?(unit.version)
         | 
| 63 66 | 
             
                  end
         | 
| @@ -83,5 +86,13 @@ module Grimoire | |
| 83 86 | 
             
                  )
         | 
| 84 87 | 
             
                end
         | 
| 85 88 |  | 
| 89 | 
            +
                # @return [String]
         | 
| 90 | 
            +
                def inspect
         | 
| 91 | 
            +
                  "<#{self.class}:#{self.object_id}>: " <<
         | 
| 92 | 
            +
                    units.to_a.sort_by(&:first).map do |name, units|
         | 
| 93 | 
            +
                    "#{name}: #{units.map(&:version).sort.map(&:to_s).join(', ')}"
         | 
| 94 | 
            +
                  end.join("\n")
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
             | 
| 86 97 | 
             
              end
         | 
| 87 98 | 
             
            end
         | 
    
        data/lib/grimoire/unit.rb
    CHANGED
    
    | @@ -6,8 +6,8 @@ module Grimoire | |
| 6 6 | 
             
              class Unit < Utility
         | 
| 7 7 |  | 
| 8 8 | 
             
                attribute :name, String, :required => true
         | 
| 9 | 
            -
                attribute :dependencies, DEPENDENCY_CLASS, :multiple => true, :default => [], :coerce => lambda{|val| DEPENDENCY_CLASS.new(val.first, *val.last)}
         | 
| 10 | 
            -
                attribute :version, VERSION_CLASS, :required => true, :coerce => lambda{|val| VERSION_CLASS.new(val)}
         | 
| 9 | 
            +
                attribute :dependencies, DEPENDENCY_CLASS, :multiple => true, :default => [], :coerce => lambda{|val| Grimoire.const_get(:DEPENDENCY_CLASS).new(val.first, *val.last)}
         | 
| 10 | 
            +
                attribute :version, VERSION_CLASS, :required => true, :coerce => lambda{|val| Grimoire.const_get(:VERSION_CLASS).new(val)}
         | 
| 11 11 |  | 
| 12 12 | 
             
              end
         | 
| 13 13 |  | 
    
        data/lib/grimoire/utility.rb
    CHANGED
    
    
    
        data/lib/grimoire/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: grimoire
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.6
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Chris Roberts
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2015-03- | 
| 11 | 
            +
            date: 2015-03-19 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bogo
         |