datasource 0.0.6 → 0.1.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 +49 -66
- data/lib/datasource/adapters/active_record.rb +10 -10
- data/lib/datasource/adapters/sequel.rb +1 -1
- data/lib/datasource/base.rb +64 -34
- data/lib/datasource/configuration.rb +23 -0
- data/lib/datasource/consumer_adapters/active_model_serializers.rb +1 -0
- data/lib/datasource.rb +11 -11
- data/lib/generators/datasource/templates/initializer.rb +10 -1
- metadata +16 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50befc547d1d02c68a29f7a73b5a75ae3038ee16
|
4
|
+
data.tar.gz: a0866c2dfbfa920696d27d2f83ef4252088c5fe7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d628e4fc124ece6b97cd373438009a27b37d78f13bc18fbef0fcdc410d1c47fdff43f174feef8f06de694141271950c05449c1da8644c8cf3d150fb22edfcd0
|
7
|
+
data.tar.gz: f334b8022a8db68d276d22168aaf4e296de0dd9a496c6df22a0a59323a87a2332f0141fa69a4806430f6e9312cfdf983ec560154c7cc07f0eb7d479858a68b56
|
data/README.md
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# Datasource
|
2
2
|
|
3
|
+
**Make sure you are reading the README corresponding to the version your are using**
|
4
|
+
|
3
5
|
Automatically preload your ORM records for your serializer.
|
4
6
|
|
5
|
-
|
7
|
+
#### Install
|
6
8
|
|
7
9
|
Add to Gemfile
|
8
10
|
|
@@ -10,9 +12,12 @@ Add to Gemfile
|
|
10
12
|
gem 'datasource'
|
11
13
|
```
|
12
14
|
|
13
|
-
|
15
|
+
```
|
16
|
+
bundle install
|
17
|
+
rails g datasource:install
|
18
|
+
```
|
14
19
|
|
15
|
-
|
20
|
+
#### Upgrade
|
16
21
|
|
17
22
|
```
|
18
23
|
rails g datasource:install
|
@@ -27,25 +32,18 @@ rails g datasource:install
|
|
27
32
|
|
28
33
|
- active_model_serializers
|
29
34
|
|
30
|
-
##
|
31
|
-
|
32
|
-
### Attributes
|
33
|
-
You don't have to do anything special.
|
34
|
-
|
35
|
-
```ruby
|
36
|
-
class UserSerializer < ActiveModel::Serializer
|
37
|
-
attributes :id, :email
|
38
|
-
end
|
39
|
-
```
|
40
|
-
|
41
|
-
But you get an optimized query for free:
|
35
|
+
## Simple Mode
|
42
36
|
|
43
|
-
|
44
|
-
|
45
|
-
|
37
|
+
Datasource is configured to run in Simple mode by default, which makes it easier
|
38
|
+
to start with, but disables some advanced optimizations. See
|
39
|
+
[Advanced mode](https://github.com/mrbrdo/datasource/wiki/Advanced-mode) for more
|
40
|
+
information after you understand Simple mode.
|
46
41
|
|
47
42
|
### Associations
|
48
|
-
|
43
|
+
|
44
|
+
The most noticable magic effect of using Datasource in Simple mode (Advanced mode
|
45
|
+
has other benefits) is that associations will automatically be preloaded using a
|
46
|
+
single query.
|
49
47
|
|
50
48
|
```ruby
|
51
49
|
class PostSerializer < ActiveModel::Serializer
|
@@ -57,45 +55,13 @@ class UserSerializer < ActiveModel::Serializer
|
|
57
55
|
has_many :posts
|
58
56
|
end
|
59
57
|
```
|
60
|
-
|
61
|
-
But you get automatic association preloading ("includes") with optimized queries for free:
|
62
|
-
|
63
58
|
```sql
|
64
|
-
SELECT
|
65
|
-
SELECT
|
59
|
+
SELECT users.* FROM users
|
60
|
+
SELECT posts.* FROM posts WHERE id IN (?)
|
66
61
|
```
|
67
62
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
```ruby
|
72
|
-
class User < ActiveRecord::Base
|
73
|
-
datasource_module do
|
74
|
-
computed :first_name_initial, :first_name
|
75
|
-
computed :both_initials, :first_name, :last_name
|
76
|
-
end
|
77
|
-
|
78
|
-
# method can be in model
|
79
|
-
def first_name_initial
|
80
|
-
first_name[0].upcase
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
class UserSerializer < ActiveModel::Serializer
|
85
|
-
attributes :first_name_initial, :last_name_initial
|
86
|
-
|
87
|
-
# method can also be in serializer
|
88
|
-
def both_initials
|
89
|
-
object.last_name[0].upcase + object.last_name[0].upcase
|
90
|
-
end
|
91
|
-
end
|
92
|
-
```
|
93
|
-
|
94
|
-
```sql
|
95
|
-
SELECT first_name, last_name FROM users
|
96
|
-
```
|
97
|
-
|
98
|
-
You will be reminded with an exception if you forget to do this.
|
63
|
+
This means you **do not** need to call `includes` yourself. It will be done
|
64
|
+
automatically by Datasource.
|
99
65
|
|
100
66
|
### Show action
|
101
67
|
|
@@ -128,8 +94,6 @@ class UsersController < ApplicationController
|
|
128
94
|
end
|
129
95
|
```
|
130
96
|
|
131
|
-
## Advanced Usage
|
132
|
-
|
133
97
|
### Query attribute
|
134
98
|
|
135
99
|
You can specify a SQL fragment for `SELECT` and use that as an attribute on your
|
@@ -150,7 +114,7 @@ end
|
|
150
114
|
```
|
151
115
|
|
152
116
|
```sql
|
153
|
-
SELECT users
|
117
|
+
SELECT users.*, (users.first_name || ' ' || users.last_name) AS full_name FROM users
|
154
118
|
```
|
155
119
|
|
156
120
|
Note: If you need data from another table, use a join in a loader (see below).
|
@@ -161,8 +125,13 @@ You might want to have some more complex preloading logic. In that case you can
|
|
161
125
|
A loader will receive ids of the records, and needs to return a hash.
|
162
126
|
The key of the hash must be the id of the record for which the value is.
|
163
127
|
|
164
|
-
A loader will only be executed if a computed attribute depends on it.
|
165
|
-
|
128
|
+
A loader will only be executed if a computed attribute depends on it. See
|
129
|
+
[Advanced mode](https://github.com/mrbrdo/datasource/wiki/Advanced-mode) for
|
130
|
+
information about computed attributes (but this works the same way in Simple mode).
|
131
|
+
A more simple alternative to loader which doesn't require computed attributes is to use
|
132
|
+
[Loaded](#loaded).
|
133
|
+
If an attribute depends on multiple loaders, pass an array of loaders like
|
134
|
+
so `computed :attr, loaders: [:loader1, :loader2]`.
|
166
135
|
|
167
136
|
Be careful that if your hash does not contain a value for the object ID, the loaded value
|
168
137
|
will be nil. However you can use the `default` option for such cases (see below example).
|
@@ -191,7 +160,7 @@ end
|
|
191
160
|
```
|
192
161
|
|
193
162
|
```sql
|
194
|
-
SELECT users
|
163
|
+
SELECT users.* FROM users
|
195
164
|
SELECT user_id, COUNT(id) FROM posts WHERE user_id IN (?)
|
196
165
|
```
|
197
166
|
|
@@ -227,8 +196,8 @@ end
|
|
227
196
|
|
228
197
|
### Loaded
|
229
198
|
|
230
|
-
Loaded is the same as loader, but it
|
231
|
-
a method with the same name on your model.
|
199
|
+
Loaded is the same as loader, but it automatically creates a computed attribute
|
200
|
+
and defines a method with the same name on your model.
|
232
201
|
|
233
202
|
Here is the previous example with `loaded` instead of `loader`:
|
234
203
|
|
@@ -265,10 +234,10 @@ class User < ActiveRecord::Base
|
|
265
234
|
.group(:user_id)
|
266
235
|
.pluck("user_id, COUNT(id)")
|
267
236
|
end
|
237
|
+
end
|
268
238
|
|
269
|
-
|
270
|
-
|
271
|
-
end
|
239
|
+
def post_count
|
240
|
+
posts.count
|
272
241
|
end
|
273
242
|
end
|
274
243
|
|
@@ -279,3 +248,17 @@ end
|
|
279
248
|
User.first.post_count # <- your method will be called
|
280
249
|
|
281
250
|
```
|
251
|
+
|
252
|
+
## Getting Help
|
253
|
+
|
254
|
+
If you find a bug, please report an [Issue](https://github.com/mrbrdo/datasource/issues/new).
|
255
|
+
|
256
|
+
If you have a question, you can also open an Issue.
|
257
|
+
|
258
|
+
## Contributing
|
259
|
+
|
260
|
+
1. Fork it ( https://github.com/mrbrdo/datasource/fork )
|
261
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
262
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
263
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
264
|
+
5. Create a new Pull Request
|
@@ -136,22 +136,20 @@ module Datasource
|
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
139
|
-
def load_association(records, name)
|
139
|
+
def load_association(records, name, assoc_select)
|
140
140
|
return if records.empty?
|
141
141
|
return if records.first.association(name.to_sym).loaded?
|
142
142
|
klass = records.first.class
|
143
143
|
if reflection = klass.reflections[name.to_sym]
|
144
144
|
assoc_class = association_klass(reflection)
|
145
145
|
datasource_class = assoc_class.default_datasource
|
146
|
-
# TODO: extract serializer_class from parent serializer association
|
147
|
-
serializer_class = Datasource::Base.consumer_adapter.get_serializer_for(assoc_class)
|
148
146
|
|
149
|
-
# TODO: can we make it use datasource scope (with_serializer)? like Sequel
|
150
147
|
scope = assoc_class.all
|
151
148
|
datasource = datasource_class.new(scope)
|
152
|
-
|
153
|
-
|
154
|
-
|
149
|
+
assoc_select_attributes = assoc_select.reject { |att| att.kind_of?(Hash) }
|
150
|
+
assoc_select_associations = assoc_select.select { |att| att.kind_of?(Hash) }
|
151
|
+
Datasource::Base.reflection_select(association_reflection(klass, name.to_sym), [], assoc_select_attributes)
|
152
|
+
datasource.select(*assoc_select_attributes)
|
155
153
|
select_values = datasource.get_select_values
|
156
154
|
|
157
155
|
begin
|
@@ -163,8 +161,10 @@ module Datasource
|
|
163
161
|
end
|
164
162
|
|
165
163
|
assoc_records = records.flat_map { |record| record.send(name) }.compact
|
166
|
-
|
167
|
-
|
164
|
+
assoc_select_associations.each do |assocs|
|
165
|
+
assocs.each_pair do |assoc_name, assoc_select|
|
166
|
+
load_association(assoc_records, assoc_name, assoc_select)
|
167
|
+
end
|
168
168
|
end
|
169
169
|
datasource.results(assoc_records)
|
170
170
|
end
|
@@ -193,7 +193,7 @@ module Datasource
|
|
193
193
|
|
194
194
|
def load_associations(ds, records)
|
195
195
|
ds.expose_associations.each_pair do |assoc_name, assoc_select|
|
196
|
-
load_association(records, assoc_name)
|
196
|
+
load_association(records, assoc_name, assoc_select)
|
197
197
|
end
|
198
198
|
end
|
199
199
|
|
data/lib/datasource/base.rb
CHANGED
@@ -83,14 +83,29 @@ module Datasource
|
|
83
83
|
end
|
84
84
|
@expose_attributes = []
|
85
85
|
@expose_associations = {}
|
86
|
+
@select_all_columns = false
|
87
|
+
end
|
88
|
+
|
89
|
+
def select_all_columns
|
90
|
+
column_attributes = self.class._attributes.values.select do |att|
|
91
|
+
att[:klass].nil?
|
92
|
+
end
|
93
|
+
columns = column_attributes.map { |att| att[:name] }
|
94
|
+
select(*columns)
|
95
|
+
@select_all_columns = true
|
96
|
+
|
97
|
+
columns
|
86
98
|
end
|
87
99
|
|
88
100
|
def select_all
|
89
|
-
|
101
|
+
attributes = self.class._attributes.keys
|
102
|
+
select(*attributes)
|
103
|
+
@select_all_columns = true
|
104
|
+
|
105
|
+
attributes
|
90
106
|
end
|
91
107
|
|
92
108
|
def select(*names)
|
93
|
-
failure = ->(name) { fail Datasource::Error, "attribute or association #{name} doesn't exist for #{self.class.orm_klass.name}, did you forget to call \"computed :#{name}, <dependencies>\" in your datasource_module?" }
|
94
109
|
newly_exposed_attributes = []
|
95
110
|
missing_attributes = []
|
96
111
|
names.each do |name|
|
@@ -99,23 +114,23 @@ module Datasource
|
|
99
114
|
assoc_name = assoc_name.to_s
|
100
115
|
if self.class._associations.key?(assoc_name)
|
101
116
|
@expose_associations[assoc_name] ||= []
|
102
|
-
@expose_associations[assoc_name]
|
117
|
+
@expose_associations[assoc_name].concat(Array(assoc_select))
|
103
118
|
@expose_associations[assoc_name].uniq!
|
104
119
|
else
|
105
120
|
missing_attributes << assoc_name
|
106
|
-
failure.call(assoc_name)
|
107
121
|
end
|
108
122
|
end
|
109
123
|
else
|
110
124
|
name = name.to_s
|
111
|
-
if
|
125
|
+
if name == "*"
|
126
|
+
newly_exposed_attributes.concat(select_all_columns.map(&:to_s))
|
127
|
+
elsif self.class._attributes.key?(name)
|
112
128
|
unless @expose_attributes.include?(name)
|
113
129
|
@expose_attributes.push(name)
|
114
130
|
newly_exposed_attributes.push(name)
|
115
131
|
end
|
116
132
|
else
|
117
133
|
missing_attributes << name
|
118
|
-
failure.call(name)
|
119
134
|
end
|
120
135
|
end
|
121
136
|
end
|
@@ -161,17 +176,28 @@ module Datasource
|
|
161
176
|
|
162
177
|
def get_select_values
|
163
178
|
scope_table = adapter.primary_scope_table(self)
|
164
|
-
|
165
|
-
# SQL select values
|
166
179
|
select_values = Set.new
|
167
|
-
select_values.add("#{scope_table}.#{self.class.primary_key}")
|
168
180
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
181
|
+
if @select_all_columns
|
182
|
+
select_values.add("#{scope_table}.*")
|
183
|
+
|
184
|
+
self.class._attributes.values.each do |att|
|
185
|
+
if att[:klass] && attribute_exposed?(att[:name])
|
186
|
+
if att[:klass].ancestors.include?(Attributes::QueryAttribute)
|
187
|
+
select_values.add("(#{att[:klass].select_value}) as #{att[:name]}")
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
else
|
192
|
+
select_values.add("#{scope_table}.#{self.class.primary_key}")
|
193
|
+
|
194
|
+
self.class._attributes.values.each do |att|
|
195
|
+
if attribute_exposed?(att[:name])
|
196
|
+
if att[:klass] == nil
|
197
|
+
select_values.add("#{scope_table}.#{att[:name]}")
|
198
|
+
elsif att[:klass].ancestors.include?(Attributes::QueryAttribute)
|
199
|
+
select_values.add("(#{att[:klass].select_value}) as #{att[:name]}")
|
200
|
+
end
|
175
201
|
end
|
176
202
|
end
|
177
203
|
end
|
@@ -207,29 +233,33 @@ module Datasource
|
|
207
233
|
def results(rows = nil)
|
208
234
|
rows ||= adapter.get_rows(self)
|
209
235
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
236
|
+
unless rows.empty?
|
237
|
+
@expose_attributes.each do |name|
|
238
|
+
att = self.class._attributes[name]
|
239
|
+
klass = att[:klass]
|
240
|
+
next unless klass
|
241
|
+
|
242
|
+
if att[:klass].ancestors.include?(Attributes::ComputedAttribute)
|
243
|
+
att[:klass]._loader_depends.each do |name|
|
244
|
+
if loader = self.class._loaders[name]
|
245
|
+
if loaded_values = loader.load(rows.map(&self.class.primary_key), rows, @scope)
|
246
|
+
unless rows.first.loaded_values
|
247
|
+
rows.each do |row|
|
248
|
+
row.loaded_values = {}
|
249
|
+
end
|
250
|
+
end
|
223
251
|
rows.each do |row|
|
224
|
-
|
252
|
+
key = row.send(self.class.primary_key)
|
253
|
+
if loaded_values.key?(key)
|
254
|
+
row.loaded_values[name] = loaded_values[key]
|
255
|
+
elsif loader.default_value
|
256
|
+
row.loaded_values[name] = loader.default_value
|
257
|
+
end
|
225
258
|
end
|
226
259
|
end
|
227
|
-
|
228
|
-
|
229
|
-
end
|
260
|
+
else
|
261
|
+
raise Datasource::Error, "loader with name :#{name} could not be found"
|
230
262
|
end
|
231
|
-
else
|
232
|
-
raise Datasource::Error, "loader with name :#{name} could not be found"
|
233
263
|
end
|
234
264
|
end
|
235
265
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Datasource
|
2
|
+
module Configuration
|
3
|
+
include ActiveSupport::Configurable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do |base|
|
7
|
+
base.config.adapters = Configuration.default_adapters
|
8
|
+
base.config.simple_mode = false
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.default_adapters
|
12
|
+
default_adapters = []
|
13
|
+
if defined? ActiveRecord
|
14
|
+
default_adapters.push(:activerecord)
|
15
|
+
elsif defined? Sequel
|
16
|
+
default_adapters.push(:sequel)
|
17
|
+
end
|
18
|
+
if defined? ActiveModel::Serializer
|
19
|
+
default_adapters.push(:ams)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -36,6 +36,7 @@ module Datasource
|
|
36
36
|
def to_datasource_select(result, klass, serializer = nil, serializer_assoc = nil, adapter = nil)
|
37
37
|
adapter ||= Datasource::Base.default_adapter
|
38
38
|
serializer ||= get_serializer_for(klass, serializer_assoc)
|
39
|
+
result.unshift("*") if Datasource.config.simple_mode
|
39
40
|
result.concat(serializer._attributes)
|
40
41
|
result_assocs = {}
|
41
42
|
result.push(result_assocs)
|
data/lib/datasource.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
require 'datasource/configuration'
|
1
2
|
module Datasource
|
2
3
|
Error = Class.new(StandardError)
|
3
4
|
RecursionError = Class.new(StandardError)
|
5
|
+
include Configuration
|
4
6
|
|
5
7
|
AdapterPaths = {
|
6
8
|
activerecord: 'datasource/adapters/active_record',
|
@@ -12,25 +14,23 @@ module Datasource
|
|
12
14
|
|
13
15
|
module_function
|
14
16
|
def load(*adapters)
|
15
|
-
|
16
|
-
adapters
|
17
|
-
|
18
|
-
adapters.push(:activerecord)
|
19
|
-
elsif defined? Sequel
|
20
|
-
adapters.push(:sequel)
|
21
|
-
end
|
22
|
-
if defined? ActiveModel::Serializer
|
23
|
-
adapters.push(:ams)
|
24
|
-
end
|
17
|
+
unless adapters.empty?
|
18
|
+
warn "[DEPRECATION] passing adapters to Datasource.load is deprecated. Use Datasource.setup instead."
|
19
|
+
config.adapters = adapters
|
25
20
|
end
|
26
21
|
|
27
|
-
adapters.each do |adapter|
|
22
|
+
config.adapters.each do |adapter|
|
28
23
|
adapter = AdapterPaths[adapter]
|
29
24
|
adapter = AdapterPaths[adapter] if adapter.is_a?(Symbol)
|
30
25
|
require adapter
|
31
26
|
end
|
32
27
|
end
|
33
28
|
|
29
|
+
def setup
|
30
|
+
yield(config)
|
31
|
+
load
|
32
|
+
end
|
33
|
+
|
34
34
|
def orm_adapters
|
35
35
|
@orm_adapters ||= begin
|
36
36
|
Datasource::Adapters.constants.map { |name| Datasource::Adapters.const_get(name) }
|
@@ -1 +1,10 @@
|
|
1
|
-
Datasource.
|
1
|
+
Datasource.setup do |config|
|
2
|
+
# Adapters to load
|
3
|
+
# Available ORM adapters: activerecord, sequel
|
4
|
+
# Available Serializer adapters: active_model_serializers
|
5
|
+
config.adapters = [:activerecord, :active_model_serializers]
|
6
|
+
|
7
|
+
# Enable simple mode, which will always select all model database columns,
|
8
|
+
# making Datasource easier to use. See documentation for details.
|
9
|
+
config.simple_mode = true
|
10
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datasource
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Berdajs
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rspec
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,20 +94,6 @@ dependencies:
|
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0.9'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: activesupport
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '4'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '4'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: sequel
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -139,6 +139,7 @@ files:
|
|
139
139
|
- lib/datasource/attributes/loader.rb
|
140
140
|
- lib/datasource/attributes/query_attribute.rb
|
141
141
|
- lib/datasource/base.rb
|
142
|
+
- lib/datasource/configuration.rb
|
142
143
|
- lib/datasource/consumer_adapters/active_model_serializers.rb
|
143
144
|
- lib/datasource/serializer.rb
|
144
145
|
- lib/generators/datasource/install_generator.rb
|