dsl_accessor 0.1.0 → 0.3.3

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/lib/dsl_accessor.rb CHANGED
@@ -1,52 +1,11 @@
1
- require 'active_support'
2
-
3
- class Class
4
- def dsl_accessor(name, options = {})
5
- raise TypeError, "DSL Error: options should be a hash. but got `#{options.class}'" unless options.is_a?(Hash)
6
- writer = options[:writer] || options[:setter]
7
- writer =
8
- case writer
9
- when NilClass then Proc.new{|value| value}
10
- when Symbol then Proc.new{|value| __send__(writer, value)}
11
- when Proc then writer
12
- else raise TypeError, "DSL Error: writer should be a symbol or proc. but got `#{options[:writer].class}'"
13
- end
14
- write_inheritable_attribute(:"#{name}_writer", writer)
15
-
16
- default =
17
- case options[:default]
18
- when NilClass then nil
19
- when [] then Proc.new{[]}
20
- when {} then Proc.new{{}}
21
- when Symbol then Proc.new{__send__(options[:default])}
22
- when Proc then options[:default]
23
- else Proc.new{options[:default]}
24
- end
25
- write_inheritable_attribute(:"#{name}_default", default)
26
-
27
- self.class.class_eval do
28
- define_method("#{name}=") do |value|
29
- writer = read_inheritable_attribute(:"#{name}_writer")
30
- value = writer.call(value) if writer
31
- write_inheritable_attribute(:"#{name}", value)
32
- end
1
+ unless Class.new.respond_to?(:write_inheritable_attribute)
2
+ require File.dirname(__FILE__) + "/../core_ext/duplicable" unless Object.new.respond_to?(:duplicable?)
3
+ require File.dirname(__FILE__) + "/../core_ext/class/inheritable_attributes"
4
+ end
33
5
 
34
- define_method(name) do |*values|
35
- if values.empty?
36
- # getter method
37
- key = :"#{name}"
38
- if !inheritable_attributes.has_key?(key)
39
- default = read_inheritable_attribute(:"#{name}_default")
40
- value = default ? default.call(self) : nil
41
- __send__("#{name}=", value)
42
- end
43
- read_inheritable_attribute(key)
44
- else
45
- # setter method
46
- __send__("#{name}=", *values)
47
- end
48
- end
49
- end
50
- end
6
+ unless Module.new.respond_to?(:delegate)
7
+ require File.dirname(__FILE__) + "/../core_ext/module/delegation"
51
8
  end
52
9
 
