frozen_record 0.9.0 → 0.10.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 +29 -1
- data/lib/frozen_record/backends/yaml.rb +27 -0
- data/lib/frozen_record/base.rb +6 -5
- data/lib/frozen_record/version.rb +1 -1
- data/spec/fixtures/animals.json +14 -0
- data/spec/frozen_record_spec.rb +6 -1
- data/spec/support/animal.rb +16 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69d17666ac957cc0d3b75d51f49692a41be67947
|
4
|
+
data.tar.gz: 51214e7c50fae48f90a2bdf586cd351a266f028c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6ea860e92550663a785be7589fc4740d15ec86ff8b2a42aecdf7d026f76b5fd674993b91d459570458a87130b780a2e054a1a2668864d4b94d0035c52211a1a
|
7
|
+
data.tar.gz: 5ff4a501f9996fdfc845a6cefad6571614c832fc865f70e5fc18ea4226a2d643aa73d4443c463f4b255f93da86125207ff345382ef571f7f1051d58e4b74123b
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
[](https://coveralls.io/r/byroot/frozen_record)
|
6
6
|
[](http://badge.fury.io/rb/frozen_record)
|
7
7
|
|
8
|
-
ActiveRecord-like interface for **read only** access to
|
8
|
+
ActiveRecord-like interface for **read only** access to static data files.
|
9
9
|
|
10
10
|
## Installation
|
11
11
|
|
@@ -44,6 +44,34 @@ class Country < FrozenRecord::Base
|
|
44
44
|
end
|
45
45
|
```
|
46
46
|
|
47
|
+
You can also specify a custom backend. Backends are classes that know how to
|
48
|
+
load records from a static file. By default FrozenRecord expects an YAML file,
|
49
|
+
but this option can be changed per model:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
class Country < FrozenRecord::Base
|
53
|
+
self.backend = FrozenRecord::Backends::Yaml
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
### Custom backends
|
58
|
+
|
59
|
+
A valid backend must implement two class methods, `filename` and `load`.
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
class MyCustomBackend
|
63
|
+
class << self
|
64
|
+
def filename(model_name)
|
65
|
+
# Returns the file name as a String
|
66
|
+
end
|
67
|
+
|
68
|
+
def load(file_path)
|
69
|
+
# Reads file and returns records as an Array of Hash objects
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
```
|
74
|
+
|
47
75
|
## Query interface
|
48
76
|
|
49
77
|
FrozenRecord aim to replicate only modern ActiveRecord querying interface, and only the non "string typed" ones.
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module FrozenRecord
|
2
|
+
module Backends
|
3
|
+
module Yaml
|
4
|
+
extend self
|
5
|
+
|
6
|
+
# Transforms the model name into a valid filename.
|
7
|
+
#
|
8
|
+
# @param format [String] the model name that inherits
|
9
|
+
# from FrozenRecord::Base
|
10
|
+
# @return [String] the file name.
|
11
|
+
def filename(model_name)
|
12
|
+
"#{model_name.underscore.pluralize}.yml"
|
13
|
+
end
|
14
|
+
|
15
|
+
# Reads file in `file_path` and return records.
|
16
|
+
#
|
17
|
+
# @param format [String] the file path
|
18
|
+
# @return [Array] an Array of Hash objects with keys being attributes.
|
19
|
+
def load(file_path)
|
20
|
+
yml_erb_data = File.read(file_path)
|
21
|
+
yml_data = ERB.new(yml_erb_data).result
|
22
|
+
|
23
|
+
YAML.load(yml_data) || []
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/frozen_record/base.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'set'
|
2
2
|
require 'active_support/descendants_tracker'
|
3
|
+
require 'frozen_record/backends/yaml'
|
3
4
|
|
4
5
|
module FrozenRecord
|
5
6
|
class Base
|
@@ -21,6 +22,9 @@ module FrozenRecord
|
|
21
22
|
class_attribute :primary_key
|
22
23
|
self.primary_key = :id
|
23
24
|
|
25
|
+
class_attribute :backend
|
26
|
+
self.backend = FrozenRecord::Backends::Yaml
|
27
|
+
|
24
28
|
class_attribute :auto_reloading
|
25
29
|
|
26
30
|
attribute_method_suffix '?'
|
@@ -64,7 +68,7 @@ module FrozenRecord
|
|
64
68
|
|
65
69
|
def file_path
|
66
70
|
raise ArgumentError, "You must define `#{name}.base_path`" unless base_path
|
67
|
-
File.join(base_path,
|
71
|
+
File.join(base_path, backend.filename(name))
|
68
72
|
end
|
69
73
|
|
70
74
|
def respond_to_missing?(name, *)
|
@@ -91,10 +95,7 @@ module FrozenRecord
|
|
91
95
|
end
|
92
96
|
|
93
97
|
@records ||= begin
|
94
|
-
|
95
|
-
yml_data = ERB.new(yml_erb_data).result
|
96
|
-
|
97
|
-
records = YAML.load(yml_data) || []
|
98
|
+
records = backend.load(file_path)
|
98
99
|
define_attribute_methods(list_attributes(records))
|
99
100
|
records.map(&method(:new)).freeze
|
100
101
|
end
|
data/spec/frozen_record_spec.rb
CHANGED
@@ -55,11 +55,16 @@ describe FrozenRecord::Base do
|
|
55
55
|
|
56
56
|
describe '#load_records' do
|
57
57
|
|
58
|
-
it 'processes erb' do
|
58
|
+
it 'processes erb by default' do
|
59
59
|
country = Country.first
|
60
60
|
expect(country.capital).to be == 'Ottawa'
|
61
61
|
end
|
62
62
|
|
63
|
+
it 'loads records with a custom backend' do
|
64
|
+
animal = Animal.first
|
65
|
+
expect(animal.name).to be == 'cat'
|
66
|
+
end
|
67
|
+
|
63
68
|
end
|
64
69
|
|
65
70
|
describe '#==' do
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module JsonBackend
|
2
|
+
extend self
|
3
|
+
|
4
|
+
def filename(model_name)
|
5
|
+
"#{model_name.underscore.pluralize}.json"
|
6
|
+
end
|
7
|
+
|
8
|
+
def load(file_path)
|
9
|
+
json_data = File.read(file_path)
|
10
|
+
JSON.parse(json_data) || []
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Animal < FrozenRecord::Base
|
15
|
+
self.backend = JsonBackend
|
16
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: frozen_record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean Boussier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -110,15 +110,18 @@ files:
|
|
110
110
|
- Rakefile
|
111
111
|
- frozen_record.gemspec
|
112
112
|
- lib/frozen_record.rb
|
113
|
+
- lib/frozen_record/backends/yaml.rb
|
113
114
|
- lib/frozen_record/base.rb
|
114
115
|
- lib/frozen_record/scope.rb
|
115
116
|
- lib/frozen_record/version.rb
|
117
|
+
- spec/fixtures/animals.json
|
116
118
|
- spec/fixtures/cars.yml
|
117
119
|
- spec/fixtures/countries.yml
|
118
120
|
- spec/frozen_record_spec.rb
|
119
121
|
- spec/scope_spec.rb
|
120
122
|
- spec/spec_helper.rb
|
121
123
|
- spec/support/abstract_model.rb
|
124
|
+
- spec/support/animal.rb
|
122
125
|
- spec/support/car.rb
|
123
126
|
- spec/support/country.rb
|
124
127
|
homepage: https://github.com/byroot/frozen_record
|
@@ -146,11 +149,13 @@ signing_key:
|
|
146
149
|
specification_version: 4
|
147
150
|
summary: ActiveRecord like interface to read only access and query static YAML files
|
148
151
|
test_files:
|
152
|
+
- spec/fixtures/animals.json
|
149
153
|
- spec/fixtures/cars.yml
|
150
154
|
- spec/fixtures/countries.yml
|
151
155
|
- spec/frozen_record_spec.rb
|
152
156
|
- spec/scope_spec.rb
|
153
157
|
- spec/spec_helper.rb
|
154
158
|
- spec/support/abstract_model.rb
|
159
|
+
- spec/support/animal.rb
|
155
160
|
- spec/support/car.rb
|
156
161
|
- spec/support/country.rb
|