adapter-registry 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +13 -0
- data/README.md +73 -0
- data/adapter-registry.gemspec +24 -0
- data/lib/adapter-registry/implementation.rb +45 -0
- data/lib/adapter-registry/registry.rb +27 -0
- data/lib/adapter-registry/version.rb +5 -0
- data/lib/adapter-registry.rb +34 -0
- metadata +54 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: eb5d6f841887d5b267b73b91cf09784d71037c6b
|
4
|
+
data.tar.gz: 26a72a8a54287a5a81bdf5a61277e70db25e0822
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8ce7cdf9e0634da117e95f31249f42a0eff85fef8975d4925f17797326fe7e5308ba1efa7dd9745680f2a181437c546b9120ef843ea16d53cf53c344d9d1000d
|
7
|
+
data.tar.gz: b2a823568648950a46cbcd6239ad99d180bd21e18d4fbba3d590833e8cc1924dccf743c2b9a4f76543ad316633a9a89934c1ea8d3f7e8479cad38362f8940858
|
data/LICENSE
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright (c) 2013 RadarServices Smart IT-Security <gems@radarservices.com>
|
2
|
+
|
3
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
4
|
+
purpose with or without fee is hereby granted, provided that the above
|
5
|
+
copyright notice and this permission notice appear in all copies.
|
6
|
+
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
8
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
9
|
+
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
10
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
11
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
12
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
13
|
+
PERFORMANCE OF THIS SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# Adapter Registry
|
2
|
+
|
3
|
+
provides a generic registry for traits and classes, where a class adapter can
|
4
|
+
be stored and recalled in the correct context.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
```
|
9
|
+
$ gem install adapter-registry
|
10
|
+
```
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
require 'adapter-registry'
|
14
|
+
```
|
15
|
+
|
16
|
+
or use ``gem 'adapter-registry'`` in your Gemfile when using bundler.
|
17
|
+
|
18
|
+
##Examples
|
19
|
+
|
20
|
+
### Implementing Adapters
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
require 'adapter-registry'
|
24
|
+
|
25
|
+
class SomeClass
|
26
|
+
end
|
27
|
+
|
28
|
+
class SomeOtherClass < SomeClass
|
29
|
+
end
|
30
|
+
|
31
|
+
class SomeAdapter
|
32
|
+
|
33
|
+
include AdapterRegistry::Implementation
|
34
|
+
|
35
|
+
implements :something # trait, defines the lookup context
|
36
|
+
adapts_instance SomeClass # stores the trait/class combination in the registry
|
37
|
+
|
38
|
+
#...
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
class SomeClassAdapter
|
43
|
+
|
44
|
+
include AdapterRegistry::Implementation
|
45
|
+
|
46
|
+
implements :something
|
47
|
+
adapts_class SomeClass # stores the trait/class or ancestor combination in the registry
|
48
|
+
|
49
|
+
#...
|
50
|
+
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
### Initialization
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
require 'adapter-registry'
|
58
|
+
|
59
|
+
AdapterRegistry.load_directories(['./lib/some_adapters', './lib/some_other_adapters'])
|
60
|
+
```
|
61
|
+
|
62
|
+
The ``load`` section should be used in an initializer when using Rails. ``adapter-registry`` uses ``require_dependency`` in favour of ``require`` when included in a Rails context.
|
63
|
+
|
64
|
+
### Usage
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
obj = SomeClass.new
|
68
|
+
adapter = AdapterRegistry.get(:something, obj)
|
69
|
+
|
70
|
+
class_adapter = AdapterRegistry.get(:something, SomeOtherClass)
|
71
|
+
|
72
|
+
some_other_instance = class_adapter.new # uses the same adapter because SomeClass is an ancestor
|
73
|
+
```
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), 'lib', 'adapter-registry', 'version')
|
4
|
+
|
5
|
+
require 'date'
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "adapter-registry"
|
9
|
+
s.version = AdapterRegistry::VERSION
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.authors = ["Andreas Kopecky <andreas.kopecky@radarservices.com>", "Anton Bangratz <anton.bangratz@radarservices.com>", "Martin Natano <martin.natano@radarservices.com"]
|
13
|
+
s.date = Date.today.strftime
|
14
|
+
s.description = "Simple adapter registry"
|
15
|
+
s.email = "gems [a] radarservices [d] com"
|
16
|
+
s.files = `git ls-files`.split("\n").reject { |file| file == '.gitignore' }
|
17
|
+
s.extra_rdoc_files = %w[LICENSE README.md]
|
18
|
+
|
19
|
+
s.homepage = "http://github.com/rs-dev/adapter-registry"
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
# s.rubygems_version = "1.8.24"
|
22
|
+
s.summary = "Simple adapter registry for enhancing classes via adapters"
|
23
|
+
s.license = "ISC"
|
24
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module AdapterRegistry
|
2
|
+
|
3
|
+
module Implementation
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.extend(ClassMethods)
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
attr_accessor :traits
|
11
|
+
def implements(*traits)
|
12
|
+
self.traits = traits
|
13
|
+
end
|
14
|
+
|
15
|
+
def adapts_instance(*klasses)
|
16
|
+
adapts do |context|
|
17
|
+
klasses.any? { |klass| context.is_a?(klass) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def adapts_class(*klasses)
|
22
|
+
adapts do |context|
|
23
|
+
context.is_a?(Class) && klass_is_a?(context, *klasses)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def adapts(&block)
|
28
|
+
self.traits.each do |trait|
|
29
|
+
Adapter.register(trait, self, &block)
|
30
|
+
end if (self.traits && block)
|
31
|
+
end
|
32
|
+
|
33
|
+
def instance_for(context)
|
34
|
+
self.new(context)
|
35
|
+
end
|
36
|
+
|
37
|
+
def klass_is_a?(klass, *klasses)
|
38
|
+
(klasses.map(&:to_s) & klass.ancestors.map(&:name)).any?
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module AdapterRegistry
|
2
|
+
|
3
|
+
class Registry < Hash
|
4
|
+
def get_adapter(trait, context)
|
5
|
+
if trait_registry = self[trait]
|
6
|
+
trait_registry.select do |entry|
|
7
|
+
entry[:for].call(context)
|
8
|
+
end.first.try(:[], :adapter)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def get(trait, context)
|
13
|
+
if adapter = get_adapter(trait, context)
|
14
|
+
adapter.instance_for(context)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def set(trait, adapter, &block)
|
19
|
+
self[trait] ||= Set.new
|
20
|
+
self[trait] << {
|
21
|
+
adapter: adapter,
|
22
|
+
for: block,
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'adapter-registry/registry'
|
2
|
+
require 'adapter-registry/implementation'
|
3
|
+
|
4
|
+
module AdapterRegistry
|
5
|
+
|
6
|
+
def self.registry
|
7
|
+
@@registry ||= Registry.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.get(trait, context)
|
11
|
+
registry.get(trait, context)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.register(trait, adapter, &block)
|
15
|
+
registry.set(trait, adapter, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.load_directory(path)
|
19
|
+
Dir[path].each do |file|
|
20
|
+
if defined?(Rails)
|
21
|
+
require_dependency(file)
|
22
|
+
else
|
23
|
+
require(file)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.load_directories(paths)
|
29
|
+
paths.each do |path|
|
30
|
+
self.load_directory(path)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: adapter-registry
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andreas Kopecky <andreas.kopecky@radarservices.com>
|
8
|
+
- Anton Bangratz <anton.bangratz@radarservices.com>
|
9
|
+
- Martin Natano <martin.natano@radarservices.com
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-07-10 00:00:00.000000000 Z
|
14
|
+
dependencies: []
|
15
|
+
description: Simple adapter registry
|
16
|
+
email: gems [a] radarservices [d] com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files:
|
20
|
+
- LICENSE
|
21
|
+
- README.md
|
22
|
+
files:
|
23
|
+
- LICENSE
|
24
|
+
- README.md
|
25
|
+
- adapter-registry.gemspec
|
26
|
+
- lib/adapter-registry.rb
|
27
|
+
- lib/adapter-registry/implementation.rb
|
28
|
+
- lib/adapter-registry/registry.rb
|
29
|
+
- lib/adapter-registry/version.rb
|
30
|
+
homepage: http://github.com/rs-dev/adapter-registry
|
31
|
+
licenses:
|
32
|
+
- ISC
|
33
|
+
metadata: {}
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options: []
|
36
|
+
require_paths:
|
37
|
+
- lib
|
38
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
requirements: []
|
49
|
+
rubyforge_project:
|
50
|
+
rubygems_version: 2.0.3
|
51
|
+
signing_key:
|
52
|
+
specification_version: 4
|
53
|
+
summary: Simple adapter registry for enhancing classes via adapters
|
54
|
+
test_files: []
|