eapi 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +44 -0
- data/lib/eapi.rb +18 -6
- data/lib/eapi/children.rb +21 -5
- data/lib/eapi/common.rb +13 -2
- data/lib/eapi/version.rb +1 -1
- data/spec/extension_spec.rb +50 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce4210341572090ddcab6a924eef6512c26790a8
|
4
|
+
data.tar.gz: 1773ccd9aa977cd193f4efd802cc1a11abe6d2b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c9beaa7358443dee5acdc658dd422a679376c2a29af2db1d6efdc780c47020ea8fc69c2aa2bdeb2e8d5c9b098544fd1a6bf1cb785eb18cc38ce85c9b588f682
|
7
|
+
data.tar.gz: f4d071de2e5e10e4300509088e3f60fcd6d173a1492766f95eab6600bb991ae28e77eda3b2d0484ed003a51432c5f2480700bec076b17804c85934d7c1856f78
|
data/README.md
CHANGED
@@ -516,6 +516,50 @@ obj.is_an_one_thing? # => true
|
|
516
516
|
obj.is_a_super_duper_thing? # => false
|
517
517
|
```
|
518
518
|
|
519
|
+
### Use in your own library
|
520
|
+
|
521
|
+
You can add the functionality of Eapi to your own library module, and use it instead of `Eapi::Common`.
|
522
|
+
|
523
|
+
Method-call-initialise shortcut can ignore the base name:
|
524
|
+
|
525
|
+
```ruby
|
526
|
+
module MyExtension
|
527
|
+
extend Eapi
|
528
|
+
end
|
529
|
+
|
530
|
+
class TestKlass
|
531
|
+
include MyExtension::Common
|
532
|
+
property :something
|
533
|
+
end
|
534
|
+
|
535
|
+
obj = MyExtension.test_klass something: 1
|
536
|
+
obj.something # => 1
|
537
|
+
|
538
|
+
|
539
|
+
# if the class is in the same module, it can be omitted when using the object creation shortcut
|
540
|
+
|
541
|
+
module MyExtension
|
542
|
+
class TestKlassInside
|
543
|
+
include MyExtension::Common
|
544
|
+
property :something
|
545
|
+
end
|
546
|
+
end
|
547
|
+
|
548
|
+
obj = MyExtension.my_extension_test_klass_inside something: 1
|
549
|
+
obj.something # => 1
|
550
|
+
|
551
|
+
obj = MyExtension.test_klass_inside something: 1
|
552
|
+
obj.something # => 1
|
553
|
+
```
|
554
|
+
|
555
|
+
### important note:
|
556
|
+
|
557
|
+
As it works now, the children of your extension will be also children of `Eapi`, so calling `Eapi.your_klass` and `YourExtension.your_klass` will do the same.
|
558
|
+
|
559
|
+
## TODO
|
560
|
+
|
561
|
+
1. `type` option in property definition to accept symbol -> if a class can be recognised by that name, it works ok. If not, it still uses that for type validation (using `is?`) but it does not use that in the `init_` method.
|
562
|
+
|
519
563
|
## Contributing
|
520
564
|
|
521
565
|
1. Fork it ( https://github.com/eturino/eapi/fork )
|
data/lib/eapi.rb
CHANGED
@@ -13,12 +13,24 @@ require 'eapi/common'
|
|
13
13
|
|
14
14
|
|
15
15
|
module Eapi
|
16
|
-
def self.
|
17
|
-
klass
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
def self.add_method_missing(klass)
|
17
|
+
def klass.method_missing(method, *args, &block)
|
18
|
+
child_klass = Eapi::Children.get(method, self)
|
19
|
+
if child_klass
|
20
|
+
child_klass.new *args, &block
|
21
|
+
else
|
22
|
+
super
|
23
|
+
end
|
22
24
|
end
|
23
25
|
end
|
26
|
+
|
27
|
+
add_method_missing self
|
28
|
+
|
29
|
+
def self.extended(mod)
|
30
|
+
mod.class_eval <<-CODE
|
31
|
+
Common = Eapi::Common
|
32
|
+
Children = Eapi::Children
|
33
|
+
CODE
|
34
|
+
Eapi.add_method_missing mod
|
35
|
+
end
|
24
36
|
end
|
data/lib/eapi/children.rb
CHANGED
@@ -11,20 +11,36 @@ module Eapi
|
|
11
11
|
CHILDREN[k] = klass
|
12
12
|
end
|
13
13
|
|
14
|
-
def self.get(klass_name)
|
15
|
-
k =
|
16
|
-
|
17
|
-
|
18
|
-
CHILDREN.select { |key, _| key.gsub('/', '_') == k }.values.first
|
14
|
+
def self.get(klass_name, base_class = nil)
|
15
|
+
k = key_for klass_name
|
16
|
+
|
17
|
+
find(k) || find_bare(base_class, k)
|
19
18
|
end
|
20
19
|
|
21
20
|
def self.has?(klass_name)
|
22
21
|
!!self.get(klass_name)
|
23
22
|
end
|
24
23
|
|
24
|
+
private
|
25
|
+
def self.find(k)
|
26
|
+
CHILDREN[k] ||
|
27
|
+
CHILDREN[k.gsub('__', '/')] ||
|
28
|
+
CHILDREN.select { |key, _| key.gsub('/', '_') == k }.values.first
|
29
|
+
end
|
30
|
+
|
25
31
|
def self.key_for(klass_name)
|
26
32
|
k = klass_name.to_s
|
27
33
|
k.underscore
|
28
34
|
end
|
35
|
+
|
36
|
+
def self.find_bare(base_class, k)
|
37
|
+
if base_class.present?
|
38
|
+
base_key = key_for(base_class)
|
39
|
+
find "#{base_key}/#{k}"
|
40
|
+
else
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
29
45
|
end
|
30
46
|
end
|
data/lib/eapi/common.rb
CHANGED
@@ -1,11 +1,22 @@
|
|
1
1
|
module Eapi
|
2
2
|
module Common
|
3
|
-
|
4
|
-
included do |klass|
|
3
|
+
def self.add_features(klass)
|
5
4
|
Eapi::Children.append klass
|
6
5
|
klass.send :include, ActiveModel::Validations
|
7
6
|
klass.send :include, Eapi::Methods::Properties::InstanceMethods
|
8
7
|
klass.send :include, Eapi::Methods::Types::InstanceMethods
|
8
|
+
|
9
|
+
klass.send :extend, ClassMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.extended(mod)
|
13
|
+
def mod.included(klass)
|
14
|
+
Eapi::Common.add_features klass
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.included(klass)
|
19
|
+
Eapi::Common.add_features klass
|
9
20
|
end
|
10
21
|
|
11
22
|
def initialize(** properties)
|
data/lib/eapi/version.rb
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Eapi do
|
4
|
+
|
5
|
+
context 'extension in other modules' do
|
6
|
+
module MyExtension
|
7
|
+
extend Eapi
|
8
|
+
end
|
9
|
+
|
10
|
+
class MyExtensionExternalKlass
|
11
|
+
include MyExtension::Common
|
12
|
+
|
13
|
+
property :something
|
14
|
+
end
|
15
|
+
|
16
|
+
module MyExtension
|
17
|
+
class TestKlass
|
18
|
+
include MyExtension::Common
|
19
|
+
|
20
|
+
property :something
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'creates a MyExtension::Common module that works as Eapi::Common' do
|
25
|
+
it 'adds classes that includes the new module to Eapi children' do
|
26
|
+
expect(Eapi::Children).to be_has MyExtensionExternalKlass
|
27
|
+
expect(MyExtension::Children).to be_has MyExtensionExternalKlass
|
28
|
+
|
29
|
+
expect(Eapi::Children).to be_has MyExtension::TestKlass
|
30
|
+
expect(MyExtension::Children).to be_has MyExtension::TestKlass
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'creation shortcut' do
|
35
|
+
it 'allows the new module to be used for object creation shortcut' do
|
36
|
+
obj = MyExtension.my_extension_external_klass something: 1
|
37
|
+
expect(obj.to_h).to eq({something: 1})
|
38
|
+
end
|
39
|
+
|
40
|
+
describe 'if classes are inside the module, the name can be ignored with creation shortcut' do
|
41
|
+
it 'MyExtension.test_klass(..) => MyExtension::TestKlass.new(..)' do
|
42
|
+
obj = MyExtension.test_klass something: 1
|
43
|
+
expect(obj).to be_a_kind_of MyExtension::TestKlass
|
44
|
+
expect(obj.to_h).to eq({something: 1})
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo Turiño
|
@@ -195,6 +195,7 @@ files:
|
|
195
195
|
- lib/eapi/version.rb
|
196
196
|
- spec/basic_spec.rb
|
197
197
|
- spec/definition_spec.rb
|
198
|
+
- spec/extension_spec.rb
|
198
199
|
- spec/function_spec.rb
|
199
200
|
- spec/list_spec.rb
|
200
201
|
- spec/spec_helper.rb
|
@@ -229,6 +230,7 @@ summary: ruby gem for building complex structures that will end up in hashes (in
|
|
229
230
|
test_files:
|
230
231
|
- spec/basic_spec.rb
|
231
232
|
- spec/definition_spec.rb
|
233
|
+
- spec/extension_spec.rb
|
232
234
|
- spec/function_spec.rb
|
233
235
|
- spec/list_spec.rb
|
234
236
|
- spec/spec_helper.rb
|