10
+ require File.dirname(__FILE__) + '/../core_ext/class/dsl_accessor'
11
+
@@ -0,0 +1,106 @@
1
+ require File.join( File.dirname(__FILE__), "spec_helper" )
2
+
3
+ describe DslAccessor do
4
+ before(:each) do
5
+ Object.send(:remove_const, :Foo) if Object.const_defined?(:Foo)
6
+ class Foo
7
+ end
8
+ end
9
+
10
+ def foo_should_not_be_defined
11
+ Foo .should_not respond_to(:foo)
12
+ Foo.new.should_not respond_to(:foo)
13
+ end
14
+
15
+ it "should provide .dsl_accessor_auto_declared as private method" do
16
+ Class.private_methods.should include("dsl_accessor_auto_declared?")
17
+ end
18
+
19
+ it "should provide .dsl_accessor" do
20
+ Class.should respond_to(:dsl_accessor)
21
+ end
22
+
23
+ describe " should raise NoMethodError when we call a method " do
24
+ it "without arugments" do
25
+ foo_should_not_be_defined
26
+ lambda { Foo.foo }.should raise_error(NoMethodError)
27
+ foo_should_not_be_defined
28
+ end
29
+ it "with arguments" do
30
+ foo_should_not_be_defined
31
+ lambda { Foo.foo(1) }.should raise_error(NoMethodError)
32
+ lambda { Foo.foo(1, 2) }.should raise_error(NoMethodError)
33
+ foo_should_not_be_defined
34
+ end
35
+ it "with block" do
36
+ foo_should_not_be_defined
37
+ lambda { Foo.foo{} }.should raise_error(NoMethodError)
38
+ foo_should_not_be_defined
39
+ end
40
+ it "with arguments and block" do
41
+ foo_should_not_be_defined
42
+ lambda { Foo.foo(1){} }.should raise_error(NoMethodError)
43
+ foo_should_not_be_defined
44
+ end
45
+ end
46
+
47
+ describe ".dsl_accessor without arguments" do
48
+ it "should be accepted" do
49
+ lambda {
50
+ Foo.dsl_accessor
51
+ }.should_not raise_error
52
+ end
53
+
54
+ it "should mark auto_declared" do
55
+ Foo.send(:dsl_accessor_auto_declared?).should be_false
56
+ Foo.dsl_accessor
57
+ Foo.send(:dsl_accessor_auto_declared?).should be_true
58
+ end
59
+ end
60
+
61
+ describe "auto_declared" do
62
+ before(:each) do
63
+ class Foo
64
+ dsl_accessor
65
+ end
66
+ end
67
+
68
+ it "should raise NoMethodError if unknown method with args is called" do
69
+ lambda {
70
+ Foo.foo(1)
71
+ }.should raise_error(NoMethodError)
72
+ end
73
+
74
+ it "should raise NoMethodError when unknown method is called with args and block" do
75
+ lambda {
76
+ Foo.foo(1){}
77
+ }.should raise_error(NoMethodError)
78
+ end
79
+
80
+ describe " when unknown method is called with a block" do
81
+ it "should trap NoMethodError" do
82
+ lambda {
83
+ Foo.foo{}
84
+ }.should_not raise_error(NoMethodError)
85
+ end
86
+
87
+ it "should define its instance method automatically" do
88
+ foo_should_not_be_defined
89
+ Foo.foo{1}
90
+ Foo.new.should respond_to(:foo)
91
+ Foo.new.foo.should == 1
92
+ end
93
+ end
94
+
95
+ it "should affect nothing to subclasses" do
96
+ class Bar < Foo
97
+ end
98
+
99
+ lambda { Bar.bar }.should raise_error(NoMethodError)
100
+ lambda { Bar.bar(1) }.should raise_error(NoMethodError)
101
+ lambda { Bar.bar(1, 2) }.should raise_error(NoMethodError)
102
+ lambda { Bar.bar{} }.should raise_error(NoMethodError)
103
+ lambda { Bar.bar(1){} }.should raise_error(NoMethodError)
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,21 @@
1
+ require File.join( File.dirname(__FILE__), "spec_helper" )
2
+
3
+ describe DslAccessor do
4
+ module Exts
5
+ class All
6
+ end
7
+
8
+ class Base < All
9
+ end
10
+ end
11
+
12
+ module Exts
13
+ class All
14
+ dsl_accessor :ext, "*"
15
+ end
16
+ end
17
+
18
+ it "should inherit value" do
19
+ Exts::Base.ext.should == "*"
20
+ end
21
+ end
@@ -0,0 +1,5 @@
1
+ require "rubygems"
2
+ require "spec"
3
+
4
+ require File.dirname(__FILE__) + "/../init"
5
+
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :dsl_accessor do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+
4
+ class DslDefaultAccessorTest < Test::Unit::TestCase
5
+
6
+ class CoolActiveRecord
7
+ dsl_accessor :primary_key, :default=>"id"
8
+ dsl_accessor :table_name, :default=>proc{|klass| klass.name.split(/::/).last.downcase+"s"}
9
+ end
10
+
11
+ class Item < CoolActiveRecord
12
+ end
13
+
14
+ class User < CoolActiveRecord
15
+ end
16
+
17
+ class Folder
18
+ dsl_accessor :array_folder, :default=>[]
19
+ dsl_accessor :hash_folder, :default=>{}
20
+ end
21
+
22
+ class SubFolder < Folder
23
+ end
24
+
25
+ def test_default_accessor_with_string
26
+ assert_equal "id", Item.primary_key
27
+ assert_equal "id", User.primary_key
28
+ end
29
+
30
+ def test_default_accessor_with_proc
31
+ assert_equal "items", Item.table_name
32
+ assert_equal "users", User.table_name
33
+ end
34
+
35
+ def test_default_accessor_should_duplicate_empty_array_or_hash
36
+ Folder.array_folder << 1
37
+ Folder.hash_folder[:name] = "maiha"
38
+
39
+ assert_equal([1], Folder.array_folder)
40
+ assert_equal({:name=>"maiha"}, Folder.hash_folder)
41
+
42
+ assert_equal([], SubFolder.array_folder)
43
+ assert_equal({}, SubFolder.hash_folder)
44
+ end
45
+ end
46
+
47
+
48
+ class DslOverwritenDefaultAccessorTest < Test::Unit::TestCase
49
+ class CoolActiveRecord
50
+ dsl_accessor :primary_key, :default=>"id"
51
+ dsl_accessor :table_name, :default=>proc{|klass| klass.name+"s"}
52
+ end
53
+
54
+ class Item < CoolActiveRecord
55
+ primary_key :item_id
56
+ table_name :item_table
57
+ end
58
+
59
+ def test_overwrite_default_accessor
60
+ assert_equal :item_id, Item.primary_key
61
+ assert_equal :item_table, Item.table_name
62
+ end
63
+ end
64
+
@@ -1,4 +1,5 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
2
3
 
