frozen_record 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Coverage Status](https://coveralls.io/repos/byroot/frozen_record/badge.svg)](https://coveralls.io/r/byroot/frozen_record)
|
6
6
|
[![Gem Version](https://badge.fury.io/rb/frozen_record.svg)](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
|