myrrha 2.0.0 → 3.0.0.rc1
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.
- data/CHANGELOG.md +6 -1
- data/Gemfile +4 -0
- data/Gemfile.lock +2 -0
- data/examples/sbyc_domain.rb +1 -1
- data/lib/myrrha/coerce.rb +1 -4
- data/lib/myrrha/coercions.rb +2 -2
- data/lib/myrrha/ext/domain.rb +16 -0
- data/lib/myrrha/loader.rb +1 -0
- data/lib/myrrha/version.rb +2 -2
- data/lib/myrrha.rb +1 -1
- data/myrrha.gemspec +1 -1
- data/myrrha.noespec +7 -6
- data/spec/ext/domain/test_coerce.rb +16 -0
- data/spec/ext/domain/test_coercions.rb +25 -0
- data/spec/myrrha/test_coercions.rb +1 -1
- metadata +26 -21
- data/lib/myrrha/domain/coercion_methods.rb +0 -17
- data/lib/myrrha/domain/impl.rb +0 -50
- data/lib/myrrha/domain/sbyc.rb +0 -78
- data/lib/myrrha/domain/value_methods.rb +0 -60
- data/lib/myrrha/domain.rb +0 -18
- data/spec/domain/impl/test_behavior.rb +0 -41
- data/spec/domain/impl/test_value_methods.rb +0 -101
- data/spec/domain/sbyc/test_behavior.rb +0 -46
- data/spec/domain/test_sbyc.rb +0 -81
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,8 @@ | |
| 1 | 
            +
            # 3.0.0 / FIX ME
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            * Implementation of domains has been moved to the domain gem. The syntax to create domains
         | 
| 4 | 
            +
              has therefore changed. Myrrha::Domain does no longer exists.
         | 
| 5 | 
            +
             | 
| 1 6 | 
             
            # 2.0.0 / 2012-09-26
         | 
| 2 7 |  | 
| 3 8 | 
             
            * Removed support for ruby 1.8.7
         | 
| @@ -24,7 +29,7 @@ | |
| 24 29 | 
             
              a Coercions instance under `coercions`.
         | 
| 25 30 |  | 
| 26 31 | 
             
                class Point
         | 
| 27 | 
            -
                  include Domain::Impl.new(:x, :y)
         | 
| 32 | 
            +
                  include Domain::Impl.new([:x, :y])
         | 
| 28 33 |  | 
| 29 34 | 
             
                  coercions do |c|
         | 
| 30 35 | 
             
                    c.coercion(String){|v,t| ...}
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -3,6 +3,7 @@ GEM | |
| 3 3 | 
             
              specs:
         | 
| 4 4 | 
             
                bluecloth (2.2.0)
         | 
| 5 5 | 
             
                diff-lcs (1.1.3)
         | 
| 6 | 
            +
                domain (1.0.0.rc1)
         | 
| 6 7 | 
             
                rake (0.9.2.2)
         | 
| 7 8 | 
             
                rspec (2.8.0)
         | 
| 8 9 | 
             
                  rspec-core (~> 2.8.0)
         | 
| @@ -21,6 +22,7 @@ PLATFORMS | |
| 21 22 |  | 
| 22 23 | 
             
            DEPENDENCIES
         | 
| 23 24 | 
             
              bluecloth (~> 2.2.0)
         | 
| 25 | 
            +
              domain (= 1.0.0.rc1)
         | 
| 24 26 | 
             
              rake (~> 0.9.2)
         | 
| 25 27 | 
             
              rspec (~> 2.8.0)
         | 
| 26 28 | 
             
              wlang (~> 0.10.2)
         | 
    
        data/examples/sbyc_domain.rb
    CHANGED
    
    
    
        data/lib/myrrha/coerce.rb
    CHANGED
    
    
    
        data/lib/myrrha/coercions.rb
    CHANGED
    
    | @@ -225,8 +225,8 @@ module Myrrha | |
| 225 225 | 
             
                def subdomain?(child, parent)
         | 
| 226 226 | 
             
                  if child == parent
         | 
| 227 227 | 
             
                    true
         | 
