myrrha 1.1.0 → 1.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.
- data/CHANGELOG.md +20 -0
- data/Gemfile +17 -1
- data/Gemfile.lock +0 -14
- data/README.md +13 -4
- data/lib/myrrha.rb +15 -8
- data/lib/myrrha/version.rb +1 -1
- data/myrrha.gemspec +2 -4
- data/myrrha.noespec +16 -13
- data/spec/myrrha/test_domain.rb +37 -0
- data/spec/spec_helper.rb +25 -26
- data/spec/test_to_ruby_literal.rb +1 -1
- data/spec/test_value.rb +2 -1
- data/tasks/debug_mail.rake +1 -1
- data/tasks/examples.rake +2 -1
- data/tasks/unit_test.rake +2 -2
- metadata +19 -44
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
# 1.2.0 / 2011-08-15
|
2
|
+
|
3
|
+
* Added the ability to created SByC domains through simple module extension:
|
4
|
+
|
5
|
+
NegInt = Myrrha.domain(Integer){|i| i < 0}
|
6
|
+
|
7
|
+
can also be built the following way:
|
8
|
+
|
9
|
+
class NegInt < Integer
|
10
|
+
extend Myrrha::Domain
|
11
|
+
|
12
|
+
def self.predicate
|
13
|
+
@predicate ||= lambda{|i| i < 0}
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
* Cleaned the development dependencies, travis-ci.org continuous integration,
|
19
|
+
and ruby.noe template.
|
20
|
+
|
1
21
|
# 1.1.0 / 2011-07-28
|
2
22
|
|
3
23
|
## Enhancements to coerce()
|
data/Gemfile
CHANGED
@@ -1,2 +1,18 @@
|
|
1
1
|
source 'http://rubygems.org'
|
2
|
-
|
2
|
+
|
3
|
+
group :test do
|
4
|
+
gem "rake", "~> 0.9.2"
|
5
|
+
gem "rspec", "~> 2.6.0"
|
6
|
+
end
|
7
|
+
|
8
|
+
group :release do
|
9
|
+
gem "rake", "~> 0.9.2"
|
10
|
+
gem "rspec", "~> 2.6.0"
|
11
|
+
gem "wlang", "~> 0.10.1"
|
12
|
+
end
|
13
|
+
|
14
|
+
group :doc do
|
15
|
+
gem "yard", "~> 0.7.2"
|
16
|
+
gem "bluecloth", "~> 2.1.0"
|
17
|
+
end
|
18
|
+
|
data/Gemfile.lock
CHANGED
@@ -1,19 +1,8 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
myrrha (1.1.0)
|
5
|
-
|
6
1
|
GEM
|
7
2
|
remote: http://rubygems.org/
|
8
3
|
specs:
|
9
4
|
bluecloth (2.1.0)
|
10
5
|
diff-lcs (1.1.2)
|
11
|
-
highline (1.6.2)
|
12
|
-
noe (1.3.0)
|
13
|
-
highline (~> 1.6.0)
|
14
|
-
quickl (~> 0.2.0)
|
15
|
-
wlang (~> 0.10.1)
|
16
|
-
quickl (0.2.2)
|
17
6
|
rake (0.9.2)
|
18
7
|
rspec (2.6.0)
|
19
8
|
rspec-core (~> 2.6.0)
|
@@ -32,9 +21,6 @@ PLATFORMS
|
|
32
21
|
|
33
22
|
DEPENDENCIES
|
34
23
|
bluecloth (~> 2.1.0)
|
35
|
-
bundler (~> 1.0)
|
36
|
-
myrrha!
|
37
|
-
noe (~> 1.3.0)
|
38
24
|
rake (~> 0.9.2)
|
39
25
|
rspec (~> 2.6.0)
|
40
26
|
wlang (~> 0.10.1)
|
data/README.md
CHANGED
@@ -17,7 +17,7 @@ a numeric, a boolean, a date, a time, an URI, and so on.
|
|
17
17
|
# Bug fixes (tiny) do not even add new default rules to coerce and
|
18
18
|
# to\_ruby\_literal. Minor version can, which could break your code.
|
19
19
|
# Therefore, please always use:
|
20
|
-
gem "myrrha", "~> 1.
|
20
|
+
gem "myrrha", "~> 1.1.0"
|
21
21
|
|
22
22
|
## Links
|
23
23
|
|
@@ -456,6 +456,15 @@ reasoning on types and value:
|
|
456
456
|
# and correctly fails in each case!
|
457
457
|
rules.coerce("-12", Integer) # => -12
|
458
458
|
rules.coerce("-12", PosInt) # => ArgumentError, "Invalid value -12 for PosInt"
|
459
|
-
|
460
|
-
|
461
|
-
|
459
|
+
|
460
|
+
Note that if you want to provide additional tooling to your factored domain,
|
461
|
+
the following way of creating them also works:
|
462
|
+
|
463
|
+
class PosInt < Integer
|
464
|
+
extend Myrrha::Domain
|
465
|
+
|
466
|
+
def self.predicate
|
467
|
+
@predicate ||= lambda{|i| i > 0}
|
468
|
+
end
|
469
|
+
|
470
|
+
end
|
data/lib/myrrha.rb
CHANGED
@@ -18,8 +18,8 @@ module Myrrha
|
|
18
18
|
def self.domain(superdom = Object, subdoms=nil, &pred)
|
19
19
|
dom = Class.new(superdom).extend(Domain)
|
20
20
|
dom.instance_eval {
|
21
|
-
@
|
22
|
-
@
|
21
|
+
@subdomains = subdoms
|
22
|
+
@superdomain = superdom
|
23
23
|
@predicate = pred
|
24
24
|
}
|
25
25
|
dom
|
@@ -66,14 +66,14 @@ module Myrrha
|
|
66
66
|
|
67
67
|
# (see Class.superclass)
|
68
68
|
def superclass
|
69
|
-
|
69
|
+
superdomain || super
|
70
70
|
end
|
71
71
|
|
72
72
|
#
|
73
|
-
#
|
74
|
-
#
|
75
|
-
def
|
76
|
-
|
73
|
+
# Returns the super domain if installed
|
74
|
+
#
|
75
|
+
def superdomain
|
76
|
+
@superdomain
|
77
77
|
end
|
78
78
|
|
79
79
|
#
|
@@ -81,7 +81,14 @@ module Myrrha
|
|
81
81
|
# case in Ruby.
|
82
82
|
#
|
83
83
|
def superdomain_of?(child)
|
84
|
-
Array(@
|
84
|
+
Array(@subdomains).include?(child)
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# Checks if `value` belongs to this domain
|
89
|
+
#
|
90
|
+
def ===(value)
|
91
|
+
(superclass === value) && predicate.call(value)
|
85
92
|
end
|
86
93
|
|
87
94
|
#
|
data/lib/myrrha/version.rb
CHANGED
data/myrrha.gemspec
CHANGED
@@ -21,13 +21,13 @@ Gem::Specification.new do |s|
|
|
21
21
|
# A short summary of this gem
|
22
22
|
#
|
23
23
|
# This is displayed in `gem list -d`.
|
24
|
-
s.summary = "Myrrha provides the coercion framework which is missing to Ruby
|
24
|
+
s.summary = "Myrrha provides the coercion framework which is missing to Ruby."
|
25
25
|
|
26
26
|
# A long description of this gem (required)
|
27
27
|
#
|
28
28
|
# The description should be more detailed than the summary. For example,
|
29
29
|
# you might wish to copy the entire README into the description.
|
30
|
-
s.description = "Myrrha provides the coercion framework which is missing to Ruby
|
30
|
+
s.description = "Myrrha provides the coercion framework which is missing to Ruby. Coercions\nare simply defined as a set of rules for converting values from source to target\ndomains (in an abstract sense). As a typical and useful example, it comes with \na coerce() method providing a unique entry point for converting a string to \na numeric, a boolean, a date, a time, an URI, and so on. "
|
31
31
|
|
32
32
|
# The URL of this gem home page (optional)
|
33
33
|
s.homepage = "http://rubydoc.info/github/blambeau/myrrha/master/frames"
|
@@ -124,12 +124,10 @@ Gem::Specification.new do |s|
|
|
124
124
|
# for each development dependency. These gems are required for developers
|
125
125
|
#
|
126
126
|
s.add_development_dependency("rake", "~> 0.9.2")
|
127
|
-
s.add_development_dependency("bundler", "~> 1.0")
|
128
127
|
s.add_development_dependency("rspec", "~> 2.6.0")
|
129
128
|
s.add_development_dependency("yard", "~> 0.7.2")
|
130
129
|
s.add_development_dependency("bluecloth", "~> 2.1.0")
|
131
130
|
s.add_development_dependency("wlang", "~> 0.10.1")
|
132
|
-
s.add_development_dependency("noe", "~> 1.3.0")
|
133
131
|
|
134
132
|
|
135
133
|
# The version of ruby required by this gem
|
data/myrrha.noespec
CHANGED
@@ -3,20 +3,23 @@
|
|
3
3
|
template-info:
|
4
4
|
name: "ruby"
|
5
5
|
version: 1.3.0
|
6
|
+
manifest:
|
7
|
+
tasks/debug_mail.txt:
|
8
|
+
safe-override: false
|
6
9
|
variables:
|
7
10
|
lower:
|
8
11
|
myrrha
|
9
12
|
upper:
|
10
13
|
Myrrha
|
11
14
|
version:
|
12
|
-
1.
|
15
|
+
1.2.0
|
13
16
|
summary: |-
|
14
|
-
Myrrha provides the coercion framework which is missing to Ruby
|
17
|
+
Myrrha provides the coercion framework which is missing to Ruby.
|
15
18
|
description: |-
|
16
|
-
Myrrha provides the coercion framework which is missing to Ruby
|
19
|
+
Myrrha provides the coercion framework which is missing to Ruby. Coercions
|
17
20
|
are simply defined as a set of rules for converting values from source to target
|
18
|
-
domains (in an abstract sense). As a typical and useful example, it comes
|
19
|
-
|
21
|
+
domains (in an abstract sense). As a typical and useful example, it comes with
|
22
|
+
a coerce() method providing a unique entry point for converting a string to
|
20
23
|
a numeric, a boolean, a date, a time, an URI, and so on.
|
21
24
|
authors:
|
22
25
|
- {name: Bernard Lambeau, email: blambeau@gmail.com}
|
@@ -25,13 +28,13 @@ variables:
|
|
25
28
|
- http://github.com/blambeau/myrrha
|
26
29
|
- http://rubygems.org/gems/myrrha
|
27
30
|
dependencies:
|
28
|
-
- {name: rake, version: "~> 0.9.2", groups: [
|
29
|
-
- {name:
|
30
|
-
- {name:
|
31
|
-
- {name:
|
32
|
-
- {name:
|
33
|
-
- {name: wlang, version: "~> 0.10.1", groups: [development]}
|
34
|
-
- {name: noe, version: "~> 1.3.0", groups: [development]}
|
31
|
+
- {name: rake, version: "~> 0.9.2", groups: [test, release]}
|
32
|
+
- {name: rspec, version: "~> 2.6.0", groups: [test, release]}
|
33
|
+
- {name: yard, version: "~> 0.7.2", groups: [doc ]}
|
34
|
+
- {name: bluecloth, version: "~> 2.1.0", groups: [doc ]}
|
35
|
+
- {name: wlang, version: "~> 0.10.1", groups: [release ]}
|
35
36
|
rake_tasks:
|
37
|
+
debug_mail:
|
38
|
+
rx_changelog_sections: /^# /
|
36
39
|
spec_test:
|
37
|
-
pattern: spec/**/test_*.rb
|
40
|
+
pattern: spec/**/test_*.rb
|
data/spec/myrrha/test_domain.rb
CHANGED
@@ -48,6 +48,43 @@ module Myrrha
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
+
describe "A factored domain by module inclusion" do
|
52
|
+
class NegInt < Integer
|
53
|
+
extend Myrrha::Domain
|
54
|
+
|
55
|
+
def self.predicate
|
56
|
+
@predicate ||= lambda{|i| i<0}
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
specify("#name") {
|
61
|
+
NegInt.name.should eq("Myrrha::NegInt")
|
62
|
+
}
|
63
|
+
specify("#new") {
|
64
|
+
NegInt.new(-12).should eq(-12)
|
65
|
+
lambda {
|
66
|
+
NegInt.new(12)
|
67
|
+
}.should raise_error(ArgumentError)
|
68
|
+
}
|
69
|
+
specify("#superclass"){
|
70
|
+
NegInt.superclass.should eql(Integer)
|
71
|
+
}
|
72
|
+
specify("#superdomain_of?"){
|
73
|
+
NegInt.superdomain_of?(Object).should be_false
|
74
|
+
NegInt.superdomain_of?(Integer).should be_false
|
75
|
+
}
|
76
|
+
it "should be usable in a case" do
|
77
|
+
[-12, 12].collect{|i|
|
78
|
+
case i
|
79
|
+
when NegInt
|
80
|
+
:negint
|
81
|
+
when Integer
|
82
|
+
:integer
|
83
|
+
end
|
84
|
+
}.should eq([:negint, :integer])
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
51
88
|
describe "A factored sub domain of a user-defined Class" do
|
52
89
|
class Color
|
53
90
|
attr_reader :r
|
data/spec/spec_helper.rb
CHANGED
@@ -5,29 +5,28 @@ require 'myrrha/to_ruby_literal'
|
|
5
5
|
require 'date'
|
6
6
|
require 'shared/a_value'
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
8
|
+
$SAFE_VALUES = {
|
9
|
+
NilClass => [ nil ],
|
10
|
+
TrueClass => [ true ],
|
11
|
+
FalseClass => [ false ],
|
12
|
+
Fixnum => [ -(2**(0.size * 8 - 2)), -1, 0, 1, 10, (2**(0.size * 8 - 2) - 1)],
|
13
|
+
Bignum => [ -(2**(0.size * 8 - 2)) - 1, (2**(0.size * 8 - 2)) ],
|
14
|
+
Float => [ -0.10, 0.0, 0.10 ],
|
15
|
+
String => ['', 'hello'],
|
16
|
+
Symbol => [ :hello, :"s-b-y-c", :"12" ],
|
17
|
+
Class => [ Integer, ::Struct::Tms ],
|
18
|
+
Module => [ Kernel, Myrrha ],
|
19
|
+
Regexp => [ /a-z/, /^$/, /\s*/, /[a-z]{15}/ ],
|
20
|
+
Range => [ 0..10, 0...10 ],
|
21
|
+
Array => [ [], [nil], [1, "hello"] ],
|
22
|
+
Hash => [ {}, {1 => 2, :hello => "world"} ]
|
23
|
+
}
|
24
|
+
$UNSAFE_VALUES = {
|
25
|
+
Date => [ Date.today ],
|
26
|
+
Time => [ Time.now ],
|
27
|
+
Array => [ [Date.today, Time.now] ],
|
28
|
+
Hash => [ {Date.today => Time.now} ],
|
29
|
+
Range => [ Date.today..(Date.today+1) ]
|
30
|
+
}
|
31
|
+
$VALUES = $SAFE_VALUES.values.inject([], :+) +
|
32
|
+
$UNSAFE_VALUES.values.inject([], :+)
|
data/spec/test_value.rb
CHANGED
data/tasks/debug_mail.rake
CHANGED
data/tasks/examples.rake
CHANGED
data/tasks/unit_test.rake
CHANGED
@@ -45,7 +45,7 @@ begin
|
|
45
45
|
t.warning = false
|
46
46
|
|
47
47
|
# Glob pattern to match test files. (default is 'test/test*.rb')
|
48
|
-
t.pattern = "test/
|
48
|
+
t.pattern = "test/test_*.rb"
|
49
49
|
|
50
50
|
# Style of test loader to use. Options are:
|
51
51
|
#
|
@@ -68,7 +68,7 @@ begin
|
|
68
68
|
end
|
69
69
|
rescue LoadError => ex
|
70
70
|
task :unit_test do
|
71
|
-
abort
|
71
|
+
abort "rake/testtask does not seem available...\n #{ex.message}"
|
72
72
|
end
|
73
73
|
ensure
|
74
74
|
desc "Run all tests"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: myrrha
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-08-15 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &85166390 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,21 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.9.2
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: bundler
|
27
|
-
requirement: &85575520 !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
|
-
requirements:
|
30
|
-
- - ~>
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '1.0'
|
33
|
-
type: :development
|
34
|
-
prerelease: false
|
35
|
-
version_requirements: *85575520
|
24
|
+
version_requirements: *85166390
|
36
25
|
- !ruby/object:Gem::Dependency
|
37
26
|
name: rspec
|
38
|
-
requirement: &
|
27
|
+
requirement: &85166110 !ruby/object:Gem::Requirement
|
39
28
|
none: false
|
40
29
|
requirements:
|
41
30
|
- - ~>
|
@@ -43,10 +32,10 @@ dependencies:
|
|
43
32
|
version: 2.6.0
|
44
33
|
type: :development
|
45
34
|
prerelease: false
|
46
|
-
version_requirements: *
|
35
|
+
version_requirements: *85166110
|
47
36
|
- !ruby/object:Gem::Dependency
|
48
37
|
name: yard
|
49
|
-
requirement: &
|
38
|
+
requirement: &85165560 !ruby/object:Gem::Requirement
|
50
39
|
none: false
|
51
40
|
requirements:
|
52
41
|
- - ~>
|
@@ -54,10 +43,10 @@ dependencies:
|
|
54
43
|
version: 0.7.2
|
55
44
|
type: :development
|
56
45
|
prerelease: false
|
57
|
-
version_requirements: *
|
46
|
+
version_requirements: *85165560
|
58
47
|
- !ruby/object:Gem::Dependency
|
59
48
|
name: bluecloth
|
60
|
-
requirement: &
|
49
|
+
requirement: &85165280 !ruby/object:Gem::Requirement
|
61
50
|
none: false
|
62
51
|
requirements:
|
63
52
|
- - ~>
|
@@ -65,10 +54,10 @@ dependencies:
|
|
65
54
|
version: 2.1.0
|
66
55
|
type: :development
|
67
56
|
prerelease: false
|
68
|
-
version_requirements: *
|
57
|
+
version_requirements: *85165280
|
69
58
|
- !ruby/object:Gem::Dependency
|
70
59
|
name: wlang
|
71
|
-
requirement: &
|
60
|
+
requirement: &85164980 !ruby/object:Gem::Requirement
|
72
61
|
none: false
|
73
62
|
requirements:
|
74
63
|
- - ~>
|
@@ -76,23 +65,12 @@ dependencies:
|
|
76
65
|
version: 0.10.1
|
77
66
|
type: :development
|
78
67
|
prerelease: false
|
79
|
-
version_requirements: *
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
- - ~>
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version: 1.3.0
|
88
|
-
type: :development
|
89
|
-
prerelease: false
|
90
|
-
version_requirements: *85550220
|
91
|
-
description: ! "Myrrha provides the coercion framework which is missing to Ruby, IMHO.
|
92
|
-
Coercions\nare simply defined as a set of rules for converting values from source
|
93
|
-
to target\ndomains (in an abstract sense). As a typical and useful example, it comes
|
94
|
-
bundled\nwith a coerce() method providing a unique entry point for converting a
|
95
|
-
string to \na numeric, a boolean, a date, a time, an URI, and so on. "
|
68
|
+
version_requirements: *85164980
|
69
|
+
description: ! "Myrrha provides the coercion framework which is missing to Ruby. Coercions\nare
|
70
|
+
simply defined as a set of rules for converting values from source to target\ndomains
|
71
|
+
(in an abstract sense). As a typical and useful example, it comes with \na coerce()
|
72
|
+
method providing a unique entry point for converting a string to \na numeric, a
|
73
|
+
boolean, a date, a time, an URI, and so on. "
|
96
74
|
email:
|
97
75
|
- blambeau@gmail.com
|
98
76
|
executables: []
|
@@ -167,22 +145,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
167
145
|
version: '0'
|
168
146
|
segments:
|
169
147
|
- 0
|
170
|
-
hash:
|
148
|
+
hash: 140841041
|
171
149
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
150
|
none: false
|
173
151
|
requirements:
|
174
152
|
- - ! '>='
|
175
153
|
- !ruby/object:Gem::Version
|
176
154
|
version: '0'
|
177
|
-
segments:
|
178
|
-
- 0
|
179
|
-
hash: -900430961
|
180
155
|
requirements: []
|
181
156
|
rubyforge_project:
|
182
157
|
rubygems_version: 1.8.6
|
183
158
|
signing_key:
|
184
159
|
specification_version: 3
|
185
|
-
summary: Myrrha provides the coercion framework which is missing to Ruby
|
160
|
+
summary: Myrrha provides the coercion framework which is missing to Ruby.
|
186
161
|
test_files:
|
187
162
|
- spec/spec_helper.rb
|
188
163
|
- spec/myrrha/test_coercions.rb
|