auser-dslify 0.0.4 → 0.0.5
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/dslify.gemspec +2 -2
- data/lib/dslify/dslify.rb +63 -17
- data/lib/dslify/version.rb +4 -4
- data/test/test_dslify.rb +69 -1
- metadata +2 -2
data/dslify.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{dslify}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.5"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Ari Lerner"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-04-14}
|
10
10
|
s.description = %q{Easily add DSL-like calls to any class}
|
11
11
|
s.email = ["arilerner@mac.com"]
|
12
12
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "PostInstall.txt", "README.txt", "website/index.txt"]
|
data/lib/dslify/dslify.rb
CHANGED
@@ -1,23 +1,69 @@
|
|
1
1
|
# Quick 1-file dsl accessor
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
def set_vars_from_options(h={})
|
8
|
-
h.each{|k,v|send k.to_sym, v } unless h.empty?
|
2
|
+
module Dslify
|
3
|
+
module ClassMethods
|
4
|
+
def default_options(hsh={})
|
5
|
+
@default_dsl_options ||= hsh
|
6
|
+
end
|
9
7
|
end
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
|
9
|
+
module InstanceMethods
|
10
|
+
def default_dsl_options;self.class.default_options;end
|
11
|
+
def dsl_options(hsh={})
|
12
|
+
@dsl_options ||= default_dsl_options.merge(hsh)
|
13
|
+
end
|
14
|
+
alias :options :dsl_options
|
15
|
+
def set_vars_from_options(h={}, contxt=self)
|
16
|
+
h.each{|k,v| contxt.send k.to_sym, v }
|
17
|
+
end
|
18
|
+
def add_method(meth)
|
19
|
+
# instance_eval <<-EOM
|
20
|
+
# def #{meth}(n=nil)
|
21
|
+
# puts "called #{meth}(\#\{n\}) from \#\{self\}"
|
22
|
+
# n ? (__h[:#{meth}] = n) : __h[:#{meth}]
|
23
|
+
# end
|
24
|
+
# def #{meth}=(n)
|
25
|
+
# __h[:#{meth}] = n
|
26
|
+
# end
|
27
|
+
# EOM
|
28
|
+
end
|
29
|
+
def method_missing(m,*a,&block)
|
30
|
+
if block
|
31
|
+
if a.empty?
|
32
|
+
(a[0].class == self.class) ? a[0].instance_eval(&block) : super
|
33
|
+
else
|
34
|
+
inst = a[0]
|
35
|
+
inst.instance_eval(&block)
|
36
|
+
dsl_options[m] = inst
|
37
|
+
end
|
14
38
|
else
|
15
|
-
|
16
|
-
|
17
|
-
|
39
|
+
if a.empty?
|
40
|
+
if dsl_options.has_key?(m)
|
41
|
+
dsl_options[m]
|
42
|
+
elsif m.to_s.index("?") == (m.to_s.length - 1)
|
43
|
+
if options.has_key?(val = m.to_s.gsub(/\?/, '').to_sym)
|
44
|
+
options[val] != false
|
45
|
+
else
|
46
|
+
false
|
47
|
+
end
|
48
|
+
else
|
49
|
+
if self.class.superclass.respond_to?(:default_options) && self.class.superclass.default_options.has_key?(m)
|
50
|
+
self.class.superclass.default_options[m]
|
51
|
+
elsif ((respond_to? :parent) && (parent != self))
|
52
|
+
parent.send m, *a, &block
|
53
|
+
else
|
54
|
+
super
|
55
|
+
end
|
56
|
+
end
|
57
|
+
else
|
58
|
+
clean_meth = m.to_s.gsub(/\=/,"").to_sym
|
59
|
+
dsl_options[clean_meth] = (a.size > 1 ? a : a[0])
|
60
|
+
end
|
18
61
|
end
|
19
|
-
else
|
20
|
-
((a.empty?)?h[m]:h[m.to_s.gsub(/\=/,"").to_sym]=(a.size>1?a:a[0]))
|
21
62
|
end
|
22
63
|
end
|
23
|
-
|
64
|
+
|
65
|
+
def self.included(receiver)
|
66
|
+
receiver.extend ClassMethods
|
67
|
+
receiver.send :include, InstanceMethods
|
68
|
+
end
|
69
|
+
end
|
data/lib/dslify/version.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
module Dslify
|
2
2
|
module VERSION #:nodoc:
|
3
|
-
MAJOR = 0
|
4
|
-
MINOR = 0
|
5
|
-
TINY =
|
3
|
+
MAJOR = 0 unless const_defined?("MAJOR")
|
4
|
+
MINOR = 0 unless const_defined?("MINOR")
|
5
|
+
TINY = 5 unless const_defined?("TINY")
|
6
6
|
|
7
|
-
STRING = [MAJOR, MINOR, TINY].join('.')
|
7
|
+
STRING = [MAJOR, MINOR, TINY].join('.') unless const_defined?("STRING")
|
8
8
|
self
|
9
9
|
end
|
10
10
|
end
|
data/test/test_dslify.rb
CHANGED
@@ -4,6 +4,7 @@ require "matchy"
|
|
4
4
|
require "context"
|
5
5
|
|
6
6
|
class Quickie
|
7
|
+
include Dslify
|
7
8
|
end
|
8
9
|
|
9
10
|
class QuickieTest < Test::Unit::TestCase
|
@@ -24,7 +25,7 @@ class QuickieTest < Test::Unit::TestCase
|
|
24
25
|
end
|
25
26
|
it "should set these values in the h Hash on the object" do
|
26
27
|
@q.movies "can be fun"
|
27
|
-
@q.
|
28
|
+
@q.dsl_options.keys.should == [:movies]
|
28
29
|
end
|
29
30
|
it "should set multiple keys with set_vars_from_options" do
|
30
31
|
@q.set_vars_from_options({:a => "a", :b => "b"})
|
@@ -42,5 +43,72 @@ class QuickieTest < Test::Unit::TestCase
|
|
42
43
|
end
|
43
44
|
@q.bobs.franks.should == "franke"
|
44
45
|
end
|
46
|
+
it "should not blow up when called with a ? at the end of the method" do
|
47
|
+
@q.set_vars_from_options({:pete => "and pete"})
|
48
|
+
lambda{@q.pete?}.should_not raise_error
|
49
|
+
end
|
50
|
+
it "should return false if the method exists" do
|
51
|
+
@q.bones "is a tv show"
|
52
|
+
@q.bops?.should == false
|
53
|
+
end
|
54
|
+
it "should return true if the option is set" do
|
55
|
+
@q.bones "is a tv show"
|
56
|
+
@q.bones?.should == true
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "with inheritance and classes" do
|
61
|
+
before do
|
62
|
+
class Pop
|
63
|
+
include Dslify
|
64
|
+
def initialize(h={})
|
65
|
+
dsl_options h
|
66
|
+
end
|
67
|
+
default_options :name => "pop"
|
68
|
+
end
|
69
|
+
|
70
|
+
class Foo < Pop
|
71
|
+
default_options :name=>'fooey'
|
72
|
+
end
|
73
|
+
|
74
|
+
class Bar < Pop
|
75
|
+
default_options :name=>'pangy', :taste => "spicy"
|
76
|
+
end
|
77
|
+
|
78
|
+
class Dad < Pop
|
79
|
+
end
|
80
|
+
|
81
|
+
@pop = Pop.new
|
82
|
+
@poptart = Pop.new :name => "Cinnamon"
|
83
|
+
@foo = Foo.new
|
84
|
+
@bar = Bar.new
|
85
|
+
end
|
86
|
+
it "should take the default options set on the class" do
|
87
|
+
@pop.dsl_options[:name].should == "pop"
|
88
|
+
end
|
89
|
+
it "should allow us to add defaults on the instance by calling dsl_options" do
|
90
|
+
@poptart.name.should == "Cinnamon"
|
91
|
+
end
|
92
|
+
it "should take the default options on a second class that inherits from the base" do
|
93
|
+
@foo.name.should == "fooey"
|
94
|
+
end
|
95
|
+
it "should take the default options on a third inheriting class" do
|
96
|
+
@bar.name.should == "pangy"
|
97
|
+
end
|
98
|
+
it "should not add a method not in the default_dsl_options" do
|
99
|
+
@bar.respond_to?(:boat).should == false
|
100
|
+
end
|
101
|
+
it "should return the original default options test" do
|
102
|
+
@bar.default_dsl_options[:taste].should == "spicy"
|
103
|
+
@bar.default_dsl_options[:name].should == "pangy"
|
104
|
+
end
|
105
|
+
it "should set the default options of the child to the superclass's if it doesn't exist" do
|
106
|
+
Dad.new.name.should == "pop"
|
107
|
+
end
|
108
|
+
it "should raise if the method isn't found on itself, the parent or in the rest of the method missing chain" do
|
109
|
+
lambda {
|
110
|
+
Class.new.sanitorium
|
111
|
+
}.should raise_error
|
112
|
+
end
|
45
113
|
end
|
46
114
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: auser-dslify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Lerner
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-04-14 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|