alki-dsl 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|