| 228 | 
            -
                  elsif parent.respond_to?(: | 
| 229 | 
            -
                    parent. | 
| 228 | 
            +
                  elsif parent.respond_to?(:super_domain_of?)
         | 
| 229 | 
            +
                    parent.super_domain_of?(child)
         | 
| 230 230 | 
             
                  elsif child.respond_to?(:superclass) && child.superclass
         | 
| 231 231 | 
             
                    subdomain?(child.superclass, parent)
         | 
| 232 232 | 
             
                  else
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            module Domain
         | 
| 2 | 
            +
              module CoercionMethods
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                def coercions(&bl)
         | 
| 5 | 
            +
                  @coercions ||= ::Myrrha::Coercions.new{|c| c.main_target_domain = self}
         | 
| 6 | 
            +
                  @coercions.append(&bl) if bl
         | 
| 7 | 
            +
                  @coercions
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def coerce(arg)
         | 
| 11 | 
            +
                  coercions.coerce(arg, self)
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              end # module CoercionMethods
         | 
| 15 | 
            +
              include CoercionMethods
         | 
| 16 | 
            +
            end # module Domain
         | 
    
        data/lib/myrrha/loader.rb
    CHANGED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            require "domain"
         | 
    
        data/lib/myrrha/version.rb
    CHANGED
    
    
    
        data/lib/myrrha.rb
    CHANGED
    
    | @@ -1,12 +1,12 @@ | |
| 1 1 | 
             
            require_relative "myrrha/version"
         | 
| 2 2 | 
             
            require_relative "myrrha/loader"
         | 
| 3 3 | 
             
            require_relative 'myrrha/errors'
         | 
| 4 | 
            +
            require_relative 'myrrha/ext/domain'
         | 
| 4 5 | 
             
            #
         | 
| 5 6 | 
             
            # Myrrha -- the missing coercion framework for Ruby
         | 
| 6 7 | 
             
            #
         | 
| 7 8 | 
             
            module Myrrha
         | 
| 8 9 |  | 
| 9 | 
            -
              require_relative 'myrrha/domain'
         | 
| 10 10 | 
             
              require_relative 'myrrha/coercions'
         | 
| 11 11 |  | 
| 12 12 | 
             
              # Builds a set of coercions rules.
         | 
    
        data/myrrha.gemspec
    CHANGED
    
    | @@ -128,7 +128,7 @@ Gem::Specification.new do |s| | |
| 128 128 | 
             
              s.add_development_dependency("yard", "~> 0.7.4")
         | 
| 129 129 | 
             
              s.add_development_dependency("bluecloth", "~> 2.2.0")
         | 
| 130 130 | 
             
              s.add_development_dependency("wlang", "~> 0.10.2")
         | 
| 131 | 
            -
              
         | 
| 131 | 
            +
              s.add_dependency("domain", "= 1.0.0.rc1")
         | 
| 132 132 |  | 
| 133 133 | 
             
              # The version of ruby required by this gem
         | 
| 134 134 | 
             
              #
         | 
    
        data/myrrha.noespec
    CHANGED
    
    | @@ -10,7 +10,7 @@ variables: | |
| 10 10 | 
             
              upper:
         | 
| 11 11 | 
             
                Myrrha
         | 
| 12 12 | 
             
              version:
         | 
| 13 | 
            -
                 | 
| 13 | 
            +
                3.0.0.rc1
         | 
| 14 14 | 
             
              summary: |-
         | 
| 15 15 | 
             
                Myrrha provides the coercion framework which is missing to Ruby.
         | 
| 16 16 | 
             
              description: |-
         | 
| @@ -26,11 +26,12 @@ variables: | |
| 26 26 | 
             
                - http://github.com/blambeau/myrrha
         | 
| 27 27 | 
             
                - http://rubygems.org/gems/myrrha
         | 
| 28 28 | 
             
              dependencies: 
         | 
| 29 | 
            -
                - {name:  | 
| 30 | 
            -
                - {name:  | 
| 31 | 
            -
                - {name:  | 
| 32 | 
            -
                - {name:  | 
| 33 | 
            -
                - {name:  | 
| 29 | 
            +
                - {name: domain,       version: "= 1.0.0.rc1", groups: [runtime]      }
         | 
| 30 | 
            +
                - {name: rake,         version: "~> 0.9.2",    groups: [test, release]}
         | 
| 31 | 
            +
                - {name: rspec,        version: "~> 2.8.0",    groups: [test, release]}
         | 
| 32 | 
            +
                - {name: yard,         version: "~> 0.7.4",    groups: [doc          ]}
         | 
| 33 | 
            +
                - {name: bluecloth,    version: "~> 2.2.0",    groups: [doc          ]}
         | 
| 34 | 
            +
                - {name: wlang,        version: "~> 0.10.2",   groups: [release      ]}
         | 
| 34 35 | 
             
              rake_tasks:
         | 
| 35 36 | 
             
                debug_mail:
         | 
| 36 37 | 
             
                  rx_changelog_sections: /^# /
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            describe Domain, "coerce" do
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              let(:domain){ Domain.scalar(:x, :y) }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              before do
         | 
| 7 | 
            +
                domain.coercions do |c|
         | 
| 8 | 
            +
                  c.coercion(String){|v,_| domain.new(1,2) }
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              it 'should delegate to coercions' do
         | 
| 13 | 
            +
                domain.coerce("blah").should eq(domain.new(1,2))
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            describe Domain, "coercions" do
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              let(:domain){ Domain.scalar(:x, :y) }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              context 'without a block' do
         | 
| 7 | 
            +
                subject{ domain.coercions }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                it{ should be_a(Myrrha::Coercions) }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                it 'should have the main target domain defined' do
         | 
| 12 | 
            +
                  subject.main_target_domain.should eq(domain)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              context 'with a block' do
         | 
| 17 | 
            +
                subject{ domain.coercions{|c| @seen=c} }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                it 'should yield the coercions' do
         | 
| 20 | 
            +
                  subject
         | 
| 21 | 
            +
                  @seen.should eq(subject)
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            end
         | 
| @@ -2,7 +2,7 @@ require 'spec_helper' | |
| 2 2 | 
             
            describe "Myrrha.coercions" do
         | 
| 3 3 |  | 
| 4 4 | 
             
              it "should support using user-defined domains" do
         | 
| 5 | 
            -
                name =  | 
| 5 | 
            +
                name = Domain.sbyc{|s| s.is_a?(Symbol)}
         | 
| 6 6 | 
             
                rules = Myrrha.coercions do |r|
         | 
| 7 7 | 
             
                  r.coercion String, name, lambda{|s,t| s.to_sym}
         | 
| 8 8 | 
             
                  r.coercion name, String, lambda{|s,t| s.to_s}
         | 
    
        metadata
    CHANGED
    
    | @@ -1,15 +1,15 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: myrrha
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version:  | 
| 5 | 
            -
              prerelease: 
         | 
| 4 | 
            +
              version: 3.0.0.rc1
         | 
| 5 | 
            +
              prerelease: 6
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| 8 8 | 
             
            - Bernard Lambeau
         | 
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012-09- | 
| 12 | 
            +
            date: 2012-09-27 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rake
         | 
| @@ -91,6 +91,22 @@ dependencies: | |
| 91 91 | 
             
                - - ~>
         | 
| 92 92 | 
             
                  - !ruby/object:Gem::Version
         | 
| 93 93 | 
             
                    version: 0.10.2
         | 
| 94 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 95 | 
            +
              name: domain
         | 
| 96 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 97 | 
            +
                none: false
         | 
| 98 | 
            +
                requirements:
         | 
| 99 | 
            +
                - - '='
         | 
| 100 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 101 | 
            +
                    version: 1.0.0.rc1
         | 
| 102 | 
            +
              type: :runtime
         | 
| 103 | 
            +
              prerelease: false
         | 
| 104 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 105 | 
            +
                none: false
         | 
| 106 | 
            +
                requirements:
         | 
| 107 | 
            +
                - - '='
         | 
| 108 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 109 | 
            +
                    version: 1.0.0.rc1
         | 
| 94 110 | 
             
            description: ! "Myrrha provides the coercion framework which is missing to Ruby. Coercions\nare
         | 
| 95 111 | 
             
              simply defined as a set of rules for converting values from source to target\ndomains
         | 
| 96 112 | 
             
              (in an abstract sense). As a typical and useful example, it comes with \na coerce()
         | 
| @@ -122,12 +138,8 @@ files: | |
| 122 138 | 
             
            - examples/to_ruby_literal_noext.rb
         | 
| 123 139 | 
             
            - lib/myrrha/coerce.rb
         | 
| 124 140 | 
             
            - lib/myrrha/coercions.rb
         | 
| 125 | 
            -
            - lib/myrrha/domain/coercion_methods.rb
         | 
| 126 | 
            -
            - lib/myrrha/domain/impl.rb
         | 
| 127 | 
            -
            - lib/myrrha/domain/sbyc.rb
         | 
| 128 | 
            -
            - lib/myrrha/domain/value_methods.rb
         | 
| 129 | 
            -
            - lib/myrrha/domain.rb
         | 
| 130 141 | 
             
            - lib/myrrha/errors.rb
         | 
| 142 | 
            +
            - lib/myrrha/ext/domain.rb
         | 
| 131 143 | 
             
            - lib/myrrha/loader.rb
         | 
| 132 144 | 
             
            - lib/myrrha/to_ruby_literal.rb
         | 
| 133 145 | 
             
            - lib/myrrha/version.rb
         | 
| @@ -139,10 +151,8 @@ files: | |
| 139 151 | 
             
            - spec/coercions/test_delegate.rb
         | 
| 140 152 | 
             
            - spec/coercions/test_dup.rb
         | 
| 141 153 | 
             
            - spec/coercions/test_subdomain.rb
         | 
| 142 | 
            -
            - spec/domain/ | 
| 143 | 
            -
            - spec/domain/ | 
| 144 | 
            -
            - spec/domain/sbyc/test_behavior.rb
         | 
| 145 | 
            -
            - spec/domain/test_sbyc.rb
         | 
| 154 | 
            +
            - spec/ext/domain/test_coerce.rb
         | 
| 155 | 
            +
            - spec/ext/domain/test_coercions.rb
         | 
| 146 156 | 
             
            - spec/myrrha/test_coercions.rb
         | 
| 147 157 | 
             
            - spec/shared/a_value.rb
         | 
| 148 158 | 
             
            - spec/spec_helper.rb
         | 
| @@ -179,15 +189,12 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 179 189 | 
             
              - - ! '>='
         | 
| 180 190 | 
             
                - !ruby/object:Gem::Version
         | 
| 181 191 | 
             
                  version: '0'
         | 
| 182 | 
            -
                  segments:
         | 
| 183 | 
            -
                  - 0
         | 
| 184 | 
            -
                  hash: -1652815196407861424
         | 
| 185 192 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 186 193 | 
             
              none: false
         | 
| 187 194 | 
             
              requirements:
         | 
| 188 | 
            -
              - - ! ' | 
| 195 | 
            +
              - - ! '>'
         | 
| 189 196 | 
             
                - !ruby/object:Gem::Version
         | 
| 190 | 
            -
                  version:  | 
| 197 | 
            +
                  version: 1.3.1
         | 
| 191 198 | 
             
            requirements: []
         | 
| 192 199 | 
             
            rubyforge_project: 
         | 
| 193 200 | 
             
            rubygems_version: 1.8.24
         | 
| @@ -201,10 +208,8 @@ test_files: | |
| 201 208 | 
             
            - spec/coercions/test_delegate.rb
         | 
| 202 209 | 
             
            - spec/coercions/test_dup.rb
         | 
| 203 210 | 
             
            - spec/coercions/test_subdomain.rb
         | 
| 204 | 
            -
            - spec/domain/ | 
| 205 | 
            -
            - spec/domain/ | 
| 206 | 
            -
            - spec/domain/sbyc/test_behavior.rb
         | 
| 207 | 
            -
            - spec/domain/test_sbyc.rb
         | 
| 211 | 
            +
            - spec/ext/domain/test_coerce.rb
         | 
| 212 | 
            +
            - spec/ext/domain/test_coercions.rb
         | 
| 208 213 | 
             
            - spec/myrrha/test_coercions.rb
         | 
| 209 214 | 
             
            - spec/shared/a_value.rb
         | 
| 210 215 | 
             
            - spec/spec_helper.rb
         | 
| @@ -1,17 +0,0 @@ | |
| 1 | 
            -
            module Myrrha
         | 
| 2 | 
            -
              module Domain
         | 
| 3 | 
            -
                module CoercionMethods
         | 
| 4 | 
            -
             | 
| 5 | 
            -
                  def coercions(&bl)
         | 
| 6 | 
            -
                    @coercions ||= Coercions.new{|c| c.main_target_domain = self}
         | 
| 7 | 
            -
                    @coercions.append(&bl) if bl
         | 
| 8 | 
            -
                    @coercions
         | 
| 9 | 
            -
                  end
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                  def coerce(arg)
         | 
| 12 | 
            -
                    coercions.coerce(arg, self)
         | 
| 13 | 
            -
                  end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                end # module CoercionMethods
         | 
| 16 | 
            -
              end # module Domain
         | 
| 17 | 
            -
            end # module Myrrha
         | 
    
        data/lib/myrrha/domain/impl.rb
    DELETED
    
    | @@ -1,50 +0,0 @@ | |
| 1 | 
            -
            module Myrrha
         | 
| 2 | 
            -
              module Domain
         | 
| 3 | 
            -
                class Impl < Module
         | 
| 4 | 
            -
             | 
| 5 | 
            -
                  def initialize(component_names)
         | 
| 6 | 
            -
                    @component_names = component_names.freeze
         | 
| 7 | 
            -
                    define_initialize
         | 
| 8 | 
            -
                    define_component_readers
         | 
| 9 | 
            -
                    include_value_methods
         | 
| 10 | 
            -
                  end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                  def included(clazz)
         | 
| 13 | 
            -
                    define_component_names_on(clazz)
         | 
| 14 | 
            -
                    define_coercion_methods_on(clazz)
         | 
| 15 | 
            -
                    super
         | 
| 16 | 
            -
                  end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                private
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  def define_initialize
         | 
| 21 | 
            -
                    component_names = @component_names
         | 
| 22 | 
            -
                    define_method(:initialize){|*args|
         | 
| 23 | 
            -
                      component_names.zip(args).each do |n,arg|
         | 
| 24 | 
            -
                        instance_variable_set(:"@#{n}", arg)
         | 
| 25 | 
            -
                      end
         | 
| 26 | 
            -
                    }
         | 
| 27 | 
            -
                  end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                  def define_component_readers
         | 
| 30 | 
            -
                    @component_names.each do |n|
         | 
| 31 | 
            -
                      define_method(n){ instance_variable_get(:"@#{n}") }
         | 
| 32 | 
            -
                    end
         | 
| 33 | 
            -
                  end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                  def include_value_methods
         | 
| 36 | 
            -
                    module_eval{ include ValueMethods }
         | 
| 37 | 
            -
                  end
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                  def define_component_names_on(clazz)
         | 
| 40 | 
            -
                    component_names = @component_names
         | 
| 41 | 
            -
                    clazz.define_singleton_method(:component_names){ component_names }
         | 
| 42 | 
            -
                  end
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                  def define_coercion_methods_on(clazz)
         | 
| 45 | 
            -
                    clazz.extend(CoercionMethods)
         | 
| 46 | 
            -
                  end
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                end # class Impl
         | 
| 49 | 
            -
              end # module Domain
         | 
| 50 | 
            -
            end # module Myrrha
         | 
    
        data/lib/myrrha/domain/sbyc.rb
    DELETED
    
    | @@ -1,78 +0,0 @@ | |
| 1 | 
            -
            module Myrrha
         | 
| 2 | 
            -
              module Domain
         | 
| 3 | 
            -
                class SByC < Module
         | 
| 4 | 
            -
             | 
| 5 | 
            -
                  def initialize(super_domain, sub_domains, predicate)
         | 
| 6 | 
            -
                    @super_domain = super_domain
         | 
| 7 | 
            -
                    @sub_domains = sub_domains
         | 
| 8 | 
            -
                    @predicate = predicate
         | 
| 9 | 
            -
                    define
         | 
| 10 | 
            -
                  end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                private
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  def define
         | 
| 15 | 
            -
                    define_super_domain_method
         | 
| 16 | 
            -
                    define_sub_domains_method
         | 
| 17 | 
            -
                    define_predicate_method
         | 
| 18 | 
            -
                    include_type_methods
         | 
| 19 | 
            -
                    include_coercion_methods
         | 
| 20 | 
            -
                  end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                  def define_super_domain_method
         | 
| 23 | 
            -
                    super_domain = @super_domain
         | 
| 24 | 
            -
                    define_method(:super_domain){ super_domain }
         | 
| 25 | 
            -
                  end
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                  def define_sub_domains_method
         | 
| 28 | 
            -
                    sub_domains = @sub_domains
         | 
| 29 | 
            -
                    define_method(:sub_domains){ sub_domains }
         | 
| 30 | 
            -
                  end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                  def define_predicate_method
         | 
| 33 | 
            -
                    predicate = @predicate
         | 
| 34 | 
            -
                    define_method(:predicate){ predicate }
         | 
| 35 | 
            -
                  end
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                  def include_type_methods
         | 
| 38 | 
            -
                    module_eval{ include TypeMethods }
         | 
| 39 | 
            -
                  end
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                  def include_coercion_methods
         | 
| 42 | 
            -
                    module_eval{ include CoercionMethods }
         | 
| 43 | 
            -
                  end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                  module TypeMethods
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                    # Creates a new instance of this domain
         | 
| 48 | 
            -
                    def new(*args)
         | 
| 49 | 
            -
                      if (args.size == 1) && (superclass===args.first)
         | 
| 50 | 
            -
                        raise ArgumentError, "Invalid value #{args.join(' ')} for #{self}" unless self===args.first
         | 
| 51 | 
            -
                        args.first
         | 
| 52 | 
            -
                      elsif superclass.respond_to?(:new)
         | 
| 53 | 
            -
                        new(super(*args))
         | 
| 54 | 
            -
                      else
         | 
| 55 | 
            -
                        raise ArgumentError, "Invalid value #{args.join(' ')} for #{self}"
         | 
| 56 | 
            -
                      end
         | 
| 57 | 
            -
                    end
         | 
| 58 | 
            -
             | 
| 59 | 
            -
                    # (see Class.superclass)
         | 
| 60 | 
            -
                    def superclass
         | 
| 61 | 
            -
                      super_domain || super
         | 
| 62 | 
            -
                    end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                    # Returns true if clazz if an explicit sub domain of self or if it's the case in Ruby.
         | 
| 65 | 
            -
                    def superdomain_of?(child)
         | 
| 66 | 
            -
                      sub_domains.include?(child)
         | 
| 67 | 
            -
                    end
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                    # Checks if `value` belongs to this domain
         | 
| 70 | 
            -
                    def ===(value)
         | 
| 71 | 
            -
                      (superclass === value) && predicate.call(value)
         | 
| 72 | 
            -
                    end
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                  end # module TypeMethods
         | 
| 75 | 
            -
             | 
| 76 | 
            -
                end # module SByC
         | 
| 77 | 
            -
              end # module Domain
         | 
| 78 | 
            -
            end # module Myrrha
         | 
| @@ -1,60 +0,0 @@ | |
| 1 | 
            -
            module Myrrha
         | 
| 2 | 
            -
              module Domain
         | 
| 3 | 
            -
                module ValueMethods
         | 
| 4 | 
            -
             | 
| 5 | 
            -
                  # Parts of this module have been extracted from Virtus, MIT Copyright (c) 2011-2012
         | 
| 6 | 
            -
                  # Piotr Solnica.
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                  # Returns a hash code for the value
         | 
| 9 | 
            -
                  #
         | 
| 10 | 
            -
                  # @return Integer
         | 
| 11 | 
            -
                  #
         | 
| 12 | 
            -
                  # @api public
         | 
| 13 | 
            -
                  def hash
         | 
| 14 | 
            -
                    component_names.map{|key| send(key).hash }.reduce(self.class.hash, :^)
         | 
| 15 | 
            -
                  end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                  # Compare the object with other object for equality
         | 
| 18 | 
            -
                  #
         | 
| 19 | 
            -
                  # @example
         | 
| 20 | 
            -
                  #   object.eql?(other)  # => true or false
         | 
| 21 | 
            -
                  #
         | 
| 22 | 
            -
                  # @param [Object] other
         | 
| 23 | 
            -
                  #   the other object to compare with
         | 
| 24 | 
            -
                  #
         | 
| 25 | 
            -
                  # @return [Boolean]
         | 
| 26 | 
            -
                  #
         | 
| 27 | 
            -
                  # @api public
         | 
| 28 | 
            -
                  def eql?(other)
         | 
| 29 | 
            -
                    instance_of?(other.class) and cmp?(__method__, other)
         | 
| 30 | 
            -
                  end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                  # Compare the object with other object for equivalency
         | 
| 33 | 
            -
                  #
         | 
| 34 | 
            -
                  # @example
         | 
| 35 | 
            -
                  #   object == other  # => true or false
         | 
| 36 | 
            -
                  #
         | 
| 37 | 
            -
                  # @param [Object] other
         | 
| 38 | 
            -
                  #   the other object to compare with
         | 
| 39 | 
            -
                  #
         | 
| 40 | 
            -
                  # @return [Boolean]
         | 
| 41 | 
            -
                  #
         | 
| 42 | 
            -
                  # @api public
         | 
| 43 | 
            -
                  def ==(other)
         | 
| 44 | 
            -
                    return false unless self.class <=> other.class
         | 
| 45 | 
            -
                    cmp?(__method__, other)
         | 
| 46 | 
            -
                  end
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                private
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                  def cmp?(comparator, other)
         | 
| 51 | 
            -
                    component_names.all?{|key| send(key).send(comparator, other.send(key)) }
         | 
| 52 | 
            -
                  end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                  def component_names
         | 
| 55 | 
            -
                    self.class.component_names
         | 
| 56 | 
            -
                  end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                end # module ValueMethods
         | 
| 59 | 
            -
              end # module Domain
         | 
| 60 | 
            -
            end # module Myrrha
         | 
    
        data/lib/myrrha/domain.rb
    DELETED
    
    | @@ -1,18 +0,0 @@ | |
| 1 | 
            -
            module Myrrha
         | 
| 2 | 
            -
              module Domain
         | 
| 3 | 
            -
             | 
| 4 | 
            -
                # Creates a domain instance by specialization by constraint
         | 
| 5 | 
            -
                #
         | 
| 6 | 
            -
                # @param [Class] superdom the superdomain of the created domain
         | 
| 7 | 
            -
                # @param [Proc] pred the domain predicate
         | 
| 8 | 
            -
                # @return [Class] the created domain
         | 
| 9 | 
            -
                def self.sbyc(superdom = Object, subdoms = [], &pred)
         | 
| 10 | 
            -
                  Class.new(superdom).extend SByC.new(superdom, subdoms, pred)
         | 
| 11 | 
            -
                end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
              end # module Domain
         | 
| 14 | 
            -
            end # module Myrrha
         | 
| 15 | 
            -
            require_relative 'domain/value_methods'
         | 
| 16 | 
            -
            require_relative 'domain/coercion_methods'
         | 
| 17 | 
            -
            require_relative 'domain/impl'
         | 
| 18 | 
            -
            require_relative 'domain/sbyc'
         | 
| @@ -1,41 +0,0 @@ | |
| 1 | 
            -
            require 'spec_helper'
         | 
| 2 | 
            -
            module Myrrha
         | 
| 3 | 
            -
              describe Domain, 'when included' do
         | 
| 4 | 
            -
             | 
| 5 | 
            -
                let(:point){
         | 
| 6 | 
            -
                  Class.new{
         | 
| 7 | 
            -
                    include Myrrha::Domain::Impl.new([:r, :theta])
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                    coercions do |c|
         | 
| 10 | 
            -
                      c.upon(NilClass)     {|v,t| new(0.0,0.0)                   }
         | 
| 11 | 
            -
                      c.coercion(String)   {|v,t| new(*v.split(',').map(&:to_f)) }
         | 
| 12 | 
            -
                      c.coercion(TrueClass){|v,t| throw :nextrule                }
         | 
| 13 | 
            -
                      c.fallback(TrueClass){|v,t| new(1.0, 1.0)                  }
         | 
| 14 | 
            -
                    end
         | 
| 15 | 
            -
                  }
         | 
| 16 | 
            -
                }
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                let(:origin){ point.new(0.0, 0.0) }
         | 
| 19 | 
            -
                let(:oneone){ point.new(1.0, 1.0) }
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                it 'installs the domain component names' do
         | 
| 22 | 
            -
                  point.component_names.should eq([:r, :theta])
         | 
| 23 | 
            -
                end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                it 'installs the component readers' do
         | 
| 26 | 
            -
                  origin.r.should eq(0.0)
         | 
| 27 | 
            -
                  origin.theta.should eq(0.0)
         | 
| 28 | 
            -
                end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                it 'has coercions properly installed' do
         | 
| 31 | 
            -
                  point.coercions.main_target_domain.should eq(point)
         | 
| 32 | 
            -
                end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                it 'supports expected coercions' do
         | 
| 35 | 
            -
                  point.coerce(nil).should eq(origin)
         | 
| 36 | 
            -
                  point.coerce(true).should eq(oneone)
         | 
| 37 | 
            -
                  point.coerce("2.0,3.0").should eq(point.new(2.0, 3.0))
         | 
| 38 | 
            -
                end
         | 
| 39 | 
            -
             | 
| 40 | 
            -
              end
         | 
| 41 | 
            -
            end
         | 
| @@ -1,101 +0,0 @@ | |
| 1 | 
            -
            require 'spec_helper'
         | 
| 2 | 
            -
            module Myrrha
         | 
| 3 | 
            -
              module Domain
         | 
| 4 | 
            -
                class Impl
         | 
| 5 | 
            -
                  describe ValueMethods do
         | 
| 6 | 
            -
             | 
| 7 | 
            -
                    let(:domain){
         | 
| 8 | 
            -
                      Class.new{
         | 
| 9 | 
            -
                        def self.component_names
         | 
| 10 | 
            -
                          [:a, :b]
         | 
| 11 | 
            -
                        end
         | 
| 12 | 
            -
                        include ValueMethods
         | 
| 13 | 
            -
                        attr_reader :a, :b
         | 
| 14 | 
            -
                        def initialize(a, b)
         | 
| 15 | 
            -
                          @a, @b = a, b
         | 
| 16 | 
            -
                        end
         | 
| 17 | 
            -
                      }
         | 
| 18 | 
            -
                    }
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                    let(:object){ domain.new(1, 2) }
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                    describe "==" do
         | 
| 23 | 
            -
                      subject{ object == other }
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                      context 'with itself' do
         | 
| 26 | 
            -
                        let(:other){ object }
         | 
| 27 | 
            -
                        it{ should be_true }
         | 
| 28 | 
            -
                      end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                      context 'with dupped' do
         | 
| 31 | 
            -
                        let(:other){ object.dup }
         | 
| 32 | 
            -
                        it{ should be_true }
         | 
| 33 | 
            -
                      end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                      context 'with equivalent' do
         | 
| 36 | 
            -
                        let(:other){ domain.new(1, 2) }
         | 
| 37 | 
            -
                        it{ should be_true }
         | 
| 38 | 
            -
                      end
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                      context 'with equivalent of a subclass' do
         | 
| 41 | 
            -
                        let(:other){ Class.new(domain).new(1, 2) }
         | 
| 42 | 
            -
                        it{ should be_true }
         | 
| 43 | 
            -
                      end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                      context 'with non equivalent' do
         | 
| 46 | 
            -
                        let(:other){ domain.new(1, 3) }
         | 
| 47 | 
            -
                        it{ should be_false }
         | 
| 48 | 
            -
                      end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                      context 'with other class' do
         | 
| 51 | 
            -
                        let(:other){ self }
         | 
| 52 | 
            -
                        it{ should be_false }
         | 
| 53 | 
            -
                      end
         | 
| 54 | 
            -
                    end
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                    describe "eql?" do
         | 
| 57 | 
            -
                      subject{ object.eql?(other) }
         | 
| 58 | 
            -
             | 
| 59 | 
            -
                      context 'with itself' do
         | 
| 60 | 
            -
                        let(:other){ object }
         | 
| 61 | 
            -
                        it{ should be_true }
         | 
| 62 | 
            -
                      end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                      context 'with dupped' do
         | 
| 65 | 
            -
                        let(:other){ object.dup }
         | 
| 66 | 
            -
                        it{ should be_true }
         | 
| 67 | 
            -
                      end
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                      context 'with equivalent' do
         | 
| 70 | 
            -
                        let(:other){ domain.new(1, 2) }
         | 
| 71 | 
            -
                        it{ should be_true }
         | 
| 72 | 
            -
                      end
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                      context 'with equivalent of a subclass' do
         | 
| 75 | 
            -
                        let(:other){ Class.new(domain).new(1, 2) }
         | 
| 76 | 
            -
                        it{ should be_false }
         | 
| 77 | 
            -
                      end
         | 
| 78 | 
            -
             | 
| 79 | 
            -
                      context 'with non equivalent' do
         | 
| 80 | 
            -
                        let(:other){ domain.new(1, 3) }
         | 
| 81 | 
            -
                        it{ should be_false }
         | 
| 82 | 
            -
                      end
         | 
| 83 | 
            -
             | 
| 84 | 
            -
                      context 'with other class' do
         | 
| 85 | 
            -
                        let(:other){ self }
         | 
| 86 | 
            -
                        it{ should be_false }
         | 
| 87 | 
            -
                      end
         | 
| 88 | 
            -
                    end
         | 
| 89 | 
            -
             | 
| 90 | 
            -
                    describe "hash" do
         | 
| 91 | 
            -
                      subject{ object.hash }
         | 
| 92 | 
            -
             | 
| 93 | 
            -
                      it 'should be consistent with equal' do
         | 
| 94 | 
            -
                        subject.should eq(domain.new(1,2).hash)
         | 
| 95 | 
            -
                      end
         | 
| 96 | 
            -
                    end
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                  end
         | 
| 99 | 
            -
                end
         | 
| 100 | 
            -
              end
         | 
| 101 | 
            -
            end
         | 
| @@ -1,46 +0,0 @@ | |
| 1 | 
            -
            require 'spec_helper'
         | 
| 2 | 
            -
            module Myrrha
         | 
| 3 | 
            -
              module Domain
         | 
| 4 | 
            -
                describe SByC, 'when used by extension' do
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                  class NegInt < Integer
         | 
| 7 | 
            -
                    extend Myrrha::Domain::SByC.new(Integer, [], lambda{|i| i<0})
         | 
| 8 | 
            -
                  end
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                  specify("#name") {
         | 
| 11 | 
            -
                    NegInt.name.should eq("Myrrha::Domain::NegInt")
         | 
| 12 | 
            -
                  }
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  specify("#new") {
         | 
| 15 | 
            -
                    NegInt.new(-12).should eq(-12)
         | 
| 16 | 
            -
                    lambda {
         | 
| 17 | 
            -
                      NegInt.new(12)
         | 
| 18 | 
            -
                    }.should raise_error(ArgumentError)
         | 
| 19 | 
            -
                  }
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                  specify("#superclass"){
         | 
| 22 | 
            -
                    NegInt.superclass.should eql(Integer)
         | 
| 23 | 
            -
                  }
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                  specify("#superdomain_of?"){
         | 
| 26 | 
            -
                    NegInt.superdomain_of?(Object).should be_false
         | 
| 27 | 
            -
                    NegInt.superdomain_of?(Integer).should be_false
         | 
| 28 | 
            -
                  }
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                  specify("#coercions"){
         | 
| 31 | 
            -
                    NegInt.coercions.should be_a(Myrrha::Coercions)
         | 
| 32 | 
            -
                    NegInt.coercions.main_target_domain.should eq(NegInt)
         | 
| 33 | 
            -
                  }
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                  it "should be usable in a case" do
         | 
| 36 | 
            -
                    [-12, 12].map{|i|
         | 
| 37 | 
            -
                      case i
         | 
| 38 | 
            -
                      when NegInt  then :negint
         | 
| 39 | 
            -
                      when Integer then :integer
         | 
| 40 | 
            -
                      end
         | 
| 41 | 
            -
                    }.should eq([:negint, :integer])
         | 
| 42 | 
            -
                  end
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                end
         | 
| 45 | 
            -
              end
         | 
| 46 | 
            -
            end
         | 
    
        data/spec/domain/test_sbyc.rb
    DELETED
    
    | @@ -1,81 +0,0 @@ | |
| 1 | 
            -
            require 'spec_helper'
         | 
| 2 | 
            -
            module Myrrha
         | 
| 3 | 
            -
              module Domain
         | 
| 4 | 
            -
                describe ".sbyc" do
         | 
| 5 | 
            -
                
         | 
| 6 | 
            -
                  specify "the basic contract" do
         | 
| 7 | 
            -
                    subject = Myrrha::Domain.sbyc{|s| s == 12}
         | 
| 8 | 
            -
                    subject.should be_a(Class) 
         | 
| 9 | 
            -
                    subject.superclass.should eq(Object)
         | 
| 10 | 
            -
                    (subject === 12).should be_true
         | 
| 11 | 
            -
                    (subject === 13).should be_false
         | 
| 12 | 
            -
                  end
         | 
| 13 | 
            -
                
         | 
| 14 | 
            -
                  specify "with a ruby superclass" do
         | 
| 15 | 
            -
                    subject = Myrrha::Domain.sbyc(Integer){|i| i > 0}
         | 
| 16 | 
            -
                    subject.should be_a(Class) 
         | 
| 17 | 
            -
                    subject.superclass.should eq(Integer)
         | 
| 18 | 
            -
                    (subject === 12).should be_true
         | 
| 19 | 
            -
                    (subject === 0).should be_false
         | 
| 20 | 
            -
                  end
         | 
| 21 | 
            -
                
         | 
| 22 | 
            -
                  describe "A factored sub domain of Integer" do
         | 
| 23 | 
            -
                    PosInt = Myrrha::Domain.sbyc(Integer){|i| i > 0}
         | 
| 24 | 
            -
                    specify("#name") {
         | 
| 25 | 
            -
                      PosInt.name.should eq("Myrrha::Domain::PosInt")
         | 
| 26 | 
            -
                    }
         | 
| 27 | 
            -
                    specify("#new") {
         | 
| 28 | 
            -
                      PosInt.new(12).should eq(12)
         | 
| 29 | 
            -
                      lambda {
         | 
| 30 | 
            -
                        PosInt.new(0)
         | 
| 31 | 
            -
                      }.should raise_error(ArgumentError)
         | 
| 32 | 
            -
                    }
         | 
| 33 | 
            -
                    specify("#superclass"){
         | 
| 34 | 
            -
                      PosInt.superclass.should eql(Integer)
         | 
| 35 | 
            -
                    }
         | 
| 36 | 
            -
                    specify("#superdomain_of?"){
         | 
| 37 | 
            -
                      PosInt.superdomain_of?(Object).should be_false
         | 
| 38 | 
            -
                      PosInt.superdomain_of?(Integer).should be_false
         | 
| 39 | 
            -
                    }
         | 
| 40 | 
            -
                    it "should be usable in a case" do
         | 
| 41 | 
            -
                      [-12, 12].collect{|i|
         | 
| 42 | 
            -
                        case i
         | 
| 43 | 
            -
                        when PosInt
         | 
| 44 | 
            -
                          :posint
         | 
| 45 | 
            -
                        when Integer
         | 
| 46 | 
            -
                          :integer
         | 
| 47 | 
            -
                        end
         | 
| 48 | 
            -
                      }.should eq([:integer, :posint])
         | 
| 49 | 
            -
                    end
         | 
| 50 | 
            -
                  end
         | 
| 51 | 
            -
                  
         | 
| 52 | 
            -
                  describe "A factored sub domain of a user-defined Class" do
         | 
| 53 | 
            -
                    class Color
         | 
| 54 | 
            -
                      attr_reader :r
         | 
| 55 | 
            -
                      attr_reader :g
         | 
| 56 | 
            -
                      attr_reader :b
         | 
| 57 | 
            -
                      def initialize(r,g,b)
         | 
| 58 | 
            -
                        raise ArgumentError unless [r,g,b].all?{|i| i.is_a?(Integer)}
         | 
| 59 | 
            -
                        @r, @g, @b = r, g, b
         | 
| 60 | 
            -
                      end
         | 
| 61 | 
            -
                    end
         | 
| 62 | 
            -
                    RedToZero = Myrrha::Domain.sbyc(Color){|c| c.r == 0}
         | 
| 63 | 
            -
                    specify("#===") {
         | 
| 64 | 
            -
                      (RedToZero === Color.new(0,1,1)).should be_true
         | 
| 65 | 
            -
                      (RedToZero === Color.new(1,1,1)).should be_false
         | 
| 66 | 
            -
                    }
         | 
| 67 | 
            -
                    specify("#new") {
         | 
| 68 | 
            -
                      RedToZero.new(Color.new(0,1,1)).should be_a(Color)
         | 
| 69 | 
            -
                      RedToZero.new(0, 1, 1).should be_a(Color)
         | 
| 70 | 
            -
                      lambda{
         | 
| 71 | 
            -
                        RedToZero.new(Color.new(1,1,1))
         | 
| 72 | 
            -
                      }.should raise_error(ArgumentError)
         | 
| 73 | 
            -
                      lambda{
         | 
| 74 | 
            -
                        RedToZero.new(1, 1, 1)
         | 
| 75 | 
            -
                      }.should raise_error(ArgumentError)
         | 
| 76 | 
            -
                    }
         | 
| 77 | 
            -
                  end
         | 
| 78 | 
            -
             | 
| 79 | 
            -
                end
         | 
| 80 | 
            -
              end
         | 
| 81 | 
            -
            end
         |