moosex 0.0.1 → 0.0.2
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 +9 -0
- data/Gemfile.lock +1 -1
- data/README.md +41 -7
- data/lib/moosex.rb +44 -13
- data/lib/moosex/version.rb +1 -1
- data/spec/moosex_spec.rb +67 -2
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 853ceb9084c1f328f72ef7a1c8c5ccfac1047afd
|
4
|
+
data.tar.gz: 4577ed6c0db01b29bc735e7e1dfcdf9ffdffb001
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61ae609b6b0c19053e78941b50991e5f88255a4bcf713d443fa48cb171ddbdd4710ea8e592e673eadd163730b97e41be4f79b9bed6bb85b5e651041074b1109c
|
7
|
+
data.tar.gz: 57c88e944b04b96657f6f7cc07fbc7f5001fc81b33a6584025efc57dba08b16448f019d74c50689e13e05440d501fc67b6eebd303141cfeaa1cc9b8dd036b8ba
|
data/Changelog
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
0.0.2 - 2014-01-31
|
2
|
+
- fix one important bug, not it is possible use in more than one class
|
3
|
+
- add require option
|
4
|
+
- supports :ro, :rw, :rwp ( read-only, read-write and read-write-private) options
|
5
|
+
- supports default value as lambda or constant
|
6
|
+
- supports isa as class/module name or lambda
|
7
|
+
|
8
|
+
0.0.1 - 2014-01-31
|
9
|
+
- first release
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,27 +1,61 @@
|
|
1
|
-
#
|
1
|
+
# MooseX
|
2
2
|
|
3
3
|
A postmodern object system for Ruby
|
4
4
|
|
5
|
+
```ruby
|
6
|
+
require 'moosex'
|
7
|
+
|
5
8
|
class Point
|
6
9
|
include MooseX
|
7
10
|
|
8
11
|
has :x , {
|
9
|
-
:is => :rw,
|
10
|
-
:isa => Integer,
|
11
|
-
:default => 0,
|
12
|
+
:is => :rw, # read-write
|
13
|
+
:isa => Integer, # should be Integer
|
14
|
+
:default => 0, # default value is 0 (constant)
|
12
15
|
}
|
13
16
|
|
14
17
|
has :y , {
|
15
18
|
:is => :rw,
|
16
19
|
:isa => Integer,
|
17
|
-
:default => lambda { 0 },
|
20
|
+
:default => lambda { 0 }, # you should specify a lambda
|
18
21
|
}
|
19
22
|
|
20
23
|
def clear
|
21
|
-
self.x= 0
|
22
|
-
self.y= 0
|
24
|
+
self.x= 0 # to run with type-check you must
|
25
|
+
self.y= 0 # use the setter instad @x=
|
23
26
|
end
|
24
27
|
end
|
28
|
+
|
29
|
+
class Foo
|
30
|
+
include MooseX
|
31
|
+
|
32
|
+
has :bar, {
|
33
|
+
:is => :rwp, # read-write-private (private setter)
|
34
|
+
:isa => Integer,
|
35
|
+
:required => true # you should require in the constructor
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
class Baz
|
40
|
+
include MooseX
|
41
|
+
|
42
|
+
has :bam, {
|
43
|
+
:is => :ro,
|
44
|
+
:isa => lambda {|x| # you should add your own validator
|
45
|
+
raise 'x should be less than 100' if x > 100
|
46
|
+
},
|
47
|
+
:required => true
|
48
|
+
}
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
# now you have a generic constructor
|
53
|
+
p1 = Point.new # x and y will be 0
|
54
|
+
p2 = Point.new( :x => 5 ) # y will be 0
|
55
|
+
p3 = Point.new( :x => 5, :y => 4)
|
56
|
+
foo = Foo.new( :bar => 123 ) # without bar will raise exception
|
57
|
+
baz = Baz.new( :bam => 99 ) # if bam > 100 will raise exception
|
58
|
+
```
|
25
59
|
|
26
60
|
## Installation
|
27
61
|
|
data/lib/moosex.rb
CHANGED
@@ -11,11 +11,15 @@ module MooseX
|
|
11
11
|
|
12
12
|
o.extend(MooseX::Core)
|
13
13
|
|
14
|
-
o.class_exec
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
o.class_exec do
|
15
|
+
meta = MooseX::Meta.new()
|
16
|
+
|
17
|
+
#class_variable_set "@@meta".to_sym, meta
|
18
|
+
|
19
|
+
define_singleton_method :__meta do
|
20
|
+
meta
|
21
|
+
# class_variable_get "@@meta".to_sym
|
22
|
+
end
|
19
23
|
end
|
20
24
|
|
21
25
|
def initialize(args={})
|
@@ -30,14 +34,25 @@ module MooseX
|
|
30
34
|
|
31
35
|
def has(attr_name, attr_options)
|
32
36
|
attr = MooseX::Attribute.new(attr_name, attr_options)
|
37
|
+
|
33
38
|
g = attr.generate_getter
|
34
39
|
|
35
|
-
|
36
|
-
|
37
|
-
s = attr.generate_setter
|
40
|
+
define_method attr_name, &g
|
38
41
|
|
39
|
-
|
42
|
+
s = attr.generate_setter
|
43
|
+
|
44
|
+
if attr_options[:is].eql? :rw
|
40
45
|
|
46
|
+
define_method "#{attr_name}=", &s
|
47
|
+
|
48
|
+
elsif attr_options[:is].eql? :rwp
|
49
|
+
|
50
|
+
define_method "#{attr_name}=", &s
|
51
|
+
|
52
|
+
private "#{attr_name}="
|
53
|
+
|
54
|
+
end
|
55
|
+
|
41
56
|
__meta.add(attr)
|
42
57
|
end
|
43
58
|
|
@@ -57,12 +72,25 @@ module MooseX
|
|
57
72
|
if args.has_key? @attr_symbol
|
58
73
|
value = args[ @attr_symbol ]
|
59
74
|
elsif @options[:required]
|
60
|
-
raise "
|
75
|
+
raise "attr \"#{@attr_symbol}\" is required"
|
61
76
|
else
|
62
77
|
value = (@options[:default].is_a? Proc) ? @options[:default].call : @options[:default]
|
63
78
|
end
|
64
79
|
|
65
|
-
|
80
|
+
if @options[:is].eql? :ro
|
81
|
+
|
82
|
+
# TODO: remove redundancy
|
83
|
+
|
84
|
+
inst_variable_name = "@#{@attr_symbol}".to_sym
|
85
|
+
type_check = generate_type_check
|
86
|
+
type_check.call(value)
|
87
|
+
object.instance_variable_set inst_variable_name, value
|
88
|
+
|
89
|
+
else
|
90
|
+
|
91
|
+
object.send( setter, value )
|
92
|
+
|
93
|
+
end
|
66
94
|
end
|
67
95
|
|
68
96
|
def generate_getter
|
@@ -81,9 +109,12 @@ module MooseX
|
|
81
109
|
|
82
110
|
def generate_type_check
|
83
111
|
if @options.has_key? :isa
|
84
|
-
|
112
|
+
isa = @options[:isa]
|
113
|
+
|
114
|
+
return isa if isa.is_a? Proc
|
115
|
+
|
85
116
|
return lambda do |new_value|
|
86
|
-
raise "isa check for \"#{@attr_symbol}\" failed: lol is not #{
|
117
|
+
raise "isa check for \"#{@attr_symbol}\" failed: lol is not #{isa}!" unless new_value.is_a? isa
|
87
118
|
end
|
88
119
|
end
|
89
120
|
|
data/lib/moosex/version.rb
CHANGED
data/spec/moosex_spec.rb
CHANGED
@@ -22,7 +22,28 @@ class Point
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
class Foo
|
26
|
+
include MooseX
|
27
|
+
|
28
|
+
has :bar, {
|
29
|
+
:is => :rwp,
|
30
|
+
:isa => Integer,
|
31
|
+
:required => true
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
class Baz
|
36
|
+
include MooseX
|
37
|
+
|
38
|
+
has :bam, {
|
39
|
+
:is => :ro,
|
40
|
+
:isa => lambda {|x| raise 'x should be less than 100' if x > 100},
|
41
|
+
:required => true
|
42
|
+
}
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "MooseX" do
|
26
47
|
describe "should has an intelligent constructor" do
|
27
48
|
it "without arguments, should initialize with default values" do
|
28
49
|
p = Point.new
|
@@ -41,6 +62,42 @@ describe "Point" do
|
|
41
62
|
p.x.should == 5
|
42
63
|
p.y.should == 4
|
43
64
|
end
|
65
|
+
|
66
|
+
it "should require bar if necessary" do
|
67
|
+
expect {
|
68
|
+
Foo.new
|
69
|
+
}.to raise_error("attr \"bar\" is required")
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should require bar if necessary" do
|
73
|
+
foo = Foo.new( :bar => 123 )
|
74
|
+
foo.bar.should == 123
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should not be possible update bar (setter private)" do
|
78
|
+
foo = Foo.new( :bar => 123 )
|
79
|
+
expect {
|
80
|
+
foo.bar = 1024
|
81
|
+
}.to raise_error(NoMethodError)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should require bam if necessary" do
|
85
|
+
baz = Baz.new( :bam => 99 )
|
86
|
+
baz.bam.should == 99
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should not be possible update baz (read only)" do
|
90
|
+
baz = Baz.new( :bam => 99 )
|
91
|
+
expect {
|
92
|
+
baz.bam = 1024
|
93
|
+
}.to raise_error(NoMethodError)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should run the lambda isa" do
|
97
|
+
expect {
|
98
|
+
baz = Baz.new( :bam => 199 )
|
99
|
+
}.to raise_error(/x should be less than 100/)
|
100
|
+
end
|
44
101
|
end
|
45
102
|
|
46
103
|
describe "should create a getter and a setter" do
|
@@ -52,9 +109,17 @@ describe "Point" do
|
|
52
109
|
|
53
110
|
it "for x, with type check" do
|
54
111
|
p = Point.new
|
55
|
-
expect {
|
112
|
+
expect {
|
113
|
+
p.x = "lol"
|
114
|
+
}.to raise_error('isa check for "x" failed: lol is not Integer!')
|
56
115
|
end
|
57
116
|
|
117
|
+
it "for x, with type check" do
|
118
|
+
expect {
|
119
|
+
Point.new(:x => "lol")
|
120
|
+
}.to raise_error('isa check for "x" failed: lol is not Integer!')
|
121
|
+
end
|
122
|
+
|
58
123
|
it "clear should clean attributes" do
|
59
124
|
p = Point.new( :x => 5, :y => 4)
|
60
125
|
p.clear
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: moosex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tiago Peczenyj
|
@@ -63,6 +63,7 @@ extensions: []
|
|
63
63
|
extra_rdoc_files: []
|
64
64
|
files:
|
65
65
|
- .gitignore
|
66
|
+
- Changelog
|
66
67
|
- Gemfile
|
67
68
|
- Gemfile.lock
|
68
69
|
- LICENSE
|