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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4450c3089f0ffa33bd64349a3f6a06e3e2c93192
4
- data.tar.gz: 81c39bf6c311568c9b1ab3e633209622bc8c2798
3
+ metadata.gz: 90429495e92b8775651aac719580cdac47e97e14
4
+ data.tar.gz: 3084f05b8ca664ad0e4df95a85ba7623d39a2952
5
5
  SHA512:
6
- metadata.gz: 56fe3c9044b3e0f416b363615269344ec5150292a422964fed7c05002e614b4cd7feb7a6137738287d443cfc2f8d3ef8aae3c061f776b7019573131e5cbf5124
7
- data.tar.gz: a5d8ce35078e0cf74a313dbfbb7da8ce5312955dac27b06ba3c92582b06dee58d917cc1e055ca64f5ad4c390bde769b01ccd2214291f71974afeee05af9856de
6
+ metadata.gz: 64c345261de3bebc73b2f1bc76528794e634ed569736480477f8892d728e1c9ec14859d4af249efa72187d5f07b63fe3f981b32e35469093eedf1de087f229a6
7
+ data.tar.gz: 8120abd9422fdc9bb658637dd0d0e9fa7d40a346562d6a4ad5bb3ebdb9388a13ce8cc4effad0b81c6be8ae900a30707fa987c51335e05528cf87b40b2bb11a59
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
1
  source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
+
5
+ gem 'rake'
6
+ gem 'alki-testing'
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require 'alki/testing/tasks'
2
+
3
+ task default: [:test]
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")
@@ -2,146 +2,163 @@ require 'forwardable'
2
2
  require 'alki/support'
3
3
 
4
4
  module Alki
5
- class ClassBuilder
6
- def self.create_constant(name,value = Class.new, parent=nil)
7
- parent ||= Object
8
- *ans, ln = name.to_s.split('::')
9
- ans.each do |a|
10
- unless parent.const_defined? a
11
- parent.const_set a, Module.new
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
- parent = parent.const_get a
16
+
17
+ parent.const_set ln, value
14
18
  end
15
19
 
16
- parent.const_set ln, value
17
- end
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
- def self.build(data)
20
- class_name = data[:constant_name]
21
- if !class_name && data[:name]
22
- class_name = Alki::Support.classify(data[:name])
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
- klass = Alki::Support.constantize class_name, data[:parent_class] if class_name
26
- must_create = !klass
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
- if klass.class != Module
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 = Module.new
35
- end
36
- else
37
- if klass && klass.class != Class
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
- super_class = if data[:super_class]
41
- Alki.load data[:super_class]
42
- else
43
- Object
54
+
55
+ if must_create_constant
56
+ create_constant class_name, klass, data[:parent_class]
44
57
  end
45
- if klass
46
- if klass.superclass != super_class
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
- build_class data, klass
54
- if class_name && must_create
55
- create_constant class_name, klass, data[:parent_class]
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: klass,constant_name: data[:subclass])
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
- def self.module_not_empty?(mod)
71
- not mod.instance_methods.empty? &&
72
- mod.private_instance_methods.empty?
73
- end
86
+ def module_not_empty?(mod)
87
+ not mod.instance_methods.empty? &&
88
+ mod.private_instance_methods.empty?
89
+ end
74
90
 
75
- def self.build_class(data,klass)
76
- if data[:module]
77
- if module_not_empty? data[:module]
78
- klass.include data[:module]
79
- end
80
- if data[:module].const_defined?(:ClassMethods) &&
81
- module_not_empty?(data[:module]::ClassMethods)
82
- klass.extend data[:module]::ClassMethods
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
- if data[:modules]
87
- data[:modules].each do |mod|
88
- klass.include Alki.load mod
102
+ if data[:modules]
103
+ data[:modules].each do |mod|
104
+ klass.include Alki.load mod
105
+ end
89
106
  end
90
- end
91
- if data[:class_modules]
92
- data[:class_modules].each do |mod|
93
- klass.extend Alki.load mod
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
- add_methods klass, data
98
- add_initialize klass, data[:initialize_params] if data[:initialize_params]
99
- end
113
+ add_methods klass, data
114
+ add_initialize klass, data[:initialize_params] if data[:initialize_params]
115
+ end
100
116
 
101
- def self.add_methods(klass, data)
102
- if data[:class_methods]
103
- data[:class_methods].each do |name, method|
104
- klass.define_singleton_method name, &method[:body]
105
- klass.singleton_class.send :private, name if method[:private]
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
- if data[:instance_methods]
110
- data[:instance_methods].each do |name, method|
111
- klass.send :define_method, name, &method[:body]
112
- klass.send :private, name if method[:private]
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
- if data[:delegators]
117
- klass.extend Forwardable
118
- data[:delegators].each do |name,delegator|
119
- klass.def_delegator delegator[:accessor], delegator[:method], name
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
- klass.send :attr_reader, *data[:attr_readers] if data[:attr_readers]
124
- klass.send :attr_writer, *data[:attr_writers] if data[:attr_writers]
125
- klass.send :attr_accessor, *data[:attr_accessors] if data[:attr_accessors]
126
- end
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
- def self.add_initialize(klass,params)
129
- at_setters = ''
130
- params.each do |p|
131
- p,default = p.is_a?(Array) ? p : [p,nil]
132
- if default
133
- default_method = "_default_#{p}".to_sym
134
- klass.send(:define_method, default_method, &default)
135
- klass.send :private, default_method
136
- at_setters << "@#{p} = #{p} || #{default_method}\n"
137
- else
138
- at_setters << "@#{p} = #{p}\n"
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
- klass.class_eval "
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
@@ -1,5 +1,5 @@
1
1
  module Alki
2
2
  module Dsl
3
- VERSION = '0.5.0'
3
+ VERSION = '0.5.1'
4
4
  end
5
5
  end
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.0
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-05-16 00:00:00.000000000 Z
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
- - !ruby/object:Gem::Dependency
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: '0.1'
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