3
4
  class DslAccessorTest < Test::Unit::TestCase
4
5
  class CoolActiveRecord
@@ -14,6 +15,12 @@ class DslAccessorTest < Test::Unit::TestCase
14
15
  table_name :item
15
16
  end
16
17
 
18
+ class OtherClass
19
+ end
20
+
21
+ def test_dsl_accessor_doesnt_affect_other_classes
22
+ assert !OtherClass.respond_to?(:primary_key)
23
+ end
17
24
 
18
25
  def test_accessor_without_initialization
19
26
  assert_equal nil, Item.primary_key
@@ -38,83 +45,3 @@ class DslAccessorTest < Test::Unit::TestCase
38
45
  end
39
46
  end
40
47
 
41
-
42
- class DslDefaultAccessorTest < Test::Unit::TestCase
43
-
44
- class CoolActiveRecord
45
- dsl_accessor :primary_key, :default=>"id"
46
- dsl_accessor :table_name, :default=>proc{|klass| klass.name.demodulize.underscore.pluralize}
47
- end
48
-
49
- class Item < CoolActiveRecord
50
- end
51
-
52
- class User < CoolActiveRecord
53
- end
54
-
55
- class Folder
56
- dsl_accessor :array_folder, :default=>[]
57
- dsl_accessor :hash_folder, :default=>{}
58
- end
59
-
60
- class SubFolder < Folder
61
- end
62
-
63
- def test_default_accessor_with_string
64
- assert_equal "id", Item.primary_key
65
- assert_equal "id", User.primary_key
66
- end
67
-
68
- def test_default_accessor_with_proc
69
- assert_equal "items", Item.table_name
70
- assert_equal "users", User.table_name
71
- end
72
-
73
- def test_default_accessor_should_duplicate_empty_array_or_hash
74
- Folder.array_folder << 1
75
- Folder.hash_folder[:name] = "maiha"
76
-
77
- assert_equal([1], Folder.array_folder)
78
- assert_equal({:name=>"maiha"}, Folder.hash_folder)
79
-
80
- assert_equal([], SubFolder.array_folder)
81
- assert_equal({}, SubFolder.hash_folder)
82
- end
83
- end
84
-
85
-
86
- class DslOverwritenDefaultAccessorTest < Test::Unit::TestCase
87
- class CoolActiveRecord
88
- dsl_accessor :primary_key, :default=>"id"
89
- dsl_accessor :table_name, :default=>proc{|klass| klass.name.demodulize.underscore.pluralize}
90
- end
91
-
92
- class Item < CoolActiveRecord
93
- primary_key :item_id
94
- table_name :item_table
95
- end
96
-
97
- def test_overwrite_default_accessor
98
- assert_equal :item_id, Item.primary_key
99
- assert_equal :item_table, Item.table_name
100
- end
101
- end
102
-
103
-
104
- class DslWriterAccessorTest < Test::Unit::TestCase
105
- class Item
106
- dsl_accessor :primary_key, :writer=>proc{|value| value.to_s}
107
- end
108
-
109
- def test_string_writer
110
- assert_equal "", Item.primary_key
111
-
112
- Item.primary_key :id
113
- assert_equal "id", Item.primary_key
114
-
115
- Item.primary_key "id"
116
- assert_equal "id", Item.primary_key
117
- end
118
- end
119
-
120
-
@@ -0,0 +1,38 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class DefineInstanceMethodWithOptionsTest < Test::Unit::TestCase
4
+ class Window
5
+ dsl_accessor :width, :default=>640, :instance=>:options
6
+ end
7
+
8
+ class OptionedWindow
9
+ dsl_accessor :width, :default=>640, :instance=>:options
10
+ def initialize(options = {})
11
+ @options = options
12
+ end
13
+ end
14
+
15
+ def test_class_method
16
+ assert_equal Window.width, 640
17
+ assert_equal OptionedWindow.width, 640
18
+ end
19
+
20
+ def test_instance_method
21
+ assert_raises(TypeError) { Window.new.width }
22
+ assert_equal OptionedWindow.new.width, 640
23
+ end
24
+
25
+ def test_use_options_variable_rather_than_default_value
26
+ window = OptionedWindow.new( :width => 320 )
27
+ assert_equal window.width, 320
28
+ end
29
+
30
+ def test_instance_options_value_doesnt_affect_to_class_method
31
+ window = OptionedWindow.new( :width => 320 )
32
+ assert_equal OptionedWindow.width, 640
33
+ end
34
+
35
+ end
36
+
37
+
38
+
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class DefineInstanceMethodTest < Test::Unit::TestCase
4
+ class Item
5
+ dsl_accessor :primary_key, "code", :instance=>true
6
+ end
7
+
8
+ class OtherClass
9
+ end
10
+
11
+ def test_dsl_accessor_doesnt_affect_other_classes
12
+ assert !OtherClass.respond_to?(:primary_key)
13
+ end
14
+
15
+ def test_dsl_accessor_doesnt_affect_other_instances
16
+ assert !OtherClass.new.respond_to?(:primary_key)
17
+ end
18
+
19
+ def test_class_method
20
+ assert Item.respond_to?(:primary_key)
21
+ assert_nothing_raised do
22
+ Item.primary_key
23
+ end
24
+ end
25
+
26
+ def test_class_method_value
27
+ assert_equal "code", Item.primary_key
28
+ end
29
+
30
+ def test_instance_method
31
+ assert Item.new.respond_to?(:primary_key)
32
+ assert_nothing_raised do
33
+ Item.new.primary_key
34
+ end
35
+ end
36
+
37
+ def test_instance_method_value
38
+ assert_equal "code", Item.new.primary_key
39
+ end
40
+ end
41
+
42
+
43
+
data/test/test_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
1
  require 'test/unit'
