dsl 0.1.4 → 0.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/.gitignore +3 -0
- data/.rvmrc +1 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +59 -0
- data/Guardfile +10 -0
- data/LICENSE +1 -1
- data/README.md +64 -54
- data/Rakefile +28 -62
- data/VERSION +1 -1
- data/dsl.gemspec +14 -44
- data/lib/dsl.rb +33 -31
- data/spec/dsl_spec.rb +69 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/support/character_with_attr_reader.rb +19 -0
- data/spec/support/character_with_attr_writer.rb +19 -0
- data/spec/support/character_without_attributes.rb +11 -0
- metadata +55 -72
- data/examples/database.rb +0 -77
- data/examples/user.rb +0 -25
- data/examples/webapp.rb +0 -43
- data/pkg/dsl-0.1.2.gem +0 -0
- data/pkg/dsl-0.1.3.gem +0 -0
- data/test/helper.rb +0 -10
- data/test/test_dsl.rb +0 -7
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use --create ruby-1.9.3@dsl
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
dsl (0.1.4)
|
5
|
+
version (~> 1.0.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
active_support (3.0.0)
|
11
|
+
activesupport (= 3.0.0)
|
12
|
+
activesupport (3.0.0)
|
13
|
+
at (0.1.2)
|
14
|
+
active_support (~> 3.0.0)
|
15
|
+
coderay (1.0.8)
|
16
|
+
diff-lcs (1.1.3)
|
17
|
+
fuubar (1.1.0)
|
18
|
+
rspec (~> 2.0)
|
19
|
+
rspec-instafail (~> 0.2.0)
|
20
|
+
ruby-progressbar (~> 1.0.0)
|
21
|
+
guard (1.5.3)
|
22
|
+
listen (>= 0.4.2)
|
23
|
+
lumberjack (>= 1.0.2)
|
24
|
+
pry (>= 0.9.10)
|
25
|
+
thor (>= 0.14.6)
|
26
|
+
guard-rspec (2.1.1)
|
27
|
+
guard (>= 1.1)
|
28
|
+
rspec (~> 2.11)
|
29
|
+
listen (0.5.3)
|
30
|
+
lumberjack (1.0.2)
|
31
|
+
method_source (0.8.1)
|
32
|
+
pry (0.9.10)
|
33
|
+
coderay (~> 1.0.5)
|
34
|
+
method_source (~> 0.8)
|
35
|
+
slop (~> 3.3.1)
|
36
|
+
rspec (2.11.0)
|
37
|
+
rspec-core (~> 2.11.0)
|
38
|
+
rspec-expectations (~> 2.11.0)
|
39
|
+
rspec-mocks (~> 2.11.0)
|
40
|
+
rspec-core (2.11.1)
|
41
|
+
rspec-expectations (2.11.3)
|
42
|
+
diff-lcs (~> 1.1.3)
|
43
|
+
rspec-instafail (0.2.4)
|
44
|
+
rspec-mocks (2.11.3)
|
45
|
+
ruby-progressbar (1.0.2)
|
46
|
+
slop (3.3.3)
|
47
|
+
thor (0.16.0)
|
48
|
+
thoughtbot-shoulda (2.11.1)
|
49
|
+
version (1.0.0)
|
50
|
+
|
51
|
+
PLATFORMS
|
52
|
+
ruby
|
53
|
+
|
54
|
+
DEPENDENCIES
|
55
|
+
at
|
56
|
+
dsl!
|
57
|
+
fuubar
|
58
|
+
guard-rspec
|
59
|
+
thoughtbot-shoulda
|
data/Guardfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec', cli: '--color --format Fuubar' do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
watch(%r{^spec/support/.+\.rb$}) { "spec" }
|
9
|
+
end
|
10
|
+
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -2,73 +2,83 @@
|
|
2
2
|
|
3
3
|
## Description
|
4
4
|
|
5
|
-
|
5
|
+
Helpers for the creation of Domain Specific Languages within your libraries and gems.
|
6
6
|
|
7
7
|
## Install
|
8
8
|
|
9
|
-
|
10
|
-
`gem update`
|
11
|
-
`gem install dsl`
|
12
|
-
|
13
|
-
## Quick Example
|
14
|
-
|
15
|
-
require 'dsl'
|
16
|
-
|
17
|
-
class UserDSL < DSL
|
18
|
-
def name(n); @name = n; end
|
19
|
-
def gender(g); @gender = g; end
|
20
|
-
def age(a); @age = a; end
|
21
|
-
end
|
9
|
+
### Bundler
|
22
10
|
|
23
|
-
|
24
|
-
attr :name, :gender, :age
|
25
|
-
dsl_method :edit => UserDSL
|
26
|
-
end
|
27
|
-
|
28
|
-
ryguy = User.new
|
29
|
-
|
30
|
-
ryguy.edit do
|
31
|
-
name 'Ryan Lewis'
|
32
|
-
gender :male
|
33
|
-
age 19
|
34
|
-
end
|
11
|
+
`gem 'dsl'`
|
35
12
|
|
36
|
-
|
37
|
-
# => #<User:0x00000001b6dc78 @name="Ryan Lewis", @gender=:male, @age=19>
|
13
|
+
### RubyGems
|
38
14
|
|
39
|
-
|
40
|
-
|
41
|
-
`dsl_method` only accepts a `Hash`, the key being the instance method name and the value being the DSL class the method will use.
|
42
|
-
|
43
|
-
When your DSL instance method is called (with a block, of course), all of your object's instance variables are delegated into a new instance of the DSL class assigned to the called DSL instance method.
|
44
|
-
The block is then `instance_eval`'d within the new DSL class instance where you can use the instance variables.
|
45
|
-
When the block is closed, all of the instance variables are then transfered back to your object.
|
46
|
-
|
47
|
-
Therefor, creating a Domain Specific Language is as easy as subclassing the `DSL` class. That's it!
|
48
|
-
|
49
|
-
## Use with any block:
|
15
|
+
`gem install dsl`
|
50
16
|
|
51
|
-
|
17
|
+
## Usage
|
52
18
|
|
53
|
-
require 'dsl'
|
54
19
|
|
55
|
-
|
56
|
-
def name(n); @name = n; end
|
57
|
-
def gender(g); @gender = g; end
|
58
|
-
def age(a); @age = a; end
|
59
|
-
end
|
20
|
+
### Simple
|
60
21
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
22
|
+
```ruby
|
23
|
+
class Character
|
24
|
+
class AttributeDSL < DSL
|
25
|
+
def_dsl :name, :age, :gender
|
26
|
+
end
|
27
|
+
|
28
|
+
attr_reader :name, :age, :gender
|
29
|
+
|
30
|
+
def initialize(&blk)
|
31
|
+
dsl = AttributeDSL.call(&blk)
|
32
|
+
|
33
|
+
@name, @age, @gender = dsl.name, dsl.age, dsl.gender
|
34
|
+
|
35
|
+
# OR:
|
36
|
+
# @name, @age, @gender = dsl.to_h.values_at(:name, :age, :gender)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
Character.new do
|
41
|
+
name 'John Doe'
|
42
|
+
age 21
|
43
|
+
gender :male
|
44
|
+
end
|
45
|
+
```
|
46
|
+
|
47
|
+
### Advanced
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
class Character
|
51
|
+
class AttributeDSL < DSL
|
52
|
+
def_dsl :name do
|
53
|
+
get do |value|
|
54
|
+
value.split(' ').first.capitalize # Only return the first name, even if the person has a last name as well
|
55
|
+
end
|
56
|
+
|
57
|
+
set do |value| # The instance variable will be set to the result of this block
|
58
|
+
raise 'name must be a String' unless value.respond_to?(:to_s)
|
59
|
+
|
60
|
+
value.to_s
|
65
61
|
end
|
66
62
|
end
|
63
|
+
end
|
64
|
+
|
65
|
+
attr_reader :name
|
66
|
+
|
67
|
+
def initialize(&blk)
|
68
|
+
dsl = AttributeDSL.call(&blk)
|
69
|
+
|
70
|
+
@name = dsl.name
|
67
71
|
|
68
|
-
|
72
|
+
# OR:
|
73
|
+
# @name, @age, @gender = dsl.to_h.values_at(:name, :age, :gender)
|
74
|
+
end
|
75
|
+
end
|
69
76
|
|
70
|
-
|
77
|
+
Character.new do
|
78
|
+
name 1234 # Error: name must be a String
|
79
|
+
end
|
80
|
+
```
|
71
81
|
|
72
|
-
##
|
82
|
+
## License
|
73
83
|
|
74
|
-
Copyright (c) 2010 Ryan Lewis. See LICENSE for details.
|
84
|
+
Copyright (c) 2010-2012 Ryan Lewis. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,69 +1,35 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
require 'rake/testtask'
|
22
|
-
Rake::TestTask.new(:test) do |test|
|
23
|
-
test.libs << 'lib' << 'test'
|
24
|
-
test.pattern = 'test/**/test_*.rb'
|
25
|
-
test.verbose = true
|
1
|
+
require 'rake/version_task'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'rubygems/package_task'
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
spec = Gem::Specification.new do |s|
|
7
|
+
s.name = 'dsl'
|
8
|
+
s.version = Pathname.new(__FILE__).dirname.join('VERSION').read.strip
|
9
|
+
s.author = 'Ryan Scott Lewis'
|
10
|
+
s.email = 'ryan@rynet.us'
|
11
|
+
s.homepage = "http://github.com/c00lryguy/#{s.name}"
|
12
|
+
s.summary = 'Helpers for the creation of Domain Specific Languages within your libraries and gems.'
|
13
|
+
s.description = 'Easily create DSLs for use within your projects!'
|
14
|
+
s.require_path = 'lib'
|
15
|
+
s.files = `git ls-files`.lines.to_a.collect { |s| s.strip }
|
16
|
+
s.executables = `git ls-files -- bin/*`.lines.to_a.collect { |s| File.basename(s.strip) }
|
17
|
+
|
18
|
+
s.post_install_message = "NOTICE!\n\n DSL 2.x.x is INCOMPATIBLE with DSL 1.x.x!\n\n"
|
19
|
+
|
20
|
+
s.add_dependency 'version', '~> 1.0.0'
|
26
21
|
end
|
27
22
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
test.libs << 'test'
|
32
|
-
test.pattern = 'test/**/test_*.rb'
|
33
|
-
test.verbose = true
|
34
|
-
end
|
35
|
-
rescue LoadError
|
36
|
-
task :rcov do
|
37
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
38
|
-
end
|
23
|
+
Rake::VersionTask.new do |t|
|
24
|
+
t.with_git_tag = true
|
25
|
+
t.with_gemspec = spec
|
39
26
|
end
|
40
27
|
|
41
|
-
|
28
|
+
RSpec::Core::RakeTask.new
|
42
29
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
t.fail_on_error = true
|
47
|
-
t.verbose = false
|
48
|
-
t.source_files = 'lib/**/*.rb'
|
49
|
-
end
|
50
|
-
rescue LoadError
|
51
|
-
task :reek do
|
52
|
-
abort "Reek is not available. In order to run reek, you must: sudo gem install reek"
|
53
|
-
end
|
30
|
+
Gem::PackageTask.new(spec) do |t|
|
31
|
+
t.need_zip = false
|
32
|
+
t.need_tar = false
|
54
33
|
end
|
55
34
|
|
56
|
-
|
57
|
-
require 'roodi'
|
58
|
-
require 'roodi_task'
|
59
|
-
RoodiTask.new do |t|
|
60
|
-
t.verbose = false
|
61
|
-
end
|
62
|
-
rescue LoadError
|
63
|
-
task :roodi do
|
64
|
-
abort "Roodi is not available. In order to run roodi, you must: sudo gem install roodi"
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
task :default => :test
|
69
|
-
|
35
|
+
task :default => :spec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/dsl.gemspec
CHANGED
@@ -1,60 +1,30 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
1
|
# -*- encoding: utf-8 -*-
|
5
2
|
|
6
3
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
4
|
+
s.name = "dsl"
|
5
|
+
s.version = "0.2.0"
|
9
6
|
|
10
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
15
|
-
s.
|
16
|
-
|
17
|
-
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
"LICENSE",
|
21
|
-
"README.md",
|
22
|
-
"Rakefile",
|
23
|
-
"VERSION",
|
24
|
-
"dsl.gemspec",
|
25
|
-
"examples/database.rb",
|
26
|
-
"examples/user.rb",
|
27
|
-
"examples/webapp.rb",
|
28
|
-
"lib/dsl.rb",
|
29
|
-
"pkg/dsl-0.1.2.gem",
|
30
|
-
"pkg/dsl-0.1.3.gem",
|
31
|
-
"test/helper.rb",
|
32
|
-
"test/test_dsl.rb"
|
33
|
-
]
|
34
|
-
s.homepage = %q{http://github.com/c00lryguy/dsl}
|
35
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
8
|
+
s.authors = ["Ryan Scott Lewis"]
|
9
|
+
s.date = "2012-11-04"
|
10
|
+
s.description = "Easily create DSLs for use within your projects!"
|
11
|
+
s.email = "ryan@rynet.us"
|
12
|
+
s.files = [".gitignore", ".rvmrc", "Gemfile", "Gemfile.lock", "Guardfile", "LICENSE", "README.md", "Rakefile", "VERSION", "dsl.gemspec", "lib/dsl.rb", "spec/dsl_spec.rb", "spec/spec_helper.rb", "spec/support/character_with_attr_reader.rb", "spec/support/character_with_attr_writer.rb", "spec/support/character_without_attributes.rb"]
|
13
|
+
s.homepage = "http://github.com/c00lryguy/dsl"
|
14
|
+
s.post_install_message = "NOTICE!\n\n DSL 2.x.x is INCOMPATIBLE with DSL 1.x.x!\n\n"
|
36
15
|
s.require_paths = ["lib"]
|
37
|
-
s.rubygems_version =
|
38
|
-
s.summary =
|
39
|
-
s.test_files = [
|
40
|
-
"test/test_dsl.rb",
|
41
|
-
"test/helper.rb",
|
42
|
-
"examples/database.rb",
|
43
|
-
"examples/user.rb",
|
44
|
-
"examples/webapp.rb"
|
45
|
-
]
|
16
|
+
s.rubygems_version = "1.8.24"
|
17
|
+
s.summary = "Helpers for the creation of Domain Specific Languages within your libraries and gems."
|
46
18
|
|
47
19
|
if s.respond_to? :specification_version then
|
48
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
49
20
|
s.specification_version = 3
|
50
21
|
|
51
22
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
52
|
-
s.
|
23
|
+
s.add_runtime_dependency(%q<version>, ["~> 1.0.0"])
|
53
24
|
else
|
54
|
-
s.add_dependency(%q<
|
25
|
+
s.add_dependency(%q<version>, ["~> 1.0.0"])
|
55
26
|
end
|
56
27
|
else
|
57
|
-
s.add_dependency(%q<
|
28
|
+
s.add_dependency(%q<version>, ["~> 1.0.0"])
|
58
29
|
end
|
59
30
|
end
|
60
|
-
|
data/lib/dsl.rb
CHANGED
@@ -1,36 +1,38 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
value = parent.instance_variable_get(instance_variable)
|
9
|
-
instance.instance_variable_set(instance_variable, value)
|
1
|
+
class DSL
|
2
|
+
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def call(parent, &blk)
|
6
|
+
# `instance_eval` returns the last thing in the block whereas `tap` return the Object that was tapped
|
7
|
+
new(parent).tap { |instance| instance.instance_eval(&blk) }
|
10
8
|
end
|
11
|
-
|
12
|
-
|
13
|
-
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
raise(ArgumentError, "method #{method} requires a block") unless !!blk
|
32
|
-
dsl_class.call(self, &blk)
|
9
|
+
|
10
|
+
# Defines a method that accepts a variable number of arguments
|
11
|
+
# that will delegate to the parent.
|
12
|
+
# This will attempt to call the setter/getter method before attempting to
|
13
|
+
# access the instance variable. This way, any modifications you do to the
|
14
|
+
# instance variables in those methods will be used.
|
15
|
+
def def_dsl_delegator(*method_names)
|
16
|
+
method_names.each do |method_name|
|
17
|
+
raise TypeError unless method_name.respond_to?(:to_sym)
|
18
|
+
method_name = method_name.to_sym
|
19
|
+
|
20
|
+
define_method(method_name) do |*args|
|
21
|
+
unless args.empty?
|
22
|
+
args = args.first if args.length == 1
|
23
|
+
@parent.respond_to?("#{method_name}=") ? @parent.send("#{method_name}=", args) : @parent.instance_variable_set("@#{method_name}", args)
|
24
|
+
end
|
25
|
+
|
26
|
+
@parent.respond_to?(method_name) ? @parent.send(method_name) : @parent.instance_variable_get("@#{method_name}")
|
27
|
+
end
|
28
|
+
|
33
29
|
end
|
34
30
|
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(parent)
|
35
|
+
@parent = parent
|
35
36
|
end
|
37
|
+
|
36
38
|
end
|
data/spec/dsl_spec.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CharacterWithoutAttributes do
|
4
|
+
subject do
|
5
|
+
CharacterWithoutAttributes.new do
|
6
|
+
name 'John Doe'
|
7
|
+
age 21
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context "Subject" do
|
12
|
+
it "should have instance variables set correctly" do
|
13
|
+
subject.at.name.should == 'John Doe'
|
14
|
+
subject.at.age.should == 21
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe CharacterWithAttrReader do
|
20
|
+
subject do
|
21
|
+
CharacterWithAttrReader.new do
|
22
|
+
name 'John Doe'
|
23
|
+
age '21'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "Subject" do
|
28
|
+
it "should have instance variables set correctly" do
|
29
|
+
subject.at.name.should == 'John Doe'
|
30
|
+
subject.at.age.should == '21'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should have attr readers set correctly" do
|
34
|
+
subject.name.should == 'JOHN'
|
35
|
+
subject.age.should == 21
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "DSL" do
|
40
|
+
it "should have attr readers set correctly" do
|
41
|
+
subject.at.dsl.name.should == 'JOHN'
|
42
|
+
subject.at.dsl.age.should == 21
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
describe CharacterWithAttrWriter do
|
49
|
+
subject do
|
50
|
+
CharacterWithAttrWriter.new do
|
51
|
+
name 'John Doe'
|
52
|
+
age '21'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "Subject" do
|
57
|
+
it "should have instance variables set correctly" do
|
58
|
+
subject.at.name.should == 'JOHN'
|
59
|
+
subject.at.age.should == 21
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "DSL" do
|
64
|
+
it "should have attr readers set correctly" do
|
65
|
+
subject.at.dsl.name.should == 'JOHN'
|
66
|
+
subject.at.dsl.age.should == 21
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
class CharacterWithAttrReader
|
2
|
+
|
3
|
+
class AttrDSL < DSL
|
4
|
+
def_dsl_delegator :name, :age
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize(&blk)
|
8
|
+
@dsl = AttrDSL.call(self, &blk)
|
9
|
+
end
|
10
|
+
|
11
|
+
def name
|
12
|
+
@name.split(/\s+/).first.upcase
|
13
|
+
end
|
14
|
+
|
15
|
+
def age
|
16
|
+
@age.to_i
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class CharacterWithAttrWriter
|
2
|
+
|
3
|
+
class AttrDSL < DSL
|
4
|
+
def_dsl_delegator :name, :age
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize(&blk)
|
8
|
+
@dsl = AttrDSL.call(self, &blk)
|
9
|
+
end
|
10
|
+
|
11
|
+
def name=(value)
|
12
|
+
@name = value.split(/\s+/).first.upcase
|
13
|
+
end
|
14
|
+
|
15
|
+
def age=(value)
|
16
|
+
@age = value.to_i
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
metadata
CHANGED
@@ -1,97 +1,80 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: dsl
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 4
|
10
|
-
version: 0.1.4
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
-
|
7
|
+
authors:
|
8
|
+
- Ryan Scott Lewis
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
12
|
+
date: 2012-11-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: version
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.0.0
|
22
|
+
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
version: "0"
|
33
|
-
type: :development
|
34
|
-
version_requirements: *id001
|
35
|
-
description: A small library for creating Domain Specific Languages (DSLs)
|
36
|
-
email: c00lryguy@gmail.com
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.0.0
|
30
|
+
description: Easily create DSLs for use within your projects!
|
31
|
+
email: ryan@rynet.us
|
37
32
|
executables: []
|
38
|
-
|
39
33
|
extensions: []
|
40
|
-
|
41
|
-
|
42
|
-
-
|
43
|
-
-
|
44
|
-
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- .gitignore
|
37
|
+
- .rvmrc
|
38
|
+
- Gemfile
|
39
|
+
- Gemfile.lock
|
40
|
+
- Guardfile
|
45
41
|
- LICENSE
|
46
42
|
- README.md
|
47
43
|
- Rakefile
|
48
44
|
- VERSION
|
49
45
|
- dsl.gemspec
|
50
|
-
- examples/database.rb
|
51
|
-
- examples/user.rb
|
52
|
-
- examples/webapp.rb
|
53
46
|
- lib/dsl.rb
|
54
|
-
-
|
55
|
-
-
|
56
|
-
-
|
57
|
-
-
|
58
|
-
|
47
|
+
- spec/dsl_spec.rb
|
48
|
+
- spec/spec_helper.rb
|
49
|
+
- spec/support/character_with_attr_reader.rb
|
50
|
+
- spec/support/character_with_attr_writer.rb
|
51
|
+
- spec/support/character_without_attributes.rb
|
59
52
|
homepage: http://github.com/c00lryguy/dsl
|
60
53
|
licenses: []
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
- --charset=UTF-8
|
65
|
-
require_paths:
|
54
|
+
post_install_message: ! "NOTICE!\n\n DSL 2.x.x is INCOMPATIBLE with DSL 1.x.x!\n\n"
|
55
|
+
rdoc_options: []
|
56
|
+
require_paths:
|
66
57
|
- lib
|
67
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
59
|
none: false
|
69
|
-
requirements:
|
70
|
-
- -
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
|
73
|
-
segments:
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
segments:
|
74
65
|
- 0
|
75
|
-
|
76
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
hash: 3439450735216533917
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
68
|
none: false
|
78
|
-
requirements:
|
79
|
-
- -
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
|
82
|
-
segments:
|
83
|
-
- 0
|
84
|
-
version: "0"
|
69
|
+
requirements:
|
70
|
+
- - ! '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
85
73
|
requirements: []
|
86
|
-
|
87
74
|
rubyforge_project:
|
88
|
-
rubygems_version: 1.
|
75
|
+
rubygems_version: 1.8.24
|
89
76
|
signing_key:
|
90
77
|
specification_version: 3
|
91
|
-
summary:
|
92
|
-
|
93
|
-
|
94
|
-
- test/helper.rb
|
95
|
-
- examples/database.rb
|
96
|
-
- examples/user.rb
|
97
|
-
- examples/webapp.rb
|
78
|
+
summary: Helpers for the creation of Domain Specific Languages within your libraries
|
79
|
+
and gems.
|
80
|
+
test_files: []
|
data/examples/database.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require File.join(File.dirname(__FILE__), '..', 'dsl')
|
4
|
-
|
5
|
-
class Database
|
6
|
-
class Table
|
7
|
-
def initialize
|
8
|
-
@schema = {}
|
9
|
-
@entries = []
|
10
|
-
end
|
11
|
-
|
12
|
-
def create(opts)
|
13
|
-
raise(TypeError) unless opts.is_a?(Hash)
|
14
|
-
opts.each do |name, v|
|
15
|
-
raise("key '#{name}' not defined in schema") unless @schema.has_key?(name)
|
16
|
-
if @schema[name] == :primary_key
|
17
|
-
raise('You cannot set primary keys')
|
18
|
-
else
|
19
|
-
raise("key '#{name}' not of type #{@schema[name]}") unless v.is_a?(@schema[name])
|
20
|
-
end
|
21
|
-
end
|
22
|
-
@schema.select { |name, v| v == :primary_key }.each do |name, v|
|
23
|
-
opts[name] = @entries.count
|
24
|
-
end
|
25
|
-
@entries << opts
|
26
|
-
end
|
27
|
-
|
28
|
-
def [](id)
|
29
|
-
@entries.find_all do |entry|
|
30
|
-
entry[:id] == id
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
class SchemaDSL < DSL
|
36
|
-
def primary_key(name); @schema[name] = :primary_key; end
|
37
|
-
def String(name); @schema[name] = ::String; end
|
38
|
-
def Integer(name); @schema[name] = ::Integer; end
|
39
|
-
end
|
40
|
-
|
41
|
-
def initialize
|
42
|
-
@tables = {}
|
43
|
-
end
|
44
|
-
|
45
|
-
def table(name, &blk)
|
46
|
-
if block_given?
|
47
|
-
raise("Table '#{name}' already exists") unless @tables[name].nil?
|
48
|
-
@tables[name] = Table.new
|
49
|
-
SchemaDSL.call(@tables[name], &blk)
|
50
|
-
else
|
51
|
-
@tables[name]
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
require 'ap'
|
57
|
-
|
58
|
-
db = Database.new
|
59
|
-
|
60
|
-
db.table(:users) do
|
61
|
-
primary_key :id
|
62
|
-
String :username
|
63
|
-
Integer :age
|
64
|
-
end
|
65
|
-
|
66
|
-
db.table(:users).create(:username => 'Foo', :age => 19)
|
67
|
-
db.table(:users).create(:username => 'Bar', :age => 43)
|
68
|
-
|
69
|
-
p db.table(:users)[0]
|
70
|
-
# => [{:username=>"Foo", :age=>19, :id=>0}]
|
71
|
-
|
72
|
-
p db.table(:users)[1]
|
73
|
-
# => [{:username=>"Bar", :age=>43, :id=>1}]
|
74
|
-
|
75
|
-
db.table(:users).create(:username => 'Baz', :age => 'One Hundred')
|
76
|
-
# => ERROR: key 'age' not of type Integer (RuntimeError)
|
77
|
-
|
data/examples/user.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require File.join(File.dirname(__FILE__), '..', 'dsl')
|
4
|
-
|
5
|
-
class UserDSL < DSL
|
6
|
-
def name(n); @name = n; end
|
7
|
-
def gender(g); @gender = g; end
|
8
|
-
def age(a); @age = a; end
|
9
|
-
end
|
10
|
-
|
11
|
-
class User
|
12
|
-
attr :name, :gender, :age
|
13
|
-
dsl_method :edit => UserDSL
|
14
|
-
end
|
15
|
-
|
16
|
-
ryguy = User.new
|
17
|
-
|
18
|
-
ryguy.edit do
|
19
|
-
name 'Ryan Lewis'
|
20
|
-
gender :male
|
21
|
-
age 19
|
22
|
-
end
|
23
|
-
|
24
|
-
p ryguy
|
25
|
-
# => #<User:0x00000001b6dc78 @name="Ryan Lewis", @gender=:male, @age=19>
|
data/examples/webapp.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require File.join(File.dirname(__FILE__), '..', 'dsl')
|
4
|
-
|
5
|
-
class ConfigDSL < DSL
|
6
|
-
def add_helpers(*h)
|
7
|
-
@helpers.concat(h)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class WebApp
|
12
|
-
attr :helpers
|
13
|
-
dsl_method :config => ConfigDSL
|
14
|
-
|
15
|
-
#===--- OR:
|
16
|
-
# dsl_method :config => Class.new(DSL) {
|
17
|
-
# def add_helpers(*h)
|
18
|
-
# @helpers.concat(h)
|
19
|
-
# end
|
20
|
-
# }
|
21
|
-
|
22
|
-
#===--- MAYBE:
|
23
|
-
# define_dsl_method :config do
|
24
|
-
# def add_helpers; end
|
25
|
-
# end
|
26
|
-
|
27
|
-
def initialize
|
28
|
-
@helpers = ['helpers/foo', 'helpers/bar']
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
web_app = WebApp.new
|
33
|
-
|
34
|
-
p web_app.helpers
|
35
|
-
# => ["helpers/foo", "helpers/bar"]
|
36
|
-
|
37
|
-
web_app.config do
|
38
|
-
add_helpers 'helpers/baz', 'helpers/qux'
|
39
|
-
end
|
40
|
-
|
41
|
-
p web_app.helpers
|
42
|
-
# => ["helpers/foo", "helpers/bar", "helpers/baz", "helpers/qux"]
|
43
|
-
|
data/pkg/dsl-0.1.2.gem
DELETED
Binary file
|
data/pkg/dsl-0.1.3.gem
DELETED
Binary file
|
data/test/helper.rb
DELETED