dsl_companion 0.0.1 → 0.1.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.
- checksums.yaml +4 -4
- data/lib/dsl_companion.rb +6 -1
- data/lib/dsl_companion/features/basic.rb +43 -0
- data/lib/dsl_companion/helpers/context_helper.rb +1 -42
- data/lib/dsl_companion/interpreter.rb +6 -12
- data/lib/dsl_companion/meta_helper.rb +38 -0
- data/lib/dsl_companion/version.rb +1 -1
- data/spec/interpreter_spec.rb +30 -4
- metadata +3 -3
- data/lib/dsl_companion/injection.rb +0 -22
- data/lib/dsl_companion/meta_programming.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3fd835850cec2614e0af45d5ef719662d26b7939
|
4
|
+
data.tar.gz: a1fc45e56860006570ffce9ff1feda47ed3db132
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f37505af4d96812117db3e69c250e0fbebbf3c8e2bcc0d5fd1d9481579e6e2bd07bf8f20cecea0f80b7225416ba8ca4db0f6829ea5df3c4fa70dc8dba6f3e682
|
7
|
+
data.tar.gz: 4664de8232f5e4801c1cdf792964a0ef5927fddc125c49dc47ca71f135f7573ba0cc8fda2b6dcf91c04e3d86985e4afb6ce90bd71803e380044af04f201e3bfb
|
data/lib/dsl_companion.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
require 'dsl_companion/version'
|
2
|
-
require 'dsl_companion/
|
2
|
+
require 'dsl_companion/meta_helper'
|
3
3
|
require 'dsl_companion/helpers/context_helper'
|
4
4
|
require 'dsl_companion/helpers/active_record'
|
5
|
+
|
6
|
+
# Preloaded features
|
7
|
+
require 'dsl_companion/features/basic'
|
8
|
+
|
9
|
+
# The interpreter
|
5
10
|
require 'dsl_companion/interpreter'
|
6
11
|
|
7
12
|
module DSLCompanion
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module DSLCompanion
|
2
|
+
module Features
|
3
|
+
|
4
|
+
module Basic
|
5
|
+
|
6
|
+
include MetaHelper
|
7
|
+
|
8
|
+
# If any method named define_<something>(*args) is in the DSL, then it provides an alternate
|
9
|
+
# generic syntax of define(:something, *args)
|
10
|
+
# @param [Object[]] args
|
11
|
+
# @param [Proc] block
|
12
|
+
# @return [Anything returned by th emethod]
|
13
|
+
def define *args, &block
|
14
|
+
extra = args.shift
|
15
|
+
method_name = "define_#{extra}"
|
16
|
+
if respond_to? method_name.to_sym
|
17
|
+
block_given? ? self.send(method_name, *args, &block) : self.send(method_name, *args)
|
18
|
+
else
|
19
|
+
block_given? ? method_missing(method_name.to_sym, *args, & block) : method_missing(method_name.to_sym, *args)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def interpreter?
|
24
|
+
self.is_a? DSLHelper::Interpreter
|
25
|
+
end
|
26
|
+
|
27
|
+
def interpreter
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
def logger(msg, level=:info)
|
32
|
+
if @logger.nil?
|
33
|
+
STDERR.puts "#{level.to_s.upcase}: #{msg}"
|
34
|
+
else
|
35
|
+
@logger.send level, msg
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -2,7 +2,7 @@ module DSLCompanion
|
|
2
2
|
|
3
3
|
module ContextHelper
|
4
4
|
|
5
|
-
def execute_within_context
|
5
|
+
def execute_within_context(context=@context, &block)
|
6
6
|
# Execute the block if any
|
7
7
|
if block_given?
|
8
8
|
last_saved_context = @context
|
@@ -18,47 +18,6 @@ module DSLCompanion
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
# def with_dictionary &block
|
23
|
-
# @within_dictionary = true
|
24
|
-
#
|
25
|
-
# raise "'with_dictionary' cannot be processed in this context !" unless interpreter?
|
26
|
-
# execute_within_context @context, &block
|
27
|
-
# ensure
|
28
|
-
# @within_dictionary = false
|
29
|
-
# end
|
30
|
-
|
31
|
-
def define *args, &block
|
32
|
-
extra = args.shift
|
33
|
-
method_name = "define_#{extra}"
|
34
|
-
if respond_to? method_name.to_sym
|
35
|
-
block_given? ? self.send(method_name, *args, &block) : self.send(method_name, *args)
|
36
|
-
else
|
37
|
-
block_given? ? method_missing(method_name.to_sym, *args, & block) : method_missing(method_name.to_sym, *args)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
# def within_dictionary?
|
42
|
-
# if interpreter?
|
43
|
-
# @within_dictionary
|
44
|
-
# else
|
45
|
-
# @interpreter.within_dictionary?
|
46
|
-
# end
|
47
|
-
# end
|
48
|
-
|
49
|
-
def interpreter?
|
50
|
-
self.is_a? DSLHelper::Interpreter
|
51
|
-
end
|
52
|
-
|
53
|
-
def interpreter_exec_mode mode=nil
|
54
|
-
if mode.nil?
|
55
|
-
@interpreter.exec_mode
|
56
|
-
else
|
57
|
-
@interpreter.exec_mode = mode
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
|
62
21
|
end
|
63
22
|
|
64
23
|
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module DSLCompanion
|
2
|
+
|
2
3
|
class Interpreter
|
3
4
|
|
4
|
-
|
5
|
+
include DSLCompanion::Features::Basic
|
6
|
+
|
7
|
+
attr_writer :logger
|
5
8
|
|
6
9
|
DEFAULT_EXEC_MODE=:lazy
|
7
10
|
|
@@ -59,19 +62,10 @@ module DSLCompanion
|
|
59
62
|
message += ' is unknown'
|
60
63
|
message += " within DSL file: '#{@source_code_file}'" unless @source_code_file.nil?
|
61
64
|
message += '.'
|
62
|
-
|
65
|
+
logger message, :error unless exec_strict_mode?
|
63
66
|
raise message if exec_strict_mode?
|
64
67
|
end
|
65
68
|
|
66
|
-
private
|
67
|
-
|
68
|
-
def report(msg)
|
69
|
-
if logger.nil?
|
70
|
-
puts msg
|
71
|
-
else
|
72
|
-
logger.error msg
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
69
|
end
|
70
|
+
|
77
71
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module MetaHelper
|
2
|
+
|
3
|
+
def metaclass
|
4
|
+
class << self
|
5
|
+
self
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def meta_eval &block
|
10
|
+
metaclass.instance_eval &block
|
11
|
+
end
|
12
|
+
|
13
|
+
# Adds method to metaclass
|
14
|
+
def meta_def( name, &block )
|
15
|
+
meta_eval { define_method name, &block }
|
16
|
+
end
|
17
|
+
|
18
|
+
# Defines an instance method within a class
|
19
|
+
def class_def( name, &block )
|
20
|
+
class_eval { define_method name, &block }
|
21
|
+
end
|
22
|
+
|
23
|
+
def inject_variable(name, value)
|
24
|
+
# Inject instance variable in the current context
|
25
|
+
injected_accessor = name.to_s.to_sym
|
26
|
+
injected_instance_variable = "@#{injected_accessor}"
|
27
|
+
already_defined = self.instance_variable_defined? injected_instance_variable
|
28
|
+
logger("DSL Interpreter overriding existing variable '#{injected_instance_variable}'", :warn) if already_defined
|
29
|
+
self.instance_variable_set injected_instance_variable, value
|
30
|
+
|
31
|
+
# Defines the method that returns the instance variable and inject into the interpreter's context
|
32
|
+
meta_def "#{injected_accessor}" do
|
33
|
+
self.instance_variable_get injected_instance_variable
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/spec/interpreter_spec.rb
CHANGED
@@ -13,22 +13,49 @@ describe DSLCompanion::Interpreter do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'should allow to add extra features through modules' do
|
16
|
-
|
17
|
-
module ExtraModule
|
16
|
+
module ExtraFeatureModule
|
18
17
|
def extra_dsl_command
|
19
18
|
|
20
19
|
end
|
21
20
|
end
|
22
21
|
|
23
22
|
interpreter = subject.new :strict
|
24
|
-
interpreter.add_feature
|
23
|
+
interpreter.add_feature ExtraFeatureModule
|
25
24
|
|
26
25
|
expect(interpreter.respond_to? :extra_dsl_command).to be_truthy
|
27
26
|
expect {interpreter.run {extra_dsl_command} }.not_to raise_error
|
28
27
|
expect {interpreter.run {unknown_command} }.to raise_error
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should give access to some convenience methods' do
|
31
|
+
interpreter = subject.new
|
32
|
+
expect(interpreter.respond_to? :define).to be_truthy
|
33
|
+
expect(interpreter.respond_to? :interpreter).to be_truthy
|
34
|
+
expect(interpreter.respond_to? :interpreter?).to be_truthy
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should be able to inject new variables in interpreter' do
|
38
|
+
|
39
|
+
module ExtraFeatureModule
|
40
|
+
def define_stuff stuff_name, value
|
41
|
+
interpreter.inject_variable stuff_name, value
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
interpreter = subject.new :strict
|
46
|
+
interpreter.add_feature ExtraFeatureModule
|
47
|
+
|
48
|
+
interpreter.run do
|
49
|
+
define_stuff :pipo, 'Hello world'
|
50
|
+
end
|
51
|
+
expect {interpreter.run {typo == 'Hello world'} }.to raise_error
|
52
|
+
expect {interpreter.run {pipo == 'Hello world'} }.not_to raise_error
|
29
53
|
|
30
54
|
end
|
31
55
|
|
56
|
+
|
57
|
+
|
58
|
+
|
32
59
|
context 'when in lazy mode' do
|
33
60
|
|
34
61
|
it 'should only report through logging errors in the DSL' do
|
@@ -43,7 +70,6 @@ describe DSLCompanion::Interpreter do
|
|
43
70
|
it 'should raise exceptions if errors in the DSL'do
|
44
71
|
interpreter = subject.new :strict
|
45
72
|
expect {interpreter.run {unknown_command} }.to raise_error
|
46
|
-
|
47
73
|
end
|
48
74
|
|
49
75
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dsl_companion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Laurent B.
|
@@ -67,11 +67,11 @@ files:
|
|
67
67
|
- Rakefile
|
68
68
|
- dsl_companion.gemspec
|
69
69
|
- lib/dsl_companion.rb
|
70
|
+
- lib/dsl_companion/features/basic.rb
|
70
71
|
- lib/dsl_companion/helpers/active_record.rb
|
71
72
|
- lib/dsl_companion/helpers/context_helper.rb
|
72
|
-
- lib/dsl_companion/injection.rb
|
73
73
|
- lib/dsl_companion/interpreter.rb
|
74
|
-
- lib/dsl_companion/
|
74
|
+
- lib/dsl_companion/meta_helper.rb
|
75
75
|
- lib/dsl_companion/version.rb
|
76
76
|
- spec/interpreter_spec.rb
|
77
77
|
- spec/spec_helper.rb
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module DSLCompanion
|
2
|
-
|
3
|
-
module Injection
|
4
|
-
|
5
|
-
def inject(var_name, target)
|
6
|
-
# Inject instance variable in the interpreter context
|
7
|
-
injected_accessor = name.to_s.gsub(/^\s+/, '').tr(' ', '_').underscore.to_sym
|
8
|
-
injected_instance_variable = "@#{injected_accessor}"
|
9
|
-
already_defined = self.instance_variable_defined? injected_instance_variable
|
10
|
-
Rails.logger.warn("DSL Interpreter: Overriding existing variable '#{injected_instance_variable}'") if already_defined
|
11
|
-
self.instance_variable_set injected_instance_variable, target
|
12
|
-
|
13
|
-
# Defines the method that returns the instance variable and inject into the interpreter's context
|
14
|
-
meta_def "#{injected_accessor}" do
|
15
|
-
self.instance_variable_get injected_instance_variable
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
@@ -1,22 +0,0 @@
|
|
1
|
-
class Object
|
2
|
-
|
3
|
-
def metaclass
|
4
|
-
class << self
|
5
|
-
self
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
def meta_eval &block
|
10
|
-
metaclass.instance_eval &block
|
11
|
-
end
|
12
|
-
|
13
|
-
# Adds method to metaclass
|
14
|
-
def meta_def( name, &block )
|
15
|
-
meta_eval { define_method name, &block }
|
16
|
-
end
|
17
|
-
|
18
|
-
# Defines an instance method within a class
|
19
|
-
def class_def( name, &block )
|
20
|
-
class_eval { define_method name, &block }
|
21
|
-
end
|
22
|
-
end
|