baza_models 0.0.11 → 0.0.15
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 +5 -5
- data/.github/dependabot.yml +13 -0
- data/.rubocop.yml +134 -25
- data/.rubocop_todo.yml +47 -32
- data/.ruby-version +1 -0
- data/Gemfile +15 -13
- data/Gemfile.lock +126 -105
- data/Rakefile +5 -7
- data/VERSION +1 -1
- data/baza_models.gemspec +43 -55
- data/lib/baza_models/autoloader.rb +1 -0
- data/lib/baza_models/errors.rb +2 -3
- data/lib/baza_models/helpers/ransacker_helper.rb +2 -2
- 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/model.rb +24 -27
- 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/query.rb +16 -14
- data/lib/baza_models/ransacker/relationship_scanner.rb +4 -1
- data/lib/baza_models/ransacker.rb +3 -1
- data/lib/baza_models/validators/confirmation_validator.rb +1 -3
- data/lib/baza_models/validators/uniqueness_validator.rb +2 -4
- data/peak_flow.yml +4 -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 +31 -4
- data/spec/baza_models/query_spec.rb +14 -6
- data/spec/factories/organization.rb +2 -2
- data/spec/factories/user.rb +2 -2
- data/spec/spec_helper.rb +3 -3
- data/spec/support/database_helper.rb +6 -3
- data/spec/test_classes/user.rb +2 -1
- metadata +70 -42
- data/shippable.yml +0 -11
- data/spec/baza_models_spec.rb +0 -4
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: [])
|
@@ -193,7 +194,7 @@ class BazaModels::Query
|
|
193
194
|
new_where = "(#{args.shift})"
|
194
195
|
|
195
196
|
args.each do |arg|
|
196
|
-
new_where.sub!("?", @db.
|
197
|
+
new_where.sub!("?", @db.quote_value(arg))
|
197
198
|
end
|
198
199
|
|
199
200
|
new_wheres << new_where
|
@@ -208,7 +209,7 @@ class BazaModels::Query
|
|
208
209
|
elsif arg.is_a?(TrueClass)
|
209
210
|
arg = "1"
|
210
211
|
else
|
211
|
-
arg = @db.
|
212
|
+
arg = @db.quote_value(arg)
|
212
213
|
end
|
213
214
|
|
214
215
|
str.sub!("?", arg)
|
@@ -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
|
|
@@ -459,13 +459,15 @@ private
|
|
459
459
|
sql << ", " unless first
|
460
460
|
end
|
461
461
|
|
462
|
-
sql << @db.
|
462
|
+
sql << @db.quote_value(val_i)
|
463
463
|
end
|
464
464
|
|
465
465
|
sql << ")"
|
466
466
|
sql
|
467
|
+
elsif value == nil
|
468
|
+
"IS NULL"
|
467
469
|
else
|
468
|
-
"= #{@db.
|
470
|
+
"= #{@db.quote_value(value)}"
|
469
471
|
end
|
470
472
|
end
|
471
473
|
|
@@ -29,6 +29,7 @@ private
|
|
29
29
|
|
30
30
|
loop do
|
31
31
|
break if @name_parts.empty?
|
32
|
+
|
32
33
|
name_part = @name_parts.shift
|
33
34
|
current_name << name_part
|
34
35
|
|
@@ -71,6 +72,7 @@ private
|
|
71
72
|
|
72
73
|
loop do
|
73
74
|
break if join_parts.empty?
|
75
|
+
|
74
76
|
join_part = join_parts.shift
|
75
77
|
|
76
78
|
if join_parts.length == 1
|
@@ -96,6 +98,7 @@ private
|
|
96
98
|
case @mode
|
97
99
|
when :cont
|
98
100
|
return if @value.empty?
|
101
|
+
|
99
102
|
add_query_with_symbol("LIKE", "%#{@klass.db.esc(@value)}%")
|
100
103
|
when :eq
|
101
104
|
add_query_with_symbol("=")
|
@@ -121,6 +124,6 @@ private
|
|
121
124
|
add_join_parts
|
122
125
|
@ransacker.query = @ransacker
|
123
126
|
.query
|
124
|
-
.where("#{@table_query}.#{@column_query} #{symbol} #{@klass.db.
|
127
|
+
.where("#{@table_query}.#{@column_query} #{symbol} #{@klass.db.quote_value(value)}")
|
125
128
|
end
|
126
129
|
end
|
@@ -37,8 +37,10 @@ private
|
|
37
37
|
elsif key.to_s == "s"
|
38
38
|
match = value.to_s.match(/\A([A-z_\d]+)\s+(asc|desc)\Z/)
|
39
39
|
raise "Couldn't sort-match: #{value}" unless match
|
40
|
+
|
40
41
|
sort_by(column_name: match[1], sort_mode: match[2])
|
41
|
-
elsif
|
42
|
+
elsif
|
43
|
+
ransackable_scopes&.include?(key.to_s)
|
42
44
|
@query = @query.__send__(key, value)
|
43
45
|
end
|
44
46
|
end
|
@@ -3,9 +3,7 @@ class BazaModels::Validators::ConfirmationValidator < BazaModels::Validators::Ba
|
|
3
3
|
confirmation_attribute_name = "#{attribute_name}_confirmation"
|
4
4
|
confirmation_value = model.__send__(confirmation_attribute_name)
|
5
5
|
|
6
|
-
if value && !confirmation_value
|
7
|
-
model.errors.add(attribute_name, "hasn't been confirmed")
|
8
|
-
end
|
6
|
+
model.errors.add(attribute_name, "hasn't been confirmed") if value && !confirmation_value
|
9
7
|
|
10
8
|
model.errors.add(attribute_name, "was not the same as the confirmation") if value && confirmation_value && confirmation_value != value
|
11
9
|
end
|
@@ -2,10 +2,8 @@ class BazaModels::Validators::UniquenessValidator < BazaModels::Validators::Base
|
|
2
2
|
def validate(model, value)
|
3
3
|
query_same = model.class.where(attribute_name => value)
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
query_same = query_same.where(scope_part => model.__send__(scope_part))
|
8
|
-
end
|
5
|
+
scope&.each do |scope_part|
|
6
|
+
query_same = query_same.where(scope_part => model.__send__(scope_part))
|
9
7
|
end
|
10
8
|
|
11
9
|
model.errors.add(attribute_name, "isn't unique") if query_same.any?
|
data/peak_flow.yml
ADDED
@@ -47,6 +47,6 @@ describe BazaModels::Query do
|
|
47
47
|
end
|
48
48
|
|
49
49
|
it "#column_names" do
|
50
|
-
expect(User.to_adapter.column_names).to eq %w
|
50
|
+
expect(User.to_adapter.column_names).to eq %w[id organization_id email email_confirmation created_at updated_at admin]
|
51
51
|
end
|
52
52
|
end
|
@@ -10,17 +10,17 @@ describe BazaModels::Model::Manipulation do
|
|
10
10
|
it "#created_at" do
|
11
11
|
expect(user.created_at).to eq nil
|
12
12
|
user.save!
|
13
|
-
expect(user.created_at).
|
13
|
+
expect(user.created_at).not_to eq nil
|
14
14
|
end
|
15
15
|
|
16
16
|
it "#updated_at" do
|
17
17
|
expect(user.updated_at).to eq nil
|
18
18
|
user.save!
|
19
|
-
expect(user.updated_at).
|
19
|
+
expect(user.updated_at).not_to eq nil
|
20
20
|
old_updated_at = user.updated_at
|
21
21
|
sleep 1
|
22
22
|
user.email = "test2@example.com"
|
23
23
|
user.save!
|
24
|
-
expect(user.updated_at).
|
24
|
+
expect(user.updated_at).not_to eq old_updated_at
|
25
25
|
end
|
26
26
|
end
|
@@ -22,8 +22,8 @@ describe "BazaModels::Model" do
|
|
22
22
|
expect(user.id).to eq nil
|
23
23
|
expect(user.to_param).to eq nil
|
24
24
|
user.save!
|
25
|
-
expect(user.id).
|
26
|
-
expect(user.to_param).
|
25
|
+
expect(user.id).not_to eq nil
|
26
|
+
expect(user.to_param).not_to eq nil
|
27
27
|
expect(user.to_param).to eq user.id.to_s
|
28
28
|
end
|
29
29
|
|
@@ -62,12 +62,30 @@ describe "BazaModels::Model" do
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
+
it "#update" do
|
66
|
+
user.save!
|
67
|
+
expect(user.update(email: "newemail@example.com")).to eq true
|
68
|
+
expect(user.email).to eq "newemail@example.com"
|
69
|
+
end
|
70
|
+
|
71
|
+
it "#update!" do
|
72
|
+
user.save!
|
73
|
+
user.update!(email: "newemail@example.com")
|
74
|
+
expect(user.email).to eq "newemail@example.com"
|
75
|
+
end
|
76
|
+
|
65
77
|
it "#update_attributes" do
|
66
78
|
user.save!
|
67
79
|
expect(user.update_attributes(email: "newemail@example.com")).to eq true
|
68
80
|
expect(user.email).to eq "newemail@example.com"
|
69
81
|
end
|
70
82
|
|
83
|
+
it "#update_attributes!" do
|
84
|
+
user.save!
|
85
|
+
user.update_attributes!(email: "newemail@example.com")
|
86
|
+
expect(user.email).to eq "newemail@example.com"
|
87
|
+
end
|
88
|
+
|
71
89
|
it "#before_save, #after_save" do
|
72
90
|
expect(user.before_save_called).to eq nil
|
73
91
|
expect(user.after_save_called).to eq nil
|
@@ -152,17 +170,19 @@ describe "BazaModels::Model" do
|
|
152
170
|
|
153
171
|
it "#each" do
|
154
172
|
user.save!
|
173
|
+
found = []
|
155
174
|
count = 0
|
156
175
|
User.each do |user|
|
157
|
-
|
176
|
+
found << user
|
158
177
|
count += 1
|
159
178
|
end
|
160
179
|
|
161
180
|
expect(count).to eq 1
|
181
|
+
expect(found).to eq [user]
|
162
182
|
end
|
163
183
|
|
164
184
|
it "#attribute_names" do
|
165
|
-
expect(User.attribute_names).to eq %w
|
185
|
+
expect(User.attribute_names).to eq %w[id organization_id email email_confirmation created_at updated_at admin]
|
166
186
|
end
|
167
187
|
|
168
188
|
it "#columns" do
|
@@ -211,6 +231,13 @@ describe "BazaModels::Model" do
|
|
211
231
|
expect(user.email).to eq "test@example.com"
|
212
232
|
end
|
213
233
|
|
234
|
+
describe "#to_a" do
|
235
|
+
it "does not respond to it, because it will fuck up Array(ModelClass)" do
|
236
|
+
expect { User.to_a }.to raise_error(NoMethodError)
|
237
|
+
expect { User.to_ary }.to raise_error(NoMethodError)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
214
241
|
describe "#attribute_before_last_save" do
|
215
242
|
it "returns the value as it was before the save" do
|
216
243
|
user.save!
|
@@ -7,7 +7,7 @@ describe BazaModels::Query do
|
|
7
7
|
let(:role_user) { Role.new(user: user, role: "user") }
|
8
8
|
let(:role_admin) { Role.new(user: user, role: "administrator") }
|
9
9
|
|
10
|
-
|
10
|
+
describe "#average" do
|
11
11
|
it "calculates the average" do
|
12
12
|
5.times do |n|
|
13
13
|
User.create! id: n + 1, email: "user#{n}@example.com"
|
@@ -18,7 +18,7 @@ describe BazaModels::Query do
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
describe "#where" do
|
22
22
|
before do
|
23
23
|
user.save!
|
24
24
|
end
|
@@ -29,6 +29,14 @@ describe BazaModels::Query do
|
|
29
29
|
expect(query.to_a).to eq [user]
|
30
30
|
end
|
31
31
|
|
32
|
+
it "supports hashes with nils" do
|
33
|
+
user.update!(email_confirmation: nil)
|
34
|
+
|
35
|
+
query = User.where(users: {email_confirmation: nil})
|
36
|
+
expect(query.to_sql).to eq "SELECT `users`.* FROM `users` WHERE `users`.`email_confirmation` IS NULL"
|
37
|
+
expect(query.to_a).to eq [user]
|
38
|
+
end
|
39
|
+
|
32
40
|
it "supports strings" do
|
33
41
|
query = User.where("email = 'test@example.com'")
|
34
42
|
expect(query.to_sql).to eq "SELECT `users`.* FROM `users` WHERE (email = 'test@example.com')"
|
@@ -49,7 +57,7 @@ describe BazaModels::Query do
|
|
49
57
|
end
|
50
58
|
end
|
51
59
|
|
52
|
-
|
60
|
+
describe "#ids" do
|
53
61
|
it "returns the ids of the models" do
|
54
62
|
5.times do |n|
|
55
63
|
User.create! id: n + 1, email: "user#{n}@example.com"
|
@@ -60,7 +68,7 @@ describe BazaModels::Query do
|
|
60
68
|
end
|
61
69
|
end
|
62
70
|
|
63
|
-
|
71
|
+
describe "#joins" do
|
64
72
|
before do
|
65
73
|
user.save!
|
66
74
|
role_admin.save!
|
@@ -94,7 +102,7 @@ describe BazaModels::Query do
|
|
94
102
|
end
|
95
103
|
end
|
96
104
|
|
97
|
-
|
105
|
+
describe "#group, #order" do
|
98
106
|
before do
|
99
107
|
user
|
100
108
|
role_user
|
@@ -109,7 +117,7 @@ describe BazaModels::Query do
|
|
109
117
|
roles = Role.group(:role).order(:role).to_a
|
110
118
|
|
111
119
|
expect(roles.length).to eq 2
|
112
|
-
expect(roles.map(&:role)).to eq %w
|
120
|
+
expect(roles.map(&:role)).to eq %w[administrator user]
|
113
121
|
end
|
114
122
|
end
|
115
123
|
|
data/spec/factories/user.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
3
3
|
|
4
4
|
require "rspec"
|
5
5
|
require "baza_models"
|
6
|
-
require "
|
6
|
+
require "factory_bot"
|
7
7
|
|
8
8
|
Dir.foreach("spec/test_classes") do |file|
|
9
9
|
require "test_classes/#{file}" if file.end_with?(".rb")
|
@@ -15,8 +15,8 @@ end
|
|
15
15
|
|
16
16
|
# Requires supporting files with custom matchers and macros, etc,
|
17
17
|
# in ./support/ and its subdirectories.
|
18
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
18
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |f| require f }
|
19
19
|
|
20
20
|
RSpec.configure do |config|
|
21
|
-
config.include
|
21
|
+
config.include FactoryBot::Syntax::Methods
|
22
22
|
end
|
@@ -53,7 +53,8 @@ module DatabaseHelper
|
|
53
53
|
{name: :updated_at, type: :datetime},
|
54
54
|
{name: :admin, type: :tinyint}
|
55
55
|
],
|
56
|
-
indexes: [:organization_id, :email]
|
56
|
+
indexes: [:organization_id, :email]
|
57
|
+
)
|
57
58
|
|
58
59
|
@db.tables.create(
|
59
60
|
:user_passports,
|
@@ -64,7 +65,8 @@ module DatabaseHelper
|
|
64
65
|
],
|
65
66
|
indexes: [
|
66
67
|
:user_id
|
67
|
-
]
|
68
|
+
]
|
69
|
+
)
|
68
70
|
|
69
71
|
@db.tables.create(
|
70
72
|
:persons,
|
@@ -72,7 +74,8 @@ module DatabaseHelper
|
|
72
74
|
{name: :id, type: :int, primarykey: true, autoincr: true},
|
73
75
|
{name: :user_id, type: :int}
|
74
76
|
],
|
75
|
-
indexes: [:user_id]
|
77
|
+
indexes: [:user_id]
|
78
|
+
)
|
76
79
|
|
77
80
|
@db.tables.create(
|
78
81
|
:roles,
|
data/spec/test_classes/user.rb
CHANGED
@@ -24,11 +24,12 @@ class User < BazaModels::Model
|
|
24
24
|
# Used to test callbacks.
|
25
25
|
BazaModels::Model::CALLBACK_TYPES.each do |callback_type|
|
26
26
|
attr_reader "#{callback_type}_called"
|
27
|
+
|
27
28
|
__send__(callback_type, :add_callback, callback_type)
|
28
29
|
end
|
29
30
|
|
30
31
|
def self.ransackable_scopes(_auth_object = nil)
|
31
|
-
%i
|
32
|
+
%i[created_at_since]
|
32
33
|
end
|
33
34
|
|
34
35
|
private
|