yaml_b_sides 0.2.2 → 0.3.0
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 +35 -0
- data/lib/yaml_b_sides.rb +2 -0
- data/lib/yaml_b_sides/associatable.rb +51 -0
- data/lib/yaml_b_sides/associations.rb +8 -0
- data/lib/yaml_b_sides/associations/base.rb +33 -0
- data/lib/yaml_b_sides/associations/belongs_to.rb +13 -0
- data/lib/yaml_b_sides/associations/has_many.rb +13 -0
- data/lib/yaml_b_sides/associations/has_one.rb +13 -0
- data/lib/yaml_b_sides/base.rb +4 -1
- data/lib/yaml_b_sides/indexable.rb +1 -2
- data/lib/yaml_b_sides/queriable.rb +14 -6
- data/lib/yaml_b_sides/version.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 290831d7f1b375fdc3677f8482747c435028ac5f
|
4
|
+
data.tar.gz: 8ee7a67ada8164e8bbdbeb53fae5e49b9fc99f5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9e7b2bd03c35870aec5feb6ba9a42ffd79a139f05969a79b8a6f58d9454928261c139dec9a40289a1fe9e75c3855823b9ecc3d5f3046e37b1525d9d48992118
|
7
|
+
data.tar.gz: 9066c18974a19653f8adb232a53daea75ce2dcceb26a6c88b9eb3e14c67bd7871e6e7841555852277d8a16f8625104fb49c4c51cd3978f22addf9590c29c2a6e
|
data/README.md
CHANGED
@@ -64,6 +64,18 @@ These are completely optional, but if you have a yaml file that's not uniform, a
|
|
64
64
|
* `property( name, defaul= nil )` : will set a single field. will set defaul value to nil if omitted
|
65
65
|
* `properties( props = {})` : takes a hash; will set many defaults at once
|
66
66
|
|
67
|
+
### Associations
|
68
|
+
|
69
|
+
You can define simple associations that behave very much like ActiveRecord associations. Once you define your association, you will have a method with that name that will do the lookups and cache the results for you.
|
70
|
+
|
71
|
+
* `belongs_to association`: the base object has to have the association id
|
72
|
+
* will return a single object or nil
|
73
|
+
* `has_one`: the assiociation object has the id of the base.
|
74
|
+
* will return a single object or nil
|
75
|
+
* `has_many`: the association object has the id of the base.
|
76
|
+
* will return an array
|
77
|
+
|
78
|
+
|
67
79
|
### Example
|
68
80
|
|
69
81
|
To use the `People` class from earlier, a fully fleshed out model would look something like:
|
@@ -74,11 +86,34 @@ class Person < YamlBSides::Base
|
|
74
86
|
properties url_slug: "",
|
75
87
|
bio: ""
|
76
88
|
|
89
|
+
has_many :nicknames
|
90
|
+
|
77
91
|
index :name
|
78
92
|
index :url_slug
|
79
93
|
end
|
94
|
+
|
95
|
+
class Nickname < YamlBSides::Base
|
96
|
+
belongs_to :person
|
97
|
+
end
|
98
|
+
|
99
|
+
```
|
100
|
+
|
101
|
+
and the YAML files will look like
|
102
|
+
|
103
|
+
```yml
|
104
|
+
# in people.yml
|
105
|
+
mark_twain:
|
106
|
+
name: Mark Twain
|
107
|
+
url_slug: mark-twain
|
108
|
+
#...
|
109
|
+
|
110
|
+
# in nicknames.yml
|
111
|
+
sam_clemmens:
|
112
|
+
name: Samuel Clemmens
|
113
|
+
person_id: mark_twain
|
80
114
|
```
|
81
115
|
|
116
|
+
|
82
117
|
## Setup
|
83
118
|
|
84
119
|
The setup is pretty straightforward. Yaml B-Sides wants a logger and a base dir to look for files in. An example config for a Rails app would look like:
|
data/lib/yaml_b_sides.rb
CHANGED
@@ -8,6 +8,8 @@ require 'active_support/core_ext/hash'
|
|
8
8
|
require 'yaml'
|
9
9
|
|
10
10
|
module YamlBSides
|
11
|
+
autoload :Associatable, 'yaml_b_sides/associatable'
|
12
|
+
autoload :Associations, 'yaml_b_sides/associations'
|
11
13
|
autoload :Base, 'yaml_b_sides/base'
|
12
14
|
autoload :Cacheable, 'yaml_b_sides/cacheable'
|
13
15
|
autoload :Instanceable, 'yaml_b_sides/instanceable'
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module YamlBSides
|
2
|
+
module Associatable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
class_attribute :__associations
|
7
|
+
self.__associations = {}
|
8
|
+
|
9
|
+
attr_accessor :_cached_associations
|
10
|
+
|
11
|
+
class << self
|
12
|
+
|
13
|
+
def belongs_to( name, opts = {} )
|
14
|
+
process Associations::BelongsTo.new( self, name, opts )
|
15
|
+
end
|
16
|
+
|
17
|
+
def has_one( name, opts = {} )
|
18
|
+
process Associations::HasOne.new( self, name, opts )
|
19
|
+
end
|
20
|
+
|
21
|
+
def has_many( name, opts = {} )
|
22
|
+
process Associations::HasMany.new( self, name, opts )
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def process( association )
|
28
|
+
associate association
|
29
|
+
methodize association
|
30
|
+
end
|
31
|
+
|
32
|
+
def associate( association )
|
33
|
+
self.__associations = __associations.merge association.name => association
|
34
|
+
end
|
35
|
+
|
36
|
+
def methodize( association )
|
37
|
+
define_method association.name do
|
38
|
+
self._cached_associations ||= {}
|
39
|
+
|
40
|
+
unless self._cached_associations.has_key? association.name
|
41
|
+
result = association.klass.send( association.action, association.query( self ) )
|
42
|
+
|
43
|
+
self._cached_associations[association.name] = result
|
44
|
+
end
|
45
|
+
self._cached_associations[association.name]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module YamlBSides
|
2
|
+
module Associations
|
3
|
+
autoload :Base, 'yaml_b_sides/associations/base'
|
4
|
+
autoload :BelongsTo, 'yaml_b_sides/associations/belongs_to'
|
5
|
+
autoload :HasMany, 'yaml_b_sides/associations/has_many'
|
6
|
+
autoload :HasOne, 'yaml_b_sides/associations/has_one'
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module YamlBSides
|
2
|
+
module Associations
|
3
|
+
class Base
|
4
|
+
|
5
|
+
attr_accessor :name, :opts, :key
|
6
|
+
|
7
|
+
def initialize( base_class, name, opts = {} )
|
8
|
+
self.name = name
|
9
|
+
self.opts = opts
|
10
|
+
self.key = "#{base_class.to_s.demodulize.underscore}_id"
|
11
|
+
end
|
12
|
+
|
13
|
+
def klass
|
14
|
+
@klass ||= association_class name, opts
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def association_class( name, opts = {} )
|
20
|
+
a_class = opts[:class] if opts.has_key? :class
|
21
|
+
a_class_name = opts[:class_name].constantize if opts.has_key? :class_name
|
22
|
+
derived_class = derived_class_for name
|
23
|
+
|
24
|
+
a_class || a_class_name || derived_class
|
25
|
+
end
|
26
|
+
|
27
|
+
def derived_class_for( name )
|
28
|
+
name.to_s.singularize.classify.constantize
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/yaml_b_sides/base.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module YamlBSides
|
2
2
|
class Base
|
3
3
|
include ActiveModel::Model
|
4
|
+
include Associatable
|
4
5
|
include Cacheable
|
5
6
|
include Propertiable
|
6
7
|
include Indexable
|
@@ -15,7 +16,9 @@ module YamlBSides
|
|
15
16
|
def load!
|
16
17
|
@data = YAML.load_file( data_file ).with_indifferent_access
|
17
18
|
idify_data!
|
18
|
-
|
19
|
+
logger.info "#{self} successfully loaded data"
|
20
|
+
# let's preemptively index by id so that when we do a find_by id:, or a where id: it won't table scan
|
21
|
+
index :id
|
19
22
|
rescue => e
|
20
23
|
logger.error "#{self} failed to load data: #{e}"
|
21
24
|
end
|
@@ -4,7 +4,7 @@ module YamlBSides
|
|
4
4
|
|
5
5
|
included do
|
6
6
|
class_attribute :__indices
|
7
|
-
self.__indices = {}
|
7
|
+
self.__indices = { }
|
8
8
|
|
9
9
|
class << self
|
10
10
|
def index(field)
|
@@ -28,7 +28,6 @@ module YamlBSides
|
|
28
28
|
def index_for(field)
|
29
29
|
__indices[field]
|
30
30
|
end
|
31
|
-
|
32
31
|
end
|
33
32
|
end
|
34
33
|
end
|
@@ -11,13 +11,9 @@ module YamlBSides
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def find_by(params = {})
|
14
|
-
|
15
|
-
results = find_by_indexed(params)
|
16
|
-
else
|
17
|
-
results = find_by_scan(params)
|
18
|
-
end
|
14
|
+
results = where params
|
19
15
|
raise "Could not find record that matches: #{params.inspect}" if results.empty?
|
20
|
-
|
16
|
+
results.first
|
21
17
|
end
|
22
18
|
|
23
19
|
def all
|
@@ -30,6 +26,18 @@ module YamlBSides
|
|
30
26
|
new @data.values.first
|
31
27
|
end
|
32
28
|
|
29
|
+
# TODO: move this into scopes
|
30
|
+
def where(params)
|
31
|
+
if all_indexed?(params.keys)
|
32
|
+
results = find_by_indexed(params)
|
33
|
+
else
|
34
|
+
results = find_by_scan(params)
|
35
|
+
end
|
36
|
+
results.map do |result|
|
37
|
+
new result
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
33
41
|
private
|
34
42
|
|
35
43
|
def find_by_scan(params)
|
data/lib/yaml_b_sides/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yaml_b_sides
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Orlov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -97,6 +97,12 @@ files:
|
|
97
97
|
- bin/console
|
98
98
|
- bin/setup
|
99
99
|
- lib/yaml_b_sides.rb
|
100
|
+
- lib/yaml_b_sides/associatable.rb
|
101
|
+
- lib/yaml_b_sides/associations.rb
|
102
|
+
- lib/yaml_b_sides/associations/base.rb
|
103
|
+
- lib/yaml_b_sides/associations/belongs_to.rb
|
104
|
+
- lib/yaml_b_sides/associations/has_many.rb
|
105
|
+
- lib/yaml_b_sides/associations/has_one.rb
|
100
106
|
- lib/yaml_b_sides/base.rb
|
101
107
|
- lib/yaml_b_sides/cacheable.rb
|
102
108
|
- lib/yaml_b_sides/index.rb
|