2
- require 'rubygems'
3
- require File.dirname(__FILE__) + '/../lib/dsl_accessor'
2
+
3
+ def __DIR__; File.dirname(__FILE__); end
4
+ require File.dirname(__FILE__) + '/../init'
5
+
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+
4
+ class DslWriterAccessorTest < Test::Unit::TestCase
5
+ class Item
6
+ dsl_accessor :primary_key, :writer=>proc{|value| value.to_s}
7
+ end
8
+
9
+ def test_string_writer
10
+ assert_equal "", Item.primary_key
11
+
12
+ Item.primary_key :id
13
+ assert_equal "id", Item.primary_key
14
+
15
+ Item.primary_key "id"
16
+ assert_equal "id", Item.primary_key
17
+ end
18
+ end
19
+
20
+
21
+
metadata CHANGED
@@ -1,72 +1,73 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
3
- specification_version: 1
4
2
  name: dsl_accessor
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.1.0
7
- date: 2007-01-16 00:00:00 -08:00
8
- summary: This gem gives hybrid accessor class methods to classes by DSL like definition.
9
- require_paths:
10
- - lib
11
- email: anna@wota.jp
12
- homepage: http://dsl-accessor.rubyforge.org
13
- rubyforge_project: dsl-accessor
14
- description: This gem gives hybrid accessor class methods to classes by DSL like definition.
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.3.3
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
- - Maiha
31
- - Alex Wayne
7
+ - maiha
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-19 00:00:00 +09:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: This plugin gives hybrid accessor class methods to classes by DSL like definition
17
+ email: maiha@wota.jp
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
24
+ - LICENSE
32
25
  files:
