ruby_ext 0.4.25 → 0.5.1
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/Rakefile +2 -0
- data/lib/rake_ext/project.rb +19 -19
- data/lib/rake_ext.rb +18 -18
- data/lib/rspec_ext/xhtml.rb +6 -6
- data/lib/rspec_ext.rb +40 -25
- data/lib/ruby_ext/core/array.rb +7 -7
- data/lib/ruby_ext/core/basic_object.rb +1 -1
- data/lib/ruby_ext/core/deep_clone.rb +2 -2
- data/lib/ruby_ext/core/enumerable.rb +1 -1
- data/lib/ruby_ext/core/hash.rb +4 -4
- data/lib/ruby_ext/core/module.rb +20 -30
- data/lib/ruby_ext/core/multiple_inheritance.rb +24 -24
- data/lib/ruby_ext/core/must.rb +39 -39
- data/lib/ruby_ext/core/object.rb +15 -3
- data/lib/ruby_ext/core/open_object.rb +22 -20
- data/lib/ruby_ext/core/string.rb +19 -19
- data/lib/ruby_ext/core/symbol.rb +1 -13
- data/lib/ruby_ext/core.rb +4 -8
- data/lib/ruby_ext/more/callbacks.rb +172 -0
- data/lib/ruby_ext/more/declarative_cache.rb +20 -22
- data/lib/ruby_ext/more/miscellaneous.rb +1 -46
- data/lib/ruby_ext/more/{observable2.rb → observable.rb} +8 -8
- data/lib/ruby_ext/more/open_constructor.rb +10 -10
- data/lib/ruby_ext/more/tuple.rb +1 -1
- data/lib/ruby_ext/more.rb +5 -3
- data/lib/ruby_ext.rb +0 -3
- data/lib/yaml_fix.rb +2 -2
- data/readme.md +51 -50
- data/spec/core/deep_clone_spec.rb +8 -8
- data/spec/core/module_spec.rb +29 -36
- data/spec/core/multiple_inheritance_spec.rb +32 -32
- data/spec/core/must_spec.rb +6 -6
- data/spec/core/object_spec.rb +15 -0
- data/spec/core/open_object_spec.rb +6 -6
- data/spec/more/callbacks_spec.rb +155 -0
- data/spec/more/declarative_cache_spec.rb +33 -33
- data/spec/more/{observable2_spec.rb → observable_spec.rb} +7 -7
- data/spec/more/open_constructor_spec.rb +5 -5
- metadata +7 -15
- data/lib/ruby_ext/core/class.rb +0 -0
- data/lib/ruby_ext/core/file.rb +0 -23
- data/lib/ruby_ext/core/kernel.rb +0 -69
- data/lib/ruby_ext/core/miscellaneous.rb +0 -14
- data/lib/ruby_ext/more/synchronize.rb +0 -26
- data/spec/core/kernel_spec/TheNamespace/ClassA.rb +0 -7
- data/spec/core/kernel_spec/another_class.rb +0 -5
- data/spec/core/kernel_spec/the_namespace/class_b.rb +0 -11
- data/spec/core/kernel_spec.rb +0 -51
- data/spec/more/miscellaneous_spec.rb +0 -14
- data/spec/more/synchronize_spec.rb +0 -79
data/Rakefile
CHANGED
data/lib/rake_ext/project.rb
CHANGED
@@ -4,24 +4,24 @@ require 'psych'
|
|
4
4
|
YAML::ENGINE.yamler = 'syck'
|
5
5
|
|
6
6
|
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# Helper for releasing gem, add following code to Your Rakefile:
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# project(
|
11
11
|
# name: "fake_gem",
|
12
12
|
# gem: true,
|
13
13
|
# summary: "Makes any directory looks like Ruby Gem",
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# bin: 'bin',
|
16
16
|
# executables: ['fake_gem'],
|
17
17
|
# dirs: %w(bin),
|
18
|
-
#
|
18
|
+
#
|
19
19
|
# author: "Alexey Petrushin",
|
20
20
|
# homepage: "http://github.com/alexeypetrushin/fake_gem"
|
21
21
|
# )
|
22
|
-
#
|
22
|
+
#
|
23
23
|
# use "rake gem" to release gem
|
24
|
-
#
|
24
|
+
#
|
25
25
|
|
26
26
|
require 'rubygems/specification'
|
27
27
|
|
@@ -35,7 +35,7 @@ class GemHelper
|
|
35
35
|
end
|
36
36
|
return '0.0.1'
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
def parse_project_gemfile
|
40
40
|
required_gems, required_fake_gems = [], []
|
41
41
|
gem_file = "#{project_dir}/lib/#{project[:name]}/gems.rb"
|
@@ -54,7 +54,7 @@ class GemHelper
|
|
54
54
|
|
55
55
|
return required_gems, required_fake_gems
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
def gemspec
|
59
59
|
Gem::Specification.new do |s|
|
60
60
|
gems, fake_gems = parse_project_gemfile
|
@@ -73,15 +73,15 @@ class GemHelper
|
|
73
73
|
s.has_rdoc = options.delete(:has_rdoc) == nil ? false : true
|
74
74
|
s.require_path = options.delete(:lib) || "lib"
|
75
75
|
s.files = options.delete(:files) || (
|
76
|
-
%w{Rakefile readme.md} +
|
77
|
-
Dir.glob("{lib,spec}/**/*") +
|
76
|
+
%w{Rakefile readme.md} +
|
77
|
+
Dir.glob("{lib,spec}/**/*") +
|
78
78
|
((options[:dirs] && Array(options.delete(:dirs)).collect{|d| Dir["#{d}/**/*"]}) || [])
|
79
79
|
)
|
80
80
|
s.bindir = options.delete(:bin) if options.include? :bin
|
81
81
|
|
82
82
|
s.version = options.delete(:version) || GemHelper.next_version(name)
|
83
83
|
|
84
|
-
options.each{|k, v| s.send "#{k}=", v}
|
84
|
+
options.each{|k, v| s.send "#{k}=", v}
|
85
85
|
end
|
86
86
|
end
|
87
87
|
end
|
@@ -99,7 +99,7 @@ namespace :gem do
|
|
99
99
|
%x(gem build #{gemspec_file})
|
100
100
|
|
101
101
|
puts ' pushing'
|
102
|
-
gem_file = Dir.glob("#{gemspec.name}*.gem").first
|
102
|
+
gem_file = Dir.glob("#{gemspec.name}*.gem").first
|
103
103
|
%x"gem push #{gem_file}"
|
104
104
|
|
105
105
|
puts ' cleaning'
|
@@ -107,26 +107,26 @@ namespace :gem do
|
|
107
107
|
|
108
108
|
puts " #{gemspec.name} #{gemspec.version} successfully released"
|
109
109
|
end
|
110
|
-
|
110
|
+
|
111
111
|
desc "Install gem required by project"
|
112
112
|
task :install do
|
113
|
-
gems, fake_gems = parse_project_gemfile
|
113
|
+
gems, fake_gems = GemHelper.parse_project_gemfile
|
114
114
|
gems.each do |name, version|
|
115
115
|
puts "Installing gem #{name} #{version}"
|
116
116
|
%x(gem install #{name}#{" -v #{version}" if version}) # --ignore-dependencies)
|
117
117
|
end
|
118
|
-
end
|
119
|
-
|
118
|
+
end
|
119
|
+
|
120
120
|
desc "List all gems required by project"
|
121
121
|
task :list do
|
122
122
|
puts "Gems required for #{project[:official_name]}:"
|
123
|
-
gems, fake_gems = parse_project_gemfile
|
123
|
+
gems, fake_gems = GemHelper.parse_project_gemfile
|
124
124
|
puts(gems + fake_gems)
|
125
125
|
end
|
126
|
-
|
126
|
+
|
127
127
|
desc "Install all gem required by project (including fake gems)"
|
128
128
|
task :install_all do
|
129
|
-
gems, fake_gems = parse_project_gemfile
|
129
|
+
gems, fake_gems = GemHelper.parse_project_gemfile
|
130
130
|
(gems + fake_gems).each do |name, version|
|
131
131
|
puts "Installing gem #{name} #{version}"
|
132
132
|
%x(gem install #{name} #{"-v #{version}" if version})
|
data/lib/rake_ext.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'fileutils'
|
3
3
|
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# Code Coverage
|
6
|
-
#
|
6
|
+
#
|
7
7
|
# begin
|
8
8
|
# require 'class_loader/tasks'
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# desc "Clean code coverage temporary files"
|
11
11
|
# task clean: 'class_loader:clean' do
|
12
12
|
# require 'fileutils'
|
13
13
|
# FileUtils.rm_r '../*/coverage' if File.exist? '../*/coverage'
|
14
|
-
# end
|
14
|
+
# end
|
15
15
|
# rescue LoadError
|
16
16
|
# end
|
17
17
|
|
18
|
-
#
|
18
|
+
#
|
19
19
|
# Spec
|
20
|
-
#
|
20
|
+
#
|
21
21
|
begin
|
22
22
|
require 'rspec/core/rake_task'
|
23
23
|
task default: :spec
|
@@ -25,8 +25,8 @@ begin
|
|
25
25
|
RSpec::Core::RakeTask.new('spec') do |t|
|
26
26
|
t.pattern = "spec/**/[^_]*_spec.rb"
|
27
27
|
end
|
28
|
-
|
29
|
-
namespace :spec do
|
28
|
+
|
29
|
+
namespace :spec do
|
30
30
|
desc "Run RSpec code exapmples in isolated mode (every spec file in another Ruby process)"
|
31
31
|
task :isolated do
|
32
32
|
Dir.glob("spec/[^_]**/[^_]*_spec.rb").each do |spec_file|
|
@@ -40,17 +40,17 @@ rescue LoadError
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
#
|
43
|
+
#
|
44
44
|
# before, after and remove task
|
45
|
-
#
|
45
|
+
#
|
46
46
|
def before task_name, &block
|
47
47
|
$_task_counter ||= {}
|
48
48
|
counter = ($_task_counter[task_name] ||= 0)
|
49
49
|
before_task_name = "#{task_name}_before_#{counter}"
|
50
|
-
|
50
|
+
|
51
51
|
task before_task_name, &block
|
52
52
|
task task_name => before_task_name
|
53
|
-
|
53
|
+
|
54
54
|
$_task_counter[task_name] += 1
|
55
55
|
end
|
56
56
|
|
@@ -64,25 +64,25 @@ end
|
|
64
64
|
alias :delete_task :remove_task
|
65
65
|
|
66
66
|
|
67
|
-
#
|
67
|
+
#
|
68
68
|
# project
|
69
|
-
#
|
69
|
+
#
|
70
70
|
$_project_dir = (
|
71
|
-
caller.find{|line| line =~ /\/Rakefile\:/} ||
|
71
|
+
caller.find{|line| line =~ /\/Rakefile\:/} ||
|
72
72
|
raise("You can include the 'rake_ext' only in Rakefile!")
|
73
73
|
).sub(/\/Rakefile\:.*/, '')
|
74
74
|
def project_dir
|
75
75
|
$_project_dir
|
76
76
|
end
|
77
77
|
|
78
|
-
def project options = nil
|
78
|
+
def project options = nil
|
79
79
|
if options
|
80
80
|
$_project = {}
|
81
81
|
options.each{|k, v| $_project[k.to_sym] = v}
|
82
|
-
|
82
|
+
|
83
83
|
$_project[:name] || raise("project name not defined")
|
84
84
|
$_project[:official_name] ||= $_project[:name]
|
85
|
-
|
85
|
+
|
86
86
|
require 'rake_ext/project'
|
87
87
|
end
|
88
88
|
$_project || raise("project not defined!")
|
data/lib/rspec_ext/xhtml.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
#
|
1
|
+
#
|
2
2
|
# FuzzyHash, to_fuzzy_hash, to_html
|
3
|
-
#
|
3
|
+
#
|
4
4
|
begin
|
5
5
|
require 'nokogiri'
|
6
|
-
|
6
|
+
|
7
7
|
class RSpec::FuzzyHash < Hash
|
8
8
|
def == o
|
9
9
|
return true if super
|
@@ -18,7 +18,7 @@ begin
|
|
18
18
|
false
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
::Nokogiri::XML::Node.class_eval do
|
23
23
|
def to_fuzzy_hash
|
24
24
|
h = RSpec::FuzzyHash.new
|
@@ -27,9 +27,9 @@ begin
|
|
27
27
|
h
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
class String
|
32
|
-
def to_xhtml css = nil
|
32
|
+
def to_xhtml css = nil
|
33
33
|
require 'nokogiri'
|
34
34
|
|
35
35
|
node = Nokogiri::HTML(self)
|
data/lib/rspec_ext.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
#
|
1
|
+
#
|
2
2
|
# Code Coverage
|
3
|
-
#
|
3
|
+
#
|
4
4
|
# require 'simplecov'
|
5
5
|
# SimpleCov.start do
|
6
6
|
# add_filter "/spec/"
|
@@ -9,13 +9,13 @@
|
|
9
9
|
# SimpleCov.result.format!
|
10
10
|
# Kernel.exec 'open ./coverage/index.html'
|
11
11
|
# end
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# CLASS_LOADER_GENERATE_TMP_FILES = true
|
14
14
|
|
15
15
|
|
16
|
-
#
|
16
|
+
#
|
17
17
|
# RSpec
|
18
|
-
#
|
18
|
+
#
|
19
19
|
require 'rspec'
|
20
20
|
require 'fileutils'
|
21
21
|
|
@@ -44,7 +44,7 @@ rspec do
|
|
44
44
|
before(:all){paths.each{|path| $LOAD_PATH << path}}
|
45
45
|
after(:all){paths.each{|path| $LOAD_PATH.delete path}}
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def with_load_path *paths, &b
|
49
49
|
begin
|
50
50
|
paths.each{|path| $LOAD_PATH << path}
|
@@ -53,73 +53,88 @@ rspec do
|
|
53
53
|
paths.each{|path| $LOAD_PATH.delete path}
|
54
54
|
end
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
def self.with_tmp_spec_dir *args
|
58
58
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
59
59
|
dir = args.first || self.spec_dir
|
60
|
-
|
60
|
+
|
61
61
|
options[:before] ||= :all
|
62
62
|
tmp_dir = "/tmp/#{dir.split('/').last}"
|
63
|
-
|
63
|
+
|
64
64
|
before options do
|
65
65
|
FileUtils.rm_r tmp_dir if File.exist? tmp_dir
|
66
66
|
FileUtils.cp_r dir, tmp_dir
|
67
67
|
@spec_dir = tmp_dir
|
68
68
|
end
|
69
|
-
|
70
|
-
after options do
|
69
|
+
|
70
|
+
after options do
|
71
71
|
FileUtils.rm_r tmp_dir if File.exist? tmp_dir
|
72
72
|
@spec_dir = nil
|
73
|
-
end
|
74
|
-
|
73
|
+
end
|
74
|
+
|
75
75
|
tmp_dir
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
def self.with_spec_dir dir
|
79
79
|
before(:all){@spec_dir = dir}
|
80
80
|
after(:all){@spec_dir = nil}
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
# def self.with_spec_dir
|
84
|
-
|
84
|
+
|
85
85
|
# def self.spec_dir dir = nil
|
86
86
|
# @spec_dir ||= calculate_spec_dir_for_current_caller
|
87
87
|
# end
|
88
|
-
|
88
|
+
|
89
89
|
def self.spec_dir
|
90
90
|
self.calculate_default_spec_dir || raise(":spec_dir not defined!")
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
def spec_dir
|
94
94
|
@spec_dir || self.class.spec_dir
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
def self.calculate_default_spec_dir
|
98
98
|
spec_file_name = caller.find{|line| line =~ /_spec\.rb\:/}
|
99
|
-
return nil unless spec_file_name
|
99
|
+
return nil unless spec_file_name
|
100
100
|
spec_dir = spec_file_name.sub(/\.rb\:.*/, '')
|
101
101
|
raise "spec dir not exist (#{spec_dir})!" unless File.exist? spec_dir
|
102
102
|
spec_dir
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
def remove_constants *args
|
106
106
|
args = args.first if args.size == 1 and args.first.is_a?(Array)
|
107
|
-
args.each{|c| Object.send :remove_const, c if Object.const_defined? c}
|
107
|
+
args.each{|c| Object.send :remove_const, c if Object.const_defined? c}
|
108
108
|
end
|
109
|
-
|
109
|
+
|
110
110
|
# def spec_tmp_dir
|
111
111
|
# $spec_tmp_dir || raise("you should call :with_tmp_spec_dir to be able to use :spec_tmp_dir!")
|
112
112
|
# end
|
113
113
|
end
|
114
114
|
|
115
115
|
|
116
|
-
#
|
116
|
+
#
|
117
117
|
# dirname, parent_dirname
|
118
|
-
#
|
118
|
+
#
|
119
119
|
class String
|
120
120
|
unless method_defined? :dirname
|
121
121
|
def dirname
|
122
122
|
File.expand_path(File.dirname(self))
|
123
123
|
end
|
124
124
|
end
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
#
|
129
|
+
# instance_stub
|
130
|
+
#
|
131
|
+
class Class
|
132
|
+
def instance_stub! &block
|
133
|
+
new_method = method(:new)
|
134
|
+
stub!(:new).and_return do |*args|
|
135
|
+
instance = new_method.call(*args)
|
136
|
+
block.call instance
|
137
|
+
instance
|
138
|
+
end
|
139
|
+
end
|
125
140
|
end
|
data/lib/ruby_ext/core/array.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
class Array
|
1
|
+
class Array
|
2
2
|
def sfilter *filters
|
3
3
|
filters = filters.first if filters.size == 1 and filters.first.is_a?(Array)
|
4
4
|
filters.collect!{|o| o.is_a?(Regexp) ? o : /#{Regexp.escape o}/}
|
@@ -6,19 +6,19 @@ class Array
|
|
6
6
|
!filters.any?{|re| line =~ re}
|
7
7
|
end
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def self.wrap value
|
11
11
|
Array(value)
|
12
|
-
end
|
13
|
-
|
12
|
+
end
|
13
|
+
|
14
14
|
alias_method :blank?, :empty?
|
15
|
-
|
15
|
+
|
16
16
|
alias_method :filter, :select
|
17
|
-
|
17
|
+
|
18
18
|
def extract_options
|
19
19
|
last.is_a?(Hash) ? last : {}
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def extract_options!
|
23
23
|
last.is_a?(Hash) ? pop : {}
|
24
24
|
end
|
data/lib/ruby_ext/core/hash.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Hash
|
2
2
|
def subset *keys, &block
|
3
3
|
keys = keys.first if keys.first.is_a? Array
|
4
|
-
h = {}
|
4
|
+
h = {}
|
5
5
|
if keys
|
6
6
|
self.each do |k, v|
|
7
7
|
h[k] = v if keys.include? k
|
@@ -13,12 +13,12 @@ class Hash
|
|
13
13
|
end
|
14
14
|
h
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def validate_options! *valid_options
|
18
18
|
unknown_options = keys - valid_options
|
19
19
|
raise "unknown options :#{unknown_options.join(': ')}!" unless unknown_options.empty?
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
alias_method :blank?, :empty?
|
23
|
-
alias_method :to_h, :to_hash
|
23
|
+
alias_method :to_h, :to_hash
|
24
24
|
end
|
data/lib/ruby_ext/core/module.rb
CHANGED
@@ -10,19 +10,11 @@ Module.class_eval do
|
|
10
10
|
@alias ||= self.name.split('::').last
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def is?(base)
|
15
15
|
ancestors.include?(base)
|
16
16
|
end
|
17
|
-
|
18
|
-
def wrap_method( sym, prefix = "old_", &blk )
|
19
|
-
old_method = "#{prefix}_#{sym}".to_sym
|
20
|
-
alias_method old_method, sym
|
21
|
-
define_method(sym) do |*args|
|
22
|
-
instance_exec(old_method, *args, &blk)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
17
|
+
|
26
18
|
def namespace
|
27
19
|
if @module_namespace_defined
|
28
20
|
@module_namespace
|
@@ -31,7 +23,7 @@ Module.class_eval do
|
|
31
23
|
@module_namespace = Module.namespace_for name
|
32
24
|
end
|
33
25
|
end
|
34
|
-
|
26
|
+
|
35
27
|
def each_namespace &block
|
36
28
|
current = namespace
|
37
29
|
while current do
|
@@ -39,7 +31,7 @@ Module.class_eval do
|
|
39
31
|
current = current.namespace
|
40
32
|
end
|
41
33
|
end
|
42
|
-
|
34
|
+
|
43
35
|
def each_ancestor include_standard = false, &block
|
44
36
|
if include_standard
|
45
37
|
ancestors.each{|a| block.call a unless a == self}
|
@@ -50,7 +42,7 @@ Module.class_eval do
|
|
50
42
|
end
|
51
43
|
end
|
52
44
|
end
|
53
|
-
|
45
|
+
|
54
46
|
def self_ancestors_and_namespaces &b
|
55
47
|
b.call self
|
56
48
|
each_ancestor &b
|
@@ -58,7 +50,7 @@ Module.class_eval do
|
|
58
50
|
end
|
59
51
|
|
60
52
|
# TODO cache it?
|
61
|
-
def self.namespace_for class_name
|
53
|
+
def self.namespace_for class_name
|
62
54
|
list = class_name.split("::")
|
63
55
|
if list.size > 1
|
64
56
|
list.pop
|
@@ -67,21 +59,20 @@ Module.class_eval do
|
|
67
59
|
return nil
|
68
60
|
end
|
69
61
|
end
|
70
|
-
|
62
|
+
|
71
63
|
def inheritable_accessor attribute_name, default_value
|
72
64
|
raise "Can be used only for Class and Module" unless self.class.is? Module
|
73
|
-
|
74
|
-
|
65
|
+
|
75
66
|
iv_name = "@#{attribute_name}"
|
76
67
|
iv_defined = "@#{attribute_name}_defined"
|
77
|
-
|
68
|
+
|
78
69
|
define_method attribute_name do
|
79
70
|
unless instance_variable_get(iv_defined)
|
80
71
|
iv = nil
|
81
72
|
ancestors[1..-1].each do |a|
|
82
73
|
if a.respond_to?(attribute_name) and (value = a.send(attribute_name))
|
83
74
|
iv = value.deep_clone
|
84
|
-
break
|
75
|
+
break
|
85
76
|
end
|
86
77
|
end
|
87
78
|
iv ||= default_value.deep_clone
|
@@ -90,17 +81,16 @@ Module.class_eval do
|
|
90
81
|
iv
|
91
82
|
else
|
92
83
|
instance_variable_get iv_name
|
93
|
-
end
|
84
|
+
end
|
94
85
|
end
|
95
|
-
|
86
|
+
|
96
87
|
define_method "#{attribute_name}=" do |value|
|
97
|
-
# raise "Value can't be nil!" unless value
|
98
88
|
instance_variable_set iv_name, value
|
99
89
|
instance_variable_set iv_defined, true
|
100
90
|
end
|
101
91
|
end
|
102
|
-
|
103
|
-
raise "Internal error, it shouldn't be loaded twice!" if defined? ESCAPE_METHOD_SYMBOLS # some tricky error when runing spec with rake
|
92
|
+
|
93
|
+
raise "Internal error, it shouldn't be loaded twice!" if defined? ESCAPE_METHOD_SYMBOLS # some tricky error when runing spec with rake
|
104
94
|
ESCAPE_METHOD_SYMBOLS = [
|
105
95
|
['==', 'assign'],
|
106
96
|
['>', 'gt'],
|
@@ -117,24 +107,24 @@ Module.class_eval do
|
|
117
107
|
['**', 'pw'],
|
118
108
|
['=~', 'sim'],
|
119
109
|
['[]', 'sb'],
|
120
|
-
]
|
121
|
-
|
110
|
+
]
|
111
|
+
|
122
112
|
def escape_method method
|
123
113
|
m = method.to_s.clone
|
124
114
|
ESCAPE_METHOD_SYMBOLS.each{|from, to| m.gsub! from, to}
|
125
115
|
raise "Invalid method name '#{method}'!" unless m =~ /^[_a-zA-Z0-9]+$/
|
126
116
|
m.to_sym
|
127
117
|
end
|
128
|
-
|
118
|
+
|
129
119
|
def attr_required *attrs
|
130
120
|
attrs.each do |attr|
|
131
121
|
define_method(attr){instance_variable_get(:"@#{attr}") || raise("attribute :#{attr} not defined!")}
|
132
122
|
end
|
133
123
|
end
|
134
|
-
|
124
|
+
|
135
125
|
public :include, :define_method
|
136
|
-
|
137
|
-
|
126
|
+
|
127
|
+
|
138
128
|
# copied from rails
|
139
129
|
def delegate(*methods)
|
140
130
|
options = methods.pop
|