trax_core 0.0.72 → 0.0.73
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/README.md +55 -21
- data/lib/trax/core/ext/object.rb +9 -1
- data/lib/trax/core/named_class.rb +20 -0
- data/lib/trax/core/named_module.rb +31 -0
- data/lib/trax/core.rb +2 -0
- data/lib/trax_core/version.rb +1 -1
- data/spec/support/fake_namespace/named_class_support.rb +9 -0
- data/spec/support/fake_namespace/named_module_support.rb +21 -0
- data/spec/trax/core/ext/object_spec.rb +11 -0
- data/spec/trax/core/named_class_spec.rb +29 -0
- data/spec/trax/core/named_module_spec.rb +15 -0
- data/trax_core.gemspec +1 -1
- metadata +26 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5024434d1d908d0f3b6e774057686b2f10c1672
|
4
|
+
data.tar.gz: c5b7c340a2ffbcaac6a1c5657bff2d4654a9e0b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28e0707812c88b6ac6f99e6ee12122974154b291df3b598d72439769f52777be27df26d5f6a2f3928bb7f1dc2a7ec17f79f05e31ad62332724e180ff362ce282
|
7
|
+
data.tar.gz: a292fc41a2b4df6e62e7b5ed56849fa3cbae16687fddb03e90b4bfb918516ec927b855e7d0fd53f572a1139b2515349bc95040285b2d4965db04b3f3c9f95359
|
data/README.md
CHANGED
@@ -2,43 +2,77 @@
|
|
2
2
|
|
3
3
|
The active support for Trax / Trax components.
|
4
4
|
|
5
|
-
|
5
|
+
## Trax::Core::NamedClass
|
6
|
+
**Create a non anonymous class via a fully qualified class name**
|
7
|
+
*note namespace it is created in must exist prior to creation*
|
6
8
|
|
7
|
-
|
8
|
-
eagerly? Say you have the following directory tree you're trying to autoload:
|
9
|
+
Trax::Core::NamedClass.new instead of Class.new differences
|
9
10
|
|
10
|
-
|
11
|
+
1. Defines class within namespace, so no thing = some_module.const_set("Blah", Class.new) needed
|
12
|
+
2. Allows you to access the created class name within the definition block, i.e.
|
11
13
|
``` ruby
|
12
|
-
|
13
|
-
|
14
|
+
myklass = some_module.const_set("Blah", Class.new do
|
15
|
+
puts name
|
16
|
+
end)
|
17
|
+
=> nil
|
18
|
+
```
|
14
19
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
20
|
+
Will put nil, as its referencing the anonymous class. However:
|
21
|
+
``` ruby
|
22
|
+
::Trax::Core::NamedClass.new("SomeModule::Blah") do
|
23
|
+
puts name
|
19
24
|
end
|
20
|
-
|
21
|
-
Whatever.eager_load!
|
25
|
+
=> "SomeModule::Blah"
|
22
26
|
```
|
23
|
-
|
27
|
+
Holds reference to actual class being created.
|
28
|
+
|
29
|
+
3. Allows you to pass an options hash which gets evaluated as class_attribute accessor
|
30
|
+
|
24
31
|
``` ruby
|
25
|
-
module
|
26
|
-
|
32
|
+
module Html
|
33
|
+
class Element
|
27
34
|
end
|
28
35
|
end
|
36
|
+
|
37
|
+
::Trax::Core::NamedClass.new(
|
38
|
+
"Html::DivWithDimensions",
|
39
|
+
Html::Element,
|
40
|
+
:default_height => "220px",
|
41
|
+
:default_width => "220px"
|
42
|
+
)
|
43
|
+
|
44
|
+
Html::Div.default_height => "220px"
|
45
|
+
Html::Div.default_width => "220px"
|
29
46
|
```
|
30
47
|
|
31
|
-
|
48
|
+
^ is probably a bad example, but you get the idea. Also note param 2 is the class you
|
49
|
+
want to inherit from, which differs from the Class.new api which expects 1st param
|
50
|
+
to be the class you are inheriting from. Broke from that api since its optional,
|
51
|
+
and the thing that is not optional with a named class, is obviously the name.
|
32
52
|
|
53
|
+
## Trax::Core::NamedModule
|
54
|
+
**Create a non anonymous module via a fully qualified module name**
|
55
|
+
*note namespace it is created in must exist prior to creation*
|
56
|
+
|
57
|
+
### examples: (by default, any module args passed after the name of the module will be applied via extend)
|
58
|
+
**With Args:**
|
33
59
|
``` ruby
|
34
|
-
|
35
|
-
|
36
|
-
|
60
|
+
Trax::Core::NamedModule.new("Ecommerce::ItemExtensions", PricingExtension, ShippingExtension)
|
61
|
+
|
62
|
+
=> mod = Ecommerce.const_set("ItemExtensions")
|
63
|
+
mod.extend(PricingExtension)
|
64
|
+
mod.extend(ShippingExtension)
|
37
65
|
```
|
38
66
|
|
39
|
-
|
40
|
-
|
67
|
+
**With :extensions keyword**
|
68
|
+
``` ruby
|
69
|
+
Trax::Core::NamedModule.new("Ecommerce::ItemExtensions", :extensions => [::Ecommerce::PricingExtension])
|
70
|
+
```
|
41
71
|
|
72
|
+
**With :includes keyword**
|
73
|
+
``` ruby
|
74
|
+
Trax::Core::NamedModule.new("Ecommerce::ItemExtensions", :includes => [::Ecommerce::ShippingExtension])
|
75
|
+
```
|
42
76
|
|
43
77
|
## Installation
|
44
78
|
|
data/lib/trax/core/ext/object.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require "active_support/core_ext/object/try"
|
2
|
-
|
3
2
|
class Object
|
4
3
|
def as!
|
5
4
|
yield self
|
@@ -57,6 +56,15 @@ class Object
|
|
57
56
|
end
|
58
57
|
alias_method :reset_instance_variables, :remove_instance_variables
|
59
58
|
|
59
|
+
def set_fully_qualified_constant(const_name, value)
|
60
|
+
segs = const_name.split("::")
|
61
|
+
|
62
|
+
raise(::StandardError.new("Set fully qualified constant requires a preexisting namespace to set under")) unless segs.length > 1
|
63
|
+
|
64
|
+
as, on = segs.pop, segs.join("::").constantize
|
65
|
+
on.const_set(as, value)
|
66
|
+
end
|
67
|
+
|
60
68
|
#following method stolen from abrandoned https://rubygems.org/gems/try_chain
|
61
69
|
def try_chain(*symbols)
|
62
70
|
return nil if self.nil?
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Trax
|
2
|
+
module Core
|
3
|
+
class NamedClass
|
4
|
+
def self.new(_name, _parent_klass=nil, **options, &block)
|
5
|
+
klass = ::Object.set_fully_qualified_constant(_name, (_parent_klass ? ::Class.new(_parent_klass) : Class.new do
|
6
|
+
define_singleton_method(:name) { _name }
|
7
|
+
|
8
|
+
options.each_pair do |k,v|
|
9
|
+
self.class.class_attribute k
|
10
|
+
self.__send__("#{k}=", v)
|
11
|
+
end
|
12
|
+
end))
|
13
|
+
|
14
|
+
klass.instance_eval(&block) if block_given?
|
15
|
+
|
16
|
+
klass
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Trax
|
2
|
+
module Core
|
3
|
+
module NamedModule
|
4
|
+
# examples: (by default, any module args passed after the name of the module will be applied via extend)
|
5
|
+
# With Args:
|
6
|
+
# Trax::Core::NamedModule.new("Ecommerce::ItemExtensions", ::Ecommerce::PricingExtension, Ecommerce::ShippingExtension)
|
7
|
+
# With :extensions keyword
|
8
|
+
# Trax::Core::NamedModule.new("Ecommerce::ItemExtensions", :extensions => [::Ecommerce::PricingExtension])
|
9
|
+
# With :includes keyword
|
10
|
+
# Trax::Core::NamedModule.new("Ecommerce::ItemExtensions", :includes => [::Ecommerce::ShippingExtension])
|
11
|
+
|
12
|
+
def self.new(_name, *_extensions, **options, &block)
|
13
|
+
module_object = ::Object.set_fully_qualified_constant(_name, ::Module.new do
|
14
|
+
define_singleton_method(:name) do
|
15
|
+
_name
|
16
|
+
end
|
17
|
+
end)
|
18
|
+
|
19
|
+
module_object.module_eval(&block) if block_given?
|
20
|
+
|
21
|
+
includes = [options.extract!(:includes).fetch(:includes) { nil }].compact.flatten
|
22
|
+
extensions = [options.extract!(:extensions).fetch(:extensions) { nil }, _extensions].compact.flatten
|
23
|
+
|
24
|
+
extensions.each_with_object(module_object) { |ext, mod| mod.extend(ext) } if extensions.length
|
25
|
+
includes.each_with_object(module_object){ |ext, mod| mod.include(ext) } if includes.length
|
26
|
+
|
27
|
+
module_object
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/trax/core.rb
CHANGED
data/lib/trax_core/version.rb
CHANGED
@@ -0,0 +1,9 @@
|
|
1
|
+
::Trax::Core::NamedClass.new("FakeNamespace::Something", String)
|
2
|
+
::Trax::Core::NamedClass.new("FakeNamespace::SomeBlankClass")
|
3
|
+
::Trax::Core::NamedClass.new("FakeNamespace::Dmx") do
|
4
|
+
class_attribute :whats_my_name
|
5
|
+
|
6
|
+
self.whats_my_name = self.name.underscore
|
7
|
+
end
|
8
|
+
|
9
|
+
::Trax::Core::NamedClass.new("FakeNamespace::ClassWithAttributes", :length => 20, :height => 15)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module PricingExtension
|
2
|
+
BASE_PRICE = "0.00"
|
3
|
+
|
4
|
+
def price
|
5
|
+
"9.99"
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module ShippingExtension
|
10
|
+
def shipping
|
11
|
+
"9.99"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
::Trax::Core::NamedModule.new("FakeNamespace::Ecommerce", PricingExtension, ShippingExtension) do
|
16
|
+
def self.some_method
|
17
|
+
"blah"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
::Trax::Core::NamedModule.new("FakeNamespace::ThingWithIncludes", :includes => [PricingExtension])
|
@@ -24,6 +24,17 @@ describe ::Object do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
describe ".set_fully_qualified_constant" do
|
28
|
+
it "sets a fully qualified constant" do
|
29
|
+
result = Object.set_fully_qualified_constant("SomeFakeClass::SomeFakeNestedClass", Class.new)
|
30
|
+
result.name.should eq "SomeFakeClass::SomeFakeNestedClass"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "raises error if no valid namespace to set constant upon is passed" do
|
34
|
+
expect{Object.set_fully_qualified_constant("SomeFakeNestedClass", Class.new)}.to raise_error(StandardError)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
27
38
|
describe ".remove_instance_variables" do
|
28
39
|
it "reset instance variables by symbol names" do
|
29
40
|
obj = SomeFakeClass.new
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ::Trax::Core::NamedClass do
|
4
|
+
let(:fake_klass_name) { "FakeNamespace::Something" }
|
5
|
+
subject { Object.const_get(fake_klass_name) }
|
6
|
+
|
7
|
+
it { expect(subject.superclass).to eq ::String }
|
8
|
+
it { expect(subject.name).to eq fake_klass_name }
|
9
|
+
|
10
|
+
context "Does not inherit from another class" do
|
11
|
+
let(:fake_klass_name) { "FakeNamespace::SomeBlankClass" }
|
12
|
+
|
13
|
+
it { expect(subject.name).to eq fake_klass_name }
|
14
|
+
it { expect(subject.superclass).to eq ::Object }
|
15
|
+
end
|
16
|
+
|
17
|
+
context "Created class can reference its given class name when defining behavior" do
|
18
|
+
let(:fake_klass_name) { "FakeNamespace::Dmx" }
|
19
|
+
|
20
|
+
it { expect(subject.whats_my_name).to eq "fake_namespace/dmx" }
|
21
|
+
end
|
22
|
+
|
23
|
+
context "Created class accepts an options hash which defines its own attribute set at creation" do
|
24
|
+
let(:fake_klass_name) { "FakeNamespace::ClassWithAttributes" }
|
25
|
+
|
26
|
+
it { expect(subject.length).to eq 20 }
|
27
|
+
it { expect(subject.height).to eq 15 }
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ::Trax::Core::NamedModule do
|
4
|
+
let(:fake_module_name) { "FakeNamespace::Ecommerce" }
|
5
|
+
subject { Object.const_get(fake_module_name) }
|
6
|
+
|
7
|
+
it { expect(subject).to respond_to(:price) }
|
8
|
+
it { expect(subject).to respond_to(:shipping) }
|
9
|
+
it { expect(subject.some_method).to eq "blah" }
|
10
|
+
|
11
|
+
context "includes" do
|
12
|
+
let(:fake_module_name) { "FakeNamespace::ThingWithIncludes" }
|
13
|
+
it { expect(subject::BASE_PRICE).to eq "0.00" }
|
14
|
+
end
|
15
|
+
end
|
data/trax_core.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
# spec.add_development_dependency "sqlite3"
|
28
28
|
spec.add_development_dependency "rspec"
|
29
29
|
spec.add_development_dependency "rspec-pride"
|
30
|
-
|
30
|
+
spec.add_development_dependency "pry-nav"
|
31
31
|
spec.add_development_dependency "simplecov"
|
32
32
|
spec.add_development_dependency 'rspec-its', '~> 1'
|
33
33
|
spec.add_development_dependency 'rspec-collection_matchers', '~> 1'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trax_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.73
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Ayre
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry-nav
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: simplecov
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -189,6 +203,8 @@ files:
|
|
189
203
|
- lib/trax/core/isolated_mixin.rb
|
190
204
|
- lib/trax/core/mixable.rb
|
191
205
|
- lib/trax/core/mixin.rb
|
206
|
+
- lib/trax/core/named_class.rb
|
207
|
+
- lib/trax/core/named_module.rb
|
192
208
|
- lib/trax/core/primitives/enum.rb
|
193
209
|
- lib/trax/core/primitives/enum_value.rb
|
194
210
|
- lib/trax_core.rb
|
@@ -200,6 +216,8 @@ files:
|
|
200
216
|
- spec/support/ecom/widget_category.rb
|
201
217
|
- spec/support/errors.rb
|
202
218
|
- spec/support/fake_namespace.rb
|
219
|
+
- spec/support/fake_namespace/named_class_support.rb
|
220
|
+
- spec/support/fake_namespace/named_module_support.rb
|
203
221
|
- spec/support/fake_namespace/priceable.rb
|
204
222
|
- spec/support/inheritance_chain_namespace.rb
|
205
223
|
- spec/support/some_mixin.rb
|
@@ -217,6 +235,8 @@ files:
|
|
217
235
|
- spec/trax/core/ext/uri_spec.rb
|
218
236
|
- spec/trax/core/has_mixins_spec.rb
|
219
237
|
- spec/trax/core/inheritance_spec.rb
|
238
|
+
- spec/trax/core/named_class_spec.rb
|
239
|
+
- spec/trax/core/named_module_spec.rb
|
220
240
|
- spec/trax/core_spec.rb
|
221
241
|
- spec/trax/enum_spec.rb
|
222
242
|
- spec/trax/hash_spec.rb
|
@@ -253,6 +273,8 @@ test_files:
|
|
253
273
|
- spec/support/ecom/widget_category.rb
|
254
274
|
- spec/support/errors.rb
|
255
275
|
- spec/support/fake_namespace.rb
|
276
|
+
- spec/support/fake_namespace/named_class_support.rb
|
277
|
+
- spec/support/fake_namespace/named_module_support.rb
|
256
278
|
- spec/support/fake_namespace/priceable.rb
|
257
279
|
- spec/support/inheritance_chain_namespace.rb
|
258
280
|
- spec/support/some_mixin.rb
|
@@ -270,6 +292,8 @@ test_files:
|
|
270
292
|
- spec/trax/core/ext/uri_spec.rb
|
271
293
|
- spec/trax/core/has_mixins_spec.rb
|
272
294
|
- spec/trax/core/inheritance_spec.rb
|
295
|
+
- spec/trax/core/named_class_spec.rb
|
296
|
+
- spec/trax/core/named_module_spec.rb
|
273
297
|
- spec/trax/core_spec.rb
|
274
298
|
- spec/trax/enum_spec.rb
|
275
299
|
- spec/trax/hash_spec.rb
|