33
- - History.txt
34
- - Manifest.txt
35
- - README.txt
26
+ - LICENSE
27
+ - README
36
28
  - Rakefile
37
- - setup.rb
29
+ - core_ext/duplicable.rb
30
+ - core_ext/module/delegation.rb
31
+ - core_ext/class/dsl_accessor.rb
32
+ - core_ext/class/inheritable_attributes.rb
38
33
  - lib/dsl_accessor.rb
39
- - lib/dsl_accessor/version.rb
34
+ - spec/inherit_spec.rb
35
+ - spec/auto_declared_spec.rb
36
+ - spec/spec_helper.rb
37
+ - tasks/dsl_accessor_tasks.rake
38
+ - test/instance_test.rb
39
+ - test/default_test.rb
40
+ - test/writer_test.rb
40
41
  - test/test_helper.rb
41
42
  - test/dsl_accessor_test.rb
42
- test_files:
43
- - test/dsl_accessor_test.rb
44
- rdoc_options: []
45
-
46
- extra_rdoc_files: []
47
-
48
- executables: []
43
+ - test/instance_options_test.rb
44
+ has_rdoc: true
45
+ homepage: http://github.com/maiha/dsl_accessor
46
+ licenses: []
49
47
 
50
- extensions: []
48
+ post_install_message:
49
+ rdoc_options: []
51
50
 
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ version:
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0"
64
+ version:
52
65
  requirements: []
53
66
 
54
- dependencies:
55
- - !ruby/object:Gem::Dependency
56
- name: activesupport
57
- version_requirement:
58
- version_requirements: !ruby/object:Gem::Version::Requirement
59
- requirements:
60
- - - ">"
61
- - !ruby/object:Gem::Version
62
- version: 0.0.0
63
- version:
64
- - !ruby/object:Gem::Dependency
65
- name: hoe
66
- version_requirement:
67
- version_requirements: !ruby/object:Gem::Version::Requirement
68
- requirements:
69
- - - ">="
70
- - !ruby/object:Gem::Version
71
- version: 1.1.7
72
- version:
67
+ rubyforge_project:
68
+ rubygems_version: 1.3.5
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: This plugin gives hybrid accessor class methods to classes by DSL like definition
72
+ test_files: []
73
+
data/History.txt DELETED
File without changes
data/Manifest.txt DELETED
@@ -1,9 +0,0 @@
1
- History.txt
2
- Manifest.txt
3
- README.txt
4
- Rakefile
5
- setup.rb
6
- lib/dsl_accessor.rb
7
- lib/dsl_accessor/version.rb
8
- test/test_helper.rb
9
- test/dsl_accessor_test.rb