alki-dsl 0.5.0 → 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.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/Rakefile +3 -0
- data/alki-dsl.gemspec +1 -2
- data/bin/bundler +17 -0
- data/bin/rake +17 -0
- data/lib/alki/class_builder.rb +116 -99
- data/lib/alki/dsl/version.rb +1 -1
- metadata +10 -15
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 90429495e92b8775651aac719580cdac47e97e14
|
|
4
|
+
data.tar.gz: 3084f05b8ca664ad0e4df95a85ba7623d39a2952
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 64c345261de3bebc73b2f1bc76528794e634ed569736480477f8892d728e1c9ec14859d4af249efa72187d5f07b63fe3f981b32e35469093eedf1de087f229a6
|
|
7
|
+
data.tar.gz: 8120abd9422fdc9bb658637dd0d0e9fa7d40a346562d6a4ad5bb3ebdb9388a13ce8cc4effad0b81c6be8ae900a30707fa987c51335e05528cf87b40b2bb11a59
|
data/Gemfile
CHANGED
data/Rakefile
ADDED
data/alki-dsl.gemspec
CHANGED
|
@@ -18,6 +18,5 @@ Gem::Specification.new do |spec|
|
|
|
18
18
|
spec.require_paths = ["lib"]
|
|
19
19
|
|
|
20
20
|
spec.add_dependency 'alki-support', '~> 0.7'
|
|
21
|
-
spec.add_dependency 'alki-loader', '~> 0.2'
|
|
22
|
-
spec.add_development_dependency 'alki-testing', '~> 0.1'
|
|
21
|
+
spec.add_dependency 'alki-loader', '~> 0.2', '>= 0.2.2'
|
|
23
22
|
end
|
data/bin/bundler
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
#
|
|
4
|
+
# This file was generated by Bundler.
|
|
5
|
+
#
|
|
6
|
+
# The application 'bundler' is installed as part of a gem, and
|
|
7
|
+
# this file is here to facilitate running it.
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
require "pathname"
|
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
|
12
|
+
Pathname.new(__FILE__).realpath)
|
|
13
|
+
|
|
14
|
+
require "rubygems"
|
|
15
|
+
require "bundler/setup"
|
|
16
|
+
|
|
17
|
+
load Gem.bin_path("bundler", "bundler")
|
data/bin/rake
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
#
|
|
4
|
+
# This file was generated by Bundler.
|
|
5
|
+
#
|
|
6
|
+
# The application 'rake' is installed as part of a gem, and
|
|
7
|
+
# this file is here to facilitate running it.
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
require "pathname"
|
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
|
12
|
+
Pathname.new(__FILE__).realpath)
|
|
13
|
+
|
|
14
|
+
require "rubygems"
|
|
15
|
+
require "bundler/setup"
|
|
16
|
+
|
|
17
|
+
load Gem.bin_path("rake", "rake")
|
data/lib/alki/class_builder.rb
CHANGED
|
@@ -2,146 +2,163 @@ require 'forwardable'
|
|
|
2
2
|
require 'alki/support'
|
|
3
3
|
|
|
4
4
|
module Alki
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
parent.
|
|
5
|
+
module ClassBuilder
|
|
6
|
+
class << self
|
|
7
|
+
def create_constant(name,value = Class.new, parent=nil)
|
|
8
|
+
parent ||= Object
|
|
9
|
+
*ans, ln = name.to_s.split('::')
|
|
10
|
+
ans.each do |a|
|
|
11
|
+
unless parent.const_defined? a
|
|
12
|
+
parent.const_set a, Module.new
|
|
13
|
+
end
|
|
14
|
+
parent = parent.const_get a
|
|
12
15
|
end
|
|
13
|
-
|
|
16
|
+
|
|
17
|
+
parent.const_set ln, value
|
|
14
18
|
end
|
|
15
19
|
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
def build(data)
|
|
21
|
+
class_name = data[:constant_name]
|
|
22
|
+
if !class_name && data[:name]
|
|
23
|
+
class_name = Alki::Support.classify(data[:name])
|
|
24
|
+
end
|
|
18
25
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
26
|
+
klass = find_or_create_class(class_name, data)
|
|
27
|
+
|
|
28
|
+
build_class data, klass
|
|
29
|
+
|
|
30
|
+
if data[:secondary_classes]
|
|
31
|
+
build_secondary_classes data[:secondary_classes], klass
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
klass
|
|
23
35
|
end
|
|
24
36
|
|
|
25
|
-
|
|
26
|
-
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def find_or_create_class(class_name, data)
|
|
40
|
+
type = data[:type] || :class
|
|
41
|
+
klass = Alki::Support.constantize class_name, data[:parent_class] if class_name
|
|
42
|
+
must_create_constant = !klass && class_name
|
|
43
|
+
|
|
44
|
+
super_class = data[:super_class] ? Alki.load(data[:super_class]) : Object
|
|
27
45
|
|
|
28
|
-
if data[:type] == :module
|
|
29
46
|
if klass
|
|
30
|
-
|
|
31
|
-
raise "#{class_name} already exists as is a #{klass.class}"
|
|
32
|
-
end
|
|
47
|
+
validate_existing_class(type, class_name, klass, super_class)
|
|
33
48
|
else
|
|
34
|
-
klass =
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
raise "#{class_name} already exists as is a #{klass.class}"
|
|
49
|
+
klass = case type
|
|
50
|
+
when :module then Module.new
|
|
51
|
+
when :class then Class.new(super_class)
|
|
52
|
+
end
|
|
39
53
|
end
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
Object
|
|
54
|
+
|
|
55
|
+
if must_create_constant
|
|
56
|
+
create_constant class_name, klass, data[:parent_class]
|
|
44
57
|
end
|
|
45
|
-
|
|
46
|
-
|
|
58
|
+
klass
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def validate_existing_class(type, class_name, klass, super_class)
|
|
62
|
+
if type == :module
|
|
63
|
+
if klass.class != Module
|
|
64
|
+
raise "#{class_name} already exists as a #{klass.class}"
|
|
65
|
+
end
|
|
66
|
+
elsif type == :class
|
|
67
|
+
if klass.class != Class
|
|
68
|
+
raise "#{class_name} already exists as a #{klass.class}"
|
|
69
|
+
elsif klass.superclass != super_class
|
|
47
70
|
raise "#{class_name} already exists with different super class"
|
|
48
71
|
end
|
|
49
|
-
else
|
|
50
|
-
klass = Class.new super_class
|
|
51
72
|
end
|
|
52
73
|
end
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
end
|
|
57
|
-
if data[:secondary_classes]
|
|
58
|
-
data[:secondary_classes].each do |data|
|
|
74
|
+
|
|
75
|
+
def build_secondary_classes(secondary_classes, parent_class)
|
|
76
|
+
secondary_classes.each do |data|
|
|
59
77
|
if data[:subclass]
|
|
60
|
-
data = data.merge(parent_class:
|
|
78
|
+
data = data.merge(parent_class: parent_class,constant_name: data[:subclass])
|
|
61
79
|
elsif !data[:constant_name] && !data[:name]
|
|
62
80
|
raise ArgumentError.new("Secondary classes must have names")
|
|
63
81
|
end
|
|
64
82
|
build data
|
|
65
83
|
end
|
|
66
84
|
end
|
|
67
|
-
klass
|
|
68
|
-
end
|
|
69
85
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
86
|
+
def module_not_empty?(mod)
|
|
87
|
+
not mod.instance_methods.empty? &&
|
|
88
|
+
mod.private_instance_methods.empty?
|
|
89
|
+
end
|
|
74
90
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
91
|
+
def build_class(data,klass)
|
|
92
|
+
if data[:module]
|
|
93
|
+
if module_not_empty? data[:module]
|
|
94
|
+
klass.include data[:module]
|
|
95
|
+
end
|
|
96
|
+
if data[:module].const_defined?(:ClassMethods) &&
|
|
97
|
+
module_not_empty?(data[:module]::ClassMethods)
|
|
98
|
+
klass.extend data[:module]::ClassMethods
|
|
99
|
+
end
|
|
83
100
|
end
|
|
84
|
-
end
|
|
85
101
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
102
|
+
if data[:modules]
|
|
103
|
+
data[:modules].each do |mod|
|
|
104
|
+
klass.include Alki.load mod
|
|
105
|
+
end
|
|
89
106
|
end
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
107
|
+
if data[:class_modules]
|
|
108
|
+
data[:class_modules].each do |mod|
|
|
109
|
+
klass.extend Alki.load mod
|
|
110
|
+
end
|
|
94
111
|
end
|
|
95
|
-
end
|
|
96
112
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
113
|
+
add_methods klass, data
|
|
114
|
+
add_initialize klass, data[:initialize_params] if data[:initialize_params]
|
|
115
|
+
end
|
|
100
116
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
117
|
+
def add_methods(klass, data)
|
|
118
|
+
if data[:class_methods]
|
|
119
|
+
data[:class_methods].each do |name, method|
|
|
120
|
+
klass.define_singleton_method name, &method[:body]
|
|
121
|
+
klass.singleton_class.send :private, name if method[:private]
|
|
122
|
+
end
|
|
106
123
|
end
|
|
107
|
-
end
|
|
108
124
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
125
|
+
if data[:instance_methods]
|
|
126
|
+
data[:instance_methods].each do |name, method|
|
|
127
|
+
klass.send :define_method, name, &method[:body]
|
|
128
|
+
klass.send :private, name if method[:private]
|
|
129
|
+
end
|
|
113
130
|
end
|
|
114
|
-
end
|
|
115
131
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
132
|
+
if data[:delegators]
|
|
133
|
+
klass.extend Forwardable
|
|
134
|
+
data[:delegators].each do |name,delegator|
|
|
135
|
+
klass.def_delegator delegator[:accessor], delegator[:method], name
|
|
136
|
+
end
|
|
120
137
|
end
|
|
121
|
-
end
|
|
122
138
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
139
|
+
klass.send :attr_reader, *data[:attr_readers] if data[:attr_readers]
|
|
140
|
+
klass.send :attr_writer, *data[:attr_writers] if data[:attr_writers]
|
|
141
|
+
klass.send :attr_accessor, *data[:attr_accessors] if data[:attr_accessors]
|
|
142
|
+
end
|
|
127
143
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
144
|
+
def add_initialize(klass,params)
|
|
145
|
+
at_setters = ''
|
|
146
|
+
params.each do |p|
|
|
147
|
+
p,default = p.is_a?(Array) ? p : [p,nil]
|
|
148
|
+
if default
|
|
149
|
+
default_method = "_default_#{p}".to_sym
|
|
150
|
+
klass.send(:define_method, default_method, &default)
|
|
151
|
+
klass.send :private, default_method
|
|
152
|
+
at_setters << "@#{p} = #{p} || #{default_method}\n"
|
|
153
|
+
else
|
|
154
|
+
at_setters << "@#{p} = #{p}\n"
|
|
155
|
+
end
|
|
139
156
|
end
|
|
140
|
-
end
|
|
141
157
|
|
|
142
|
-
|
|
158
|
+
klass.class_eval "
|
|
143
159
|
def initialize(#{params.map{|p| p.is_a?(Array) ? "#{p[0]}=nil" : p.to_s}.join(', ')})
|
|
144
160
|
#{at_setters}end"
|
|
161
|
+
end
|
|
145
162
|
end
|
|
146
163
|
end
|
|
147
164
|
end
|
data/lib/alki/dsl/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: alki-dsl
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.5.
|
|
4
|
+
version: 0.5.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Matt Edlefsen
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-
|
|
11
|
+
date: 2017-07-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: alki-support
|
|
@@ -31,6 +31,9 @@ dependencies:
|
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
33
|
version: '0.2'
|
|
34
|
+
- - ">="
|
|
35
|
+
- !ruby/object:Gem::Version
|
|
36
|
+
version: 0.2.2
|
|
34
37
|
type: :runtime
|
|
35
38
|
prerelease: false
|
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -38,20 +41,9 @@ dependencies:
|
|
|
38
41
|
- - "~>"
|
|
39
42
|
- !ruby/object:Gem::Version
|
|
40
43
|
version: '0.2'
|
|
41
|
-
-
|
|
42
|
-
name: alki-testing
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - "~>"
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '0.1'
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - "~>"
|
|
44
|
+
- - ">="
|
|
53
45
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
46
|
+
version: 0.2.2
|
|
55
47
|
description: Library for defining and using DSLs
|
|
56
48
|
email:
|
|
57
49
|
- matt.edlefsen@gmail.com
|
|
@@ -62,7 +54,10 @@ files:
|
|
|
62
54
|
- ".gitignore"
|
|
63
55
|
- Gemfile
|
|
64
56
|
- README.adoc
|
|
57
|
+
- Rakefile
|
|
65
58
|
- alki-dsl.gemspec
|
|
59
|
+
- bin/bundler
|
|
60
|
+
- bin/rake
|
|
66
61
|
- lib/alki/class_builder.rb
|
|
67
62
|
- lib/alki/dsl.rb
|
|
68
63
|
- lib/alki/dsl/base.rb
|