baza_models 0.0.13 → 0.0.14
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/.rubocop.yml +134 -25
- data/.rubocop_todo.yml +47 -32
- data/Gemfile +3 -1
- data/Gemfile.lock +55 -48
- data/Rakefile +2 -4
- data/VERSION +1 -1
- data/baza_models.gemspec +9 -4
- data/lib/baza_models/autoloader.rb +1 -0
- data/lib/baza_models/errors.rb +2 -3
- data/lib/baza_models/model.rb +22 -21
- data/lib/baza_models/model/belongs_to_relations.rb +1 -3
- data/lib/baza_models/model/has_many_relations.rb +2 -2
- data/lib/baza_models/model/has_one_relations.rb +2 -2
- data/lib/baza_models/model/manipulation.rb +20 -18
- data/lib/baza_models/model/queries.rb +2 -0
- data/lib/baza_models/model/scopes.rb +1 -0
- data/lib/baza_models/model/validations.rb +1 -0
- data/lib/baza_models/query.rb +12 -10
- data/lib/baza_models/query/inspector.rb +2 -0
- data/lib/baza_models/query/pagination.rb +5 -7
- data/lib/baza_models/query/sql_generator.rb +3 -3
- data/lib/baza_models/ransacker.rb +3 -1
- data/lib/baza_models/ransacker/relationship_scanner.rb +3 -0
- data/lib/baza_models/validators/confirmation_validator.rb +1 -3
- data/lib/baza_models/validators/uniqueness_validator.rb +2 -4
- data/peak_flow.yml +1 -0
- data/spec/baza_models/autoloader_spec.rb +1 -1
- data/spec/baza_models/baza_orm_adapter_spec.rb +1 -1
- data/spec/baza_models/model/has_many_relations_spec.rb +1 -1
- data/spec/baza_models/model/manipulation_spec.rb +3 -3
- data/spec/baza_models/model_spec.rb +22 -4
- data/spec/baza_models/query_spec.rb +14 -6
- data/spec/spec_helper.rb +1 -1
- data/spec/support/database_helper.rb +6 -3
- data/spec/test_classes/user.rb +2 -1
- metadata +30 -3
- data/spec/baza_models_spec.rb +0 -4
data/Rakefile
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require "rubygems"
|
4
2
|
require "bundler"
|
5
3
|
begin
|
6
4
|
Bundler.setup(:default, :development)
|
7
5
|
rescue Bundler::BundlerError => e
|
8
|
-
|
9
|
-
|
6
|
+
warn e.message
|
7
|
+
warn "Run `bundle install` to install missing gems"
|
10
8
|
exit e.status_code
|
11
9
|
end
|
12
10
|
require "rake"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.14
|
data/baza_models.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: baza_models 0.0.
|
5
|
+
# stub: baza_models 0.0.14 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "baza_models".freeze
|
9
|
-
s.version = "0.0.
|
9
|
+
s.version = "0.0.14"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["kaspernj".freeze]
|
14
|
-
s.date = "
|
14
|
+
s.date = "2021-01-02"
|
15
15
|
s.description = "ActiveRecord like models for the Baza database framework".freeze
|
16
16
|
s.email = "k@spernj.org".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -92,7 +92,6 @@ Gem::Specification.new do |s|
|
|
92
92
|
"spec/baza_models/validators/format_validator_spec.rb",
|
93
93
|
"spec/baza_models/validators/length_validator_spec.rb",
|
94
94
|
"spec/baza_models/validators/uniqueness_validator_spec.rb",
|
95
|
-
"spec/baza_models_spec.rb",
|
96
95
|
"spec/factories/organization.rb",
|
97
96
|
"spec/factories/user.rb",
|
98
97
|
"spec/spec_helper.rb",
|
@@ -127,6 +126,8 @@ Gem::Specification.new do |s|
|
|
127
126
|
s.add_development_dependency(%q<rdoc>.freeze, [">= 0"])
|
128
127
|
s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
|
129
128
|
s.add_development_dependency(%q<rubocop>.freeze, [">= 0"])
|
129
|
+
s.add_development_dependency(%q<rubocop-performance>.freeze, [">= 0"])
|
130
|
+
s.add_development_dependency(%q<rubocop-rspec>.freeze, [">= 0"])
|
130
131
|
s.add_development_dependency(%q<sqlite3>.freeze, [">= 0"])
|
131
132
|
else
|
132
133
|
s.add_dependency(%q<array_enumerator>.freeze, [">= 0"])
|
@@ -144,6 +145,8 @@ Gem::Specification.new do |s|
|
|
144
145
|
s.add_dependency(%q<rdoc>.freeze, [">= 0"])
|
145
146
|
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
146
147
|
s.add_dependency(%q<rubocop>.freeze, [">= 0"])
|
148
|
+
s.add_dependency(%q<rubocop-performance>.freeze, [">= 0"])
|
149
|
+
s.add_dependency(%q<rubocop-rspec>.freeze, [">= 0"])
|
147
150
|
s.add_dependency(%q<sqlite3>.freeze, [">= 0"])
|
148
151
|
end
|
149
152
|
else
|
@@ -162,6 +165,8 @@ Gem::Specification.new do |s|
|
|
162
165
|
s.add_dependency(%q<rdoc>.freeze, [">= 0"])
|
163
166
|
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
164
167
|
s.add_dependency(%q<rubocop>.freeze, [">= 0"])
|
168
|
+
s.add_dependency(%q<rubocop-performance>.freeze, [">= 0"])
|
169
|
+
s.add_dependency(%q<rubocop-rspec>.freeze, [">= 0"])
|
165
170
|
s.add_dependency(%q<sqlite3>.freeze, [">= 0"])
|
166
171
|
end
|
167
172
|
end
|
@@ -125,6 +125,7 @@ private
|
|
125
125
|
orig_model = @models.detect { |array_model| array_model.id == orig_model_id }
|
126
126
|
|
127
127
|
raise "Already autoloaded?" if orig_model.autoloads.key?(autoload_name)
|
128
|
+
|
128
129
|
orig_model.autoloads[autoload_name] = model
|
129
130
|
|
130
131
|
result.fetch(:models) << model
|
data/lib/baza_models/errors.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
class BazaModels::Errors
|
2
2
|
class InvalidRecord < RuntimeError; end
|
3
|
+
|
3
4
|
class RecordNotFound < RuntimeError; end
|
4
5
|
|
5
6
|
def initialize
|
@@ -18,9 +19,7 @@ class BazaModels::Errors
|
|
18
19
|
errors.each do |error|
|
19
20
|
message = ""
|
20
21
|
|
21
|
-
unless attribute_name == :base
|
22
|
-
message << "#{StringCases.snake_to_camel(attribute_name)} "
|
23
|
-
end
|
22
|
+
message << "#{StringCases.snake_to_camel(attribute_name)} " unless attribute_name == :base
|
24
23
|
|
25
24
|
message << error
|
26
25
|
messages << message
|
data/lib/baza_models/model.rb
CHANGED
@@ -16,6 +16,7 @@ class BazaModels::Model
|
|
16
16
|
|
17
17
|
attr_accessor :data, :db
|
18
18
|
attr_reader :changes, :errors
|
19
|
+
attr_writer :db, :table_name
|
19
20
|
|
20
21
|
# Define all callback methods.
|
21
22
|
CALLBACK_TYPES = [
|
@@ -75,9 +76,7 @@ class BazaModels::Model
|
|
75
76
|
end
|
76
77
|
end
|
77
78
|
|
78
|
-
# rubocop:disable Style/TrivialAccessors
|
79
79
|
def new_record?
|
80
|
-
# rubocop:enable Style/TrivialAccessors
|
81
80
|
@new_record
|
82
81
|
end
|
83
82
|
|
@@ -87,21 +86,23 @@ class BazaModels::Model
|
|
87
86
|
|
88
87
|
def db
|
89
88
|
return @db if @db
|
89
|
+
|
90
90
|
@db ||= self.class.db
|
91
91
|
end
|
92
92
|
|
93
|
-
attr_writer :db
|
94
|
-
|
95
93
|
def self.attribute_names
|
96
94
|
init_model
|
97
95
|
@table.columns.map(&:name).map(&:clone)
|
98
96
|
end
|
99
97
|
|
100
98
|
def self.db
|
101
|
-
@db = nil if
|
99
|
+
@db = nil if
|
100
|
+
@db&.closed?
|
102
101
|
return @db if @db
|
102
|
+
|
103
103
|
@db ||= BazaModels.primary_db
|
104
104
|
raise "No Baza database has been configured" unless @db
|
105
|
+
|
105
106
|
@db
|
106
107
|
end
|
107
108
|
|
@@ -144,8 +145,6 @@ class BazaModels::Model
|
|
144
145
|
attr_writer :db, :table_name
|
145
146
|
end
|
146
147
|
|
147
|
-
attr_writer :table_name
|
148
|
-
|
149
148
|
def autoloads
|
150
149
|
@autoloads ||= {}
|
151
150
|
@autoloads
|
@@ -187,7 +186,7 @@ class BazaModels::Model
|
|
187
186
|
end
|
188
187
|
|
189
188
|
def to_param
|
190
|
-
id
|
189
|
+
id&.to_s
|
191
190
|
end
|
192
191
|
|
193
192
|
def to_key
|
@@ -201,6 +200,7 @@ class BazaModels::Model
|
|
201
200
|
def reload
|
202
201
|
@data = db.single(table_name, {id: id}, limit: 1)
|
203
202
|
raise BazaModels::Errors::RecordNotFound unless @data
|
203
|
+
|
204
204
|
@changes = {}
|
205
205
|
self
|
206
206
|
end
|
@@ -233,15 +233,15 @@ class BazaModels::Model
|
|
233
233
|
return false unless self.class == other.class
|
234
234
|
|
235
235
|
if new_record? && other.new_record?
|
236
|
-
|
236
|
+
merged_data == other.__send__(:merged_data)
|
237
237
|
else
|
238
|
-
|
238
|
+
id == other.id
|
239
239
|
end
|
240
240
|
end
|
241
241
|
|
242
|
-
# rubocop:disable
|
242
|
+
# rubocop:disable Naming/PredicateName
|
243
243
|
def has_attribute?(name)
|
244
|
-
# rubocop:enable
|
244
|
+
# rubocop:enable Naming/PredicateName
|
245
245
|
self.class.column_names.include?(name.to_s)
|
246
246
|
end
|
247
247
|
|
@@ -260,6 +260,7 @@ class BazaModels::Model
|
|
260
260
|
|
261
261
|
def read_attribute(attribute_name)
|
262
262
|
return @changes.fetch(attribute_name) if @changes.key?(attribute_name)
|
263
|
+
|
263
264
|
@data.fetch(attribute_name)
|
264
265
|
end
|
265
266
|
|
@@ -271,6 +272,7 @@ class BazaModels::Model
|
|
271
272
|
changed = false
|
272
273
|
@changes.each do |key, value|
|
273
274
|
next if @data.fetch(key) == value
|
275
|
+
|
274
276
|
changed = true
|
275
277
|
break
|
276
278
|
end
|
@@ -283,10 +285,7 @@ protected
|
|
283
285
|
class << self
|
284
286
|
attr_reader :__blank_attributes
|
285
287
|
end
|
286
|
-
|
287
|
-
# rubocop:disable Style/TrivialAccessors
|
288
288
|
def self.model_initialized?
|
289
|
-
# rubocop:enable Style/TrivialAccessors
|
290
289
|
@model_initialized
|
291
290
|
end
|
292
291
|
|
@@ -359,12 +358,11 @@ protected
|
|
359
358
|
attributes.each do |attribute_name, attribute_value|
|
360
359
|
belongs_to_relations = self.class.instance_variable_get(:@belongs_to_relations)
|
361
360
|
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
end
|
361
|
+
|
362
|
+
belongs_to_relations&.each do |relation|
|
363
|
+
if attribute_name.to_s == relation[:relation_name].to_s
|
364
|
+
attribute_name = :"#{attribute_name}_id"
|
365
|
+
attribute_value = attribute_value.id if attribute_value
|
368
366
|
end
|
369
367
|
end
|
370
368
|
|
@@ -385,16 +383,19 @@ protected
|
|
385
383
|
|
386
384
|
def attribute_before_last_save(attribute_name)
|
387
385
|
return @before_last_save.fetch(attribute_name) if @before_last_save.key?(attribute_name)
|
386
|
+
|
388
387
|
@data.fetch(attribute_name)
|
389
388
|
end
|
390
389
|
|
391
390
|
def will_save_change_to_attribute?(attribute_name)
|
392
391
|
return true if @changes.key?(attribute_name) && @changes[attribute_name] != data[attribute_name]
|
392
|
+
|
393
393
|
false
|
394
394
|
end
|
395
395
|
|
396
396
|
def method_missing(method_name, *args, &blk)
|
397
397
|
return @data.fetch(method_name) if @data.key?(method_name)
|
398
|
+
|
398
399
|
super
|
399
400
|
end
|
400
401
|
end
|
@@ -25,9 +25,7 @@ module BazaModels::Model::BelongsToRelations
|
|
25
25
|
@relationships[relation_name] = relation
|
26
26
|
|
27
27
|
define_method(relation_name) do
|
28
|
-
if (model = @changes[relation_name])
|
29
|
-
model
|
30
|
-
elsif (model = autoloads[relation_name])
|
28
|
+
if (model = @changes[relation_name]) || (model = autoloads[relation_name])
|
31
29
|
model
|
32
30
|
else
|
33
31
|
if relation[:class_name]
|
@@ -4,9 +4,9 @@ module BazaModels::Model::HasManyRelations
|
|
4
4
|
end
|
5
5
|
|
6
6
|
module ClassMethods
|
7
|
-
# rubocop:disable
|
7
|
+
# rubocop:disable Naming/PredicateName
|
8
8
|
def has_many(relation_name, *all_args)
|
9
|
-
# rubocop:enable
|
9
|
+
# rubocop:enable Naming/PredicateName
|
10
10
|
|
11
11
|
args = all_args.pop
|
12
12
|
|
@@ -4,9 +4,9 @@ module BazaModels::Model::HasOneRelations
|
|
4
4
|
end
|
5
5
|
|
6
6
|
module ClassMethods
|
7
|
-
# rubocop:disable
|
7
|
+
# rubocop:disable Naming/PredicateName
|
8
8
|
def has_one(relation_name, *all_args)
|
9
|
-
# rubocop:enable
|
9
|
+
# rubocop:enable Naming/PredicateName
|
10
10
|
|
11
11
|
args = all_args.pop
|
12
12
|
|
@@ -30,9 +30,9 @@ module BazaModels::Model::Manipulation
|
|
30
30
|
fire_callbacks(:after_save)
|
31
31
|
fire_callbacks(:after_create) if new_record
|
32
32
|
|
33
|
-
|
33
|
+
true
|
34
34
|
else
|
35
|
-
|
35
|
+
false
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -47,14 +47,12 @@ module BazaModels::Model::Manipulation
|
|
47
47
|
|
48
48
|
@data[:id] = db.insert(table_name, @changes, return_id: true)
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
relation = self.class.relationships.fetch(relation_name)
|
50
|
+
@autoloads&.each do |relation_name, collection|
|
51
|
+
relation = self.class.relationships.fetch(relation_name)
|
53
52
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
53
|
+
collection.each do |model|
|
54
|
+
model.assign_attributes(relation.fetch(:foreign_key) => id)
|
55
|
+
model.create! if model.new_record?
|
58
56
|
end
|
59
57
|
end
|
60
58
|
|
@@ -63,7 +61,7 @@ module BazaModels::Model::Manipulation
|
|
63
61
|
|
64
62
|
def create!
|
65
63
|
if create
|
66
|
-
|
64
|
+
true
|
67
65
|
else
|
68
66
|
raise BazaModels::Errors::InvalidRecord, errors.full_messages.join(". ")
|
69
67
|
end
|
@@ -71,25 +69,29 @@ module BazaModels::Model::Manipulation
|
|
71
69
|
|
72
70
|
def save!(args = {})
|
73
71
|
if save(args)
|
74
|
-
|
72
|
+
true
|
75
73
|
else
|
76
74
|
raise BazaModels::Errors::InvalidRecord, errors.full_messages.join(". ")
|
77
75
|
end
|
78
76
|
end
|
79
77
|
|
80
|
-
def
|
78
|
+
def update(attributes)
|
81
79
|
assign_attributes(attributes)
|
82
80
|
save
|
83
81
|
end
|
84
82
|
|
85
|
-
def update_attributes!(attributes)
|
86
|
-
update!(attributes)
|
87
|
-
end
|
88
|
-
|
89
83
|
def update!(attributes)
|
90
84
|
raise BazaModels::Errors::InvalidRecord, @errors.full_messages.join(". ") unless update_attributes(attributes)
|
91
85
|
end
|
92
86
|
|
87
|
+
def update_attributes(attributes)
|
88
|
+
update(attributes)
|
89
|
+
end
|
90
|
+
|
91
|
+
def update_attributes!(attributes)
|
92
|
+
update!(attributes)
|
93
|
+
end
|
94
|
+
|
93
95
|
def assign_attributes(attributes)
|
94
96
|
@changes.merge!(real_attributes(attributes))
|
95
97
|
end
|
@@ -97,7 +99,7 @@ module BazaModels::Model::Manipulation
|
|
97
99
|
def destroy
|
98
100
|
if new_record?
|
99
101
|
errors.add(:base, "cannot destroy new record")
|
100
|
-
|
102
|
+
false
|
101
103
|
else
|
102
104
|
fire_callbacks(:before_destroy)
|
103
105
|
|
@@ -108,7 +110,7 @@ module BazaModels::Model::Manipulation
|
|
108
110
|
|
109
111
|
db.delete(table_name, id: id)
|
110
112
|
fire_callbacks(:after_destroy)
|
111
|
-
|
113
|
+
true
|
112
114
|
end
|
113
115
|
end
|
114
116
|
|
@@ -7,6 +7,7 @@ module BazaModels::Model::Queries
|
|
7
7
|
def find(id)
|
8
8
|
row = db.select(table_name, {id: id}, limit: 1).fetch
|
9
9
|
raise BazaModels::Errors::RecordNotFound, "Record not found by ID: #{id}" unless row
|
10
|
+
|
10
11
|
new(row, init: true)
|
11
12
|
end
|
12
13
|
|
@@ -23,6 +24,7 @@ module BazaModels::Model::Queries
|
|
23
24
|
def find_or_initialize_by(data)
|
24
25
|
model = find_by(data)
|
25
26
|
return model if model
|
27
|
+
|
26
28
|
new(data)
|
27
29
|
end
|
28
30
|
|
data/lib/baza_models/query.rb
CHANGED
@@ -69,7 +69,8 @@ class BazaModels::Query
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def count
|
72
|
-
if
|
72
|
+
if
|
73
|
+
@previous_model&.new_record?
|
73
74
|
autoloaded_cache_or_create.length
|
74
75
|
else
|
75
76
|
query = clone(selects: [])
|
@@ -283,7 +284,7 @@ class BazaModels::Query
|
|
283
284
|
end
|
284
285
|
|
285
286
|
if @includes.empty?
|
286
|
-
|
287
|
+
array_enum
|
287
288
|
else
|
288
289
|
array = array_enum.to_a
|
289
290
|
|
@@ -296,14 +297,12 @@ class BazaModels::Query
|
|
296
297
|
autoloader.autoload
|
297
298
|
end
|
298
299
|
|
299
|
-
|
300
|
+
array
|
300
301
|
end
|
301
302
|
end
|
302
303
|
|
303
|
-
def each
|
304
|
-
to_enum.each
|
305
|
-
yield model
|
306
|
-
end
|
304
|
+
def each(&blk)
|
305
|
+
to_enum.each(&blk)
|
307
306
|
end
|
308
307
|
|
309
308
|
def find_each
|
@@ -376,6 +375,7 @@ class BazaModels::Query
|
|
376
375
|
|
377
376
|
def sanitize_sql(value)
|
378
377
|
return value if value.is_a?(Array) || value.is_a?(Integer) || value.is_a?(Integer)
|
378
|
+
|
379
379
|
"'#{@db.esc(value)}'"
|
380
380
|
end
|
381
381
|
|
@@ -413,9 +413,7 @@ private
|
|
413
413
|
end
|
414
414
|
|
415
415
|
def autoloaded_on_previous_model?
|
416
|
-
if @previous_model && @relation
|
417
|
-
return true if @previous_model.autoloads.include?(@relation.fetch(:relation_name))
|
418
|
-
end
|
416
|
+
return true if @previous_model && @relation && @previous_model.autoloads.include?(@relation.fetch(:relation_name))
|
419
417
|
|
420
418
|
false
|
421
419
|
end
|
@@ -439,11 +437,13 @@ private
|
|
439
437
|
|
440
438
|
def key_convert(key, value)
|
441
439
|
return "#{key}_id" if value.is_a?(BazaModels::Model)
|
440
|
+
|
442
441
|
key
|
443
442
|
end
|
444
443
|
|
445
444
|
def value_convert(value)
|
446
445
|
return value.id if value.is_a?(BazaModels::Model)
|
446
|
+
|
447
447
|
value
|
448
448
|
end
|
449
449
|
|
@@ -464,6 +464,8 @@ private
|
|
464
464
|
|
465
465
|
sql << ")"
|
466
466
|
sql
|
467
|
+
elsif value == nil
|
468
|
+
"IS NULL"
|
467
469
|
else
|
468
470
|
"= #{@db.quote_value(value)}"
|
469
471
|
end
|