baza_models 0.0.0 → 0.0.1
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_todo.yml +35 -0
- data/Gemfile +9 -3
- data/Gemfile.lock +90 -51
- data/README.md +98 -3
- data/Rakefile +20 -17
- data/VERSION +1 -1
- data/baza_models.gemspec +149 -0
- data/config/best_project_practice_rubocop.yml +2 -0
- data/config/best_project_practice_rubocop_todo.yml +35 -0
- data/lib/baza_models.rb +15 -0
- data/lib/baza_models/autoloader.rb +135 -0
- data/lib/baza_models/baza_orm_adapter.rb +39 -0
- data/lib/baza_models/can_can_adapter.rb +9 -0
- data/lib/baza_models/class_translation.rb +44 -0
- data/lib/baza_models/errors.rb +24 -2
- data/lib/baza_models/model.rb +236 -115
- data/lib/baza_models/model/belongs_to_relations.rb +49 -0
- data/lib/baza_models/model/custom_validations.rb +24 -0
- data/lib/baza_models/model/delegation.rb +21 -0
- data/lib/baza_models/model/has_many_relations.rb +85 -0
- data/lib/baza_models/model/has_one_relations.rb +93 -0
- data/lib/baza_models/model/manipulation.rb +123 -0
- data/lib/baza_models/model/queries.rb +45 -0
- data/lib/baza_models/model/scopes.rb +19 -0
- data/lib/baza_models/model/translation_functionality.rb +30 -0
- data/lib/baza_models/model/validations.rb +95 -0
- data/lib/baza_models/query.rb +447 -0
- data/lib/baza_models/query/inspector.rb +74 -0
- data/lib/baza_models/query/not.rb +34 -0
- data/lib/baza_models/ransacker.rb +30 -0
- data/lib/baza_models/test_database_cleaner.rb +23 -0
- data/lib/baza_models/validators/base_validator.rb +14 -0
- data/lib/baza_models/validators/confirmation_validator.rb +12 -0
- data/lib/baza_models/validators/format_validator.rb +11 -0
- data/lib/baza_models/validators/length_validator.rb +16 -0
- data/lib/baza_models/validators/uniqueness_validator.rb +21 -0
- data/shippable.yml +3 -1
- data/spec/baza_models/autoloader_spec.rb +57 -0
- data/spec/baza_models/baza_orm_adapter_spec.rb +52 -0
- data/spec/baza_models/class_translation_spec.rb +25 -0
- data/spec/baza_models/factory_girl_spec.rb +13 -0
- data/spec/baza_models/model/belongs_to_relations_spec.rb +26 -0
- data/spec/baza_models/model/custom_validations_spec.rb +18 -0
- data/spec/baza_models/model/delgation_spec.rb +16 -0
- data/spec/baza_models/model/has_many_relations_spec.rb +68 -0
- data/spec/baza_models/model/has_one_relations_spec.rb +35 -0
- data/spec/baza_models/model/manipulation_spec.rb +25 -0
- data/spec/baza_models/model/queries_spec.rb +59 -0
- data/spec/baza_models/model/scopes_spec.rb +23 -0
- data/spec/baza_models/model/translate_functionality_spec.rb +13 -0
- data/spec/baza_models/model/validations_spec.rb +52 -0
- data/spec/baza_models/model_spec.rb +75 -98
- data/spec/baza_models/query/not_spec.rb +16 -0
- data/spec/baza_models/query_spec.rb +155 -0
- data/spec/baza_models/ransacker_spec.rb +15 -0
- data/spec/baza_models/validators/confirmation_validator_spec.rb +28 -0
- data/spec/baza_models/validators/format_validator_spec.rb +17 -0
- data/spec/baza_models/validators/length_validator_spec.rb +19 -0
- data/spec/baza_models/validators/uniqueness_validator_spec.rb +24 -0
- data/spec/factories/organization.rb +5 -0
- data/spec/factories/user.rb +7 -0
- data/spec/spec_helper.rb +17 -5
- data/spec/support/database_helper.rb +87 -0
- data/spec/test_classes/organization.rb +3 -0
- data/spec/test_classes/person.rb +3 -0
- data/spec/test_classes/role.rb +12 -0
- data/spec/test_classes/user.rb +40 -0
- data/spec/test_classes/user_passport.rb +3 -0
- metadata +146 -7
- data/spec/test_classes/user_test.rb +0 -17
@@ -0,0 +1,16 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BazaModels::Query::Not do
|
4
|
+
include DatabaseHelper
|
5
|
+
|
6
|
+
let(:user) { User.new(email: "test@example.com") }
|
7
|
+
|
8
|
+
it "#not" do
|
9
|
+
user.save!
|
10
|
+
|
11
|
+
expect(User.where.not(email: "kasper@example.com").to_a).to eq [user]
|
12
|
+
expect(User.where.not(email: "test@example.com").to_a).to eq []
|
13
|
+
expect(User.where.not(email: ["kasper@example.com"]).to_a).to eq [user]
|
14
|
+
expect(User.where.not(email: ["test@example.com"]).to_a).to eq []
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BazaModels::Query do
|
4
|
+
include DatabaseHelper
|
5
|
+
|
6
|
+
let(:user) { User.new(email: "test@example.com") }
|
7
|
+
let(:role_user) { Role.new(user: user, role: "user") }
|
8
|
+
let(:role_admin) { Role.new(user: user, role: "administrator") }
|
9
|
+
|
10
|
+
context "#where" do
|
11
|
+
before do
|
12
|
+
user.save!
|
13
|
+
end
|
14
|
+
|
15
|
+
it "supports hashes" do
|
16
|
+
query = User.where(email: "test@example.com")
|
17
|
+
expect(query.to_sql).to eq "SELECT `users`.* FROM `users` WHERE `users`.`email` = 'test@example.com'"
|
18
|
+
expect(query.to_a).to eq [user]
|
19
|
+
end
|
20
|
+
|
21
|
+
it "supports strings" do
|
22
|
+
query = User.where("email = 'test@example.com'")
|
23
|
+
expect(query.to_sql).to eq "SELECT `users`.* FROM `users` WHERE (email = 'test@example.com')"
|
24
|
+
expect(query.to_a).to eq [user]
|
25
|
+
end
|
26
|
+
|
27
|
+
it "supports arrays" do
|
28
|
+
query = User.where(["?=?", :email, "test@example.com"])
|
29
|
+
expect(query.to_a).to eq [user]
|
30
|
+
expect(query.to_sql).to eq "SELECT `users`.* FROM `users` WHERE (`users`.`email`='test@example.com')"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context '#joins' do
|
35
|
+
before do
|
36
|
+
user.save!
|
37
|
+
role_admin.save!
|
38
|
+
end
|
39
|
+
|
40
|
+
it "joins with symbols and relationships" do
|
41
|
+
query = User.joins(:roles).where(roles: {role: "administrator"})
|
42
|
+
expect(query.to_sql).to eq "SELECT `users`.* FROM `users` INNER JOIN `roles` ON `roles`.`user_id` = `users`.`id` WHERE `roles`.`role` = 'administrator'"
|
43
|
+
expect(query.to_a).to eq [user]
|
44
|
+
end
|
45
|
+
|
46
|
+
it "joins with strings" do
|
47
|
+
query = User.joins("LEFT JOIN roles ON roles.user_id = users.id").where(roles: {role: "administrator"})
|
48
|
+
expect(query.to_sql).to eq "SELECT `users`.* FROM `users` LEFT JOIN roles ON roles.user_id = users.id WHERE `roles`.`role` = 'administrator'"
|
49
|
+
expect(query.to_a).to eq [user]
|
50
|
+
end
|
51
|
+
|
52
|
+
it "does deep joins" do
|
53
|
+
query = Organization.joins(users: :person).to_sql
|
54
|
+
|
55
|
+
expect(query).to include "INNER JOIN `users` ON `users`.`organization_id` = `organizations`.`id`"
|
56
|
+
expect(query).to include "INNER JOIN `persons` ON `persons`.`user_id` = `users`.`id`"
|
57
|
+
end
|
58
|
+
|
59
|
+
it "doesn't double join with symbols" do
|
60
|
+
query = Organization.joins(:users, :users, users: :person).to_sql
|
61
|
+
|
62
|
+
join_sql = "INNER JOIN `users` ON `users`.`organization_id` = `organizations`.`id`"
|
63
|
+
count = query.scan(/#{Regexp.escape(join_sql)}/).length
|
64
|
+
expect(count).to eq 1
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "#group, #order" do
|
69
|
+
before do
|
70
|
+
user
|
71
|
+
role_user
|
72
|
+
role_admin
|
73
|
+
|
74
|
+
user2 = User.create!(email: "another@example.com")
|
75
|
+
Role.create!(user: user2, role: "administrator")
|
76
|
+
Role.create!(user: user2, role: "user")
|
77
|
+
end
|
78
|
+
|
79
|
+
it "groups results" do
|
80
|
+
roles = Role.group(:role).order(:role).to_a
|
81
|
+
|
82
|
+
expect(roles.length).to eq 2
|
83
|
+
expect(roles.map(&:role)).to eq %w(administrator user)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it "#any? #empty? #none? #count #length" do
|
88
|
+
expect(User.any?).to eq false
|
89
|
+
expect(User.empty?).to eq true
|
90
|
+
expect(User.none?).to eq true
|
91
|
+
expect(User.count).to eq 0
|
92
|
+
expect(User.length).to eq 0
|
93
|
+
user.save!
|
94
|
+
expect(User.any?).to eq true
|
95
|
+
expect(User.empty?).to eq false
|
96
|
+
expect(User.none?).to eq false
|
97
|
+
expect(User.count).to eq 1
|
98
|
+
expect(User.length).to eq 1
|
99
|
+
end
|
100
|
+
|
101
|
+
it "#find" do
|
102
|
+
expect(User.all.find(1)).to eq nil
|
103
|
+
user.save!
|
104
|
+
expect(User.all.find(user.id)).to eq user
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "#destroy_all" do
|
108
|
+
it "destroys the correct models" do
|
109
|
+
role_user.save!
|
110
|
+
role_admin.save!
|
111
|
+
|
112
|
+
Role.where(role: "user").destroy_all
|
113
|
+
|
114
|
+
expect { role_user.reload }.to raise_error(BazaModels::Errors::RecordNotFound)
|
115
|
+
role_admin.reload
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
it "#first" do
|
120
|
+
role_user.save!
|
121
|
+
role_admin.save!
|
122
|
+
|
123
|
+
expect(Role.first).to eq role_user
|
124
|
+
expect(Role.last).to eq role_admin
|
125
|
+
end
|
126
|
+
|
127
|
+
describe "#order" do
|
128
|
+
it "converts symbols to escaped strings" do
|
129
|
+
sql = Role.order(:role).to_sql
|
130
|
+
expect(sql).to end_with "ORDER BY `roles`.`role`"
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe "#reverse_order" do
|
135
|
+
before do
|
136
|
+
role_user.save!
|
137
|
+
role_admin.save!
|
138
|
+
end
|
139
|
+
|
140
|
+
it "reverses ASC strings" do
|
141
|
+
sql = Role.order("roles.role ASC").reverse_order.to_sql
|
142
|
+
expect(sql).to end_with " DESC"
|
143
|
+
end
|
144
|
+
|
145
|
+
it "reverses DESC strings" do
|
146
|
+
sql = Role.order("roles.role DESC").reverse_order.to_sql
|
147
|
+
expect(sql).to end_with " ASC"
|
148
|
+
end
|
149
|
+
|
150
|
+
it "reverses symbols" do
|
151
|
+
sql = Role.order(:role).reverse_order.to_sql
|
152
|
+
expect(sql).to end_with " DESC"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BazaModels::Query do
|
4
|
+
include DatabaseHelper
|
5
|
+
|
6
|
+
let!(:user) { User.create!(id: 1, email: "test@example.com") }
|
7
|
+
|
8
|
+
it "eq" do
|
9
|
+
expect(User.ransack(id_eq: 1).result.to_a).to eq [user]
|
10
|
+
end
|
11
|
+
|
12
|
+
it "cont" do
|
13
|
+
expect(User.ransack(email_cont: "test").result.to_a).to eq [user]
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BazaModels::Validators::ConfirmationValidator do
|
4
|
+
include DatabaseHelper
|
5
|
+
|
6
|
+
it "detects no confirmation" do
|
7
|
+
user = User.new(email: "invalid@example.com")
|
8
|
+
user.validate_confirmation = true
|
9
|
+
|
10
|
+
expect(user.valid?).to eq false
|
11
|
+
expect(user.errors.full_messages).to eq ["Email hasn't been confirmed"]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "detects invalid confirmations" do
|
15
|
+
user = User.new(email: "valid@example.com", email_confirmation: "unvaid@example.com")
|
16
|
+
user.validate_confirmation = true
|
17
|
+
|
18
|
+
expect(user.valid?).to eq false
|
19
|
+
expect(user.errors.full_messages).to eq ["Email was not the same as the confirmation"]
|
20
|
+
end
|
21
|
+
|
22
|
+
it "allows correct confirmations" do
|
23
|
+
user = User.new(email: "valid@example.com", email_confirmation: "valid@example.com")
|
24
|
+
user.validate_confirmation = true
|
25
|
+
|
26
|
+
expect(user.valid?).to eq true
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BazaModels::Validators::FormatValidator do
|
4
|
+
include DatabaseHelper
|
5
|
+
|
6
|
+
it "detects invalid formats" do
|
7
|
+
user = User.new(email: "invalid")
|
8
|
+
|
9
|
+
expect(user.valid?).to eq false
|
10
|
+
expect(user.errors.full_messages).to eq ["Email has an invalid format"]
|
11
|
+
end
|
12
|
+
|
13
|
+
it "allows correct formats" do
|
14
|
+
user = User.new(email: "valid@example.com")
|
15
|
+
expect(user.valid?).to eq true
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BazaModels::Validators::LengthValidator do
|
4
|
+
include DatabaseHelper
|
5
|
+
|
6
|
+
it "validates minimum length" do
|
7
|
+
user = User.new(email: "a")
|
8
|
+
|
9
|
+
expect(user.valid?).to eq false
|
10
|
+
expect(user.errors.full_messages).to include "Email is too short"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "validates maximum length" do
|
14
|
+
user = User.new(email: "a" * 101)
|
15
|
+
|
16
|
+
expect(user.valid?).to eq false
|
17
|
+
expect(user.errors.full_messages).to include "Email is too long"
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BazaModels::Validators::UniquenessValidator do
|
4
|
+
include DatabaseHelper
|
5
|
+
|
6
|
+
before do
|
7
|
+
User.create!(email: "test@example.com", organization_id: 1)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "doesnt accept users with the same email" do
|
11
|
+
user2 = User.new(email: "test@example.com", organization_id: 1)
|
12
|
+
user2.validate_uniqueness = true
|
13
|
+
|
14
|
+
expect(user2.valid?).to eq false
|
15
|
+
expect(user2.errors.full_messages).to eq ["Email isn't unique"]
|
16
|
+
end
|
17
|
+
|
18
|
+
it "accepts users from other scope" do
|
19
|
+
user2 = User.new(email: "test@example.com", organization_id: 2)
|
20
|
+
user2.validate_uniqueness = true
|
21
|
+
|
22
|
+
expect(user2.valid?).to eq true
|
23
|
+
end
|
24
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,13 +1,25 @@
|
|
1
|
-
|
1
|
+
require "codeclimate-test-reporter"
|
2
|
+
CodeClimate::TestReporter.start
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
2
5
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
6
|
|
4
|
-
require
|
5
|
-
require
|
7
|
+
require "rspec"
|
8
|
+
require "baza_models"
|
9
|
+
require "factory_girl"
|
10
|
+
|
11
|
+
Dir.foreach("spec/test_classes") do |file|
|
12
|
+
require "test_classes/#{file}" if file.end_with?(".rb")
|
13
|
+
end
|
14
|
+
|
15
|
+
Dir.foreach("spec/factories") do |file|
|
16
|
+
require "factories/#{file}" if file.end_with?(".rb")
|
17
|
+
end
|
6
18
|
|
7
19
|
# Requires supporting files with custom matchers and macros, etc,
|
8
20
|
# in ./support/ and its subdirectories.
|
9
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
21
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
10
22
|
|
11
23
|
RSpec.configure do |config|
|
12
|
-
|
24
|
+
config.include FactoryGirl::Syntax::Methods
|
13
25
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module DatabaseHelper
|
2
|
+
def self.included(base)
|
3
|
+
base.instance_eval do
|
4
|
+
let(:db) { @db }
|
5
|
+
|
6
|
+
before do
|
7
|
+
@count ||= 0
|
8
|
+
@count += 1
|
9
|
+
|
10
|
+
require "tempfile"
|
11
|
+
require "baza"
|
12
|
+
|
13
|
+
if RUBY_PLATFORM == "java"
|
14
|
+
require "jdbc/sqlite3"
|
15
|
+
::Jdbc::SQLite3.load_driver
|
16
|
+
else
|
17
|
+
require "sqlite3"
|
18
|
+
end
|
19
|
+
|
20
|
+
tempfile = Tempfile.new(["baza_test", ".sqlite3"])
|
21
|
+
path = tempfile.path
|
22
|
+
tempfile.close!
|
23
|
+
|
24
|
+
@db = Baza::Db.new(type: :sqlite3, path: path, index_append_table_name: true, debug: false)
|
25
|
+
BazaModels.primary_db = @db
|
26
|
+
|
27
|
+
@db.tables.create(
|
28
|
+
:users,
|
29
|
+
columns: [
|
30
|
+
{name: :id, type: :int, primarykey: true, autoincr: true},
|
31
|
+
{name: :organization_id, type: :int},
|
32
|
+
{name: :email, type: :varchar},
|
33
|
+
{name: :email_confirmation, type: :varchar},
|
34
|
+
{name: :created_at, type: :datetime},
|
35
|
+
{name: :updated_at, type: :datetime}
|
36
|
+
],
|
37
|
+
indexes: [:organization_id, :email])
|
38
|
+
|
39
|
+
@db.tables.create(
|
40
|
+
:user_passports,
|
41
|
+
columns: [
|
42
|
+
{name: :id, type: :int, primarykey: true, autoincr: true},
|
43
|
+
{name: :user_id, type: :int},
|
44
|
+
{name: :code, type: :varchar}
|
45
|
+
],
|
46
|
+
indexes: [
|
47
|
+
:user_id
|
48
|
+
])
|
49
|
+
|
50
|
+
@db.tables.create(
|
51
|
+
:persons,
|
52
|
+
columns: [
|
53
|
+
{name: :id, type: :int, primarykey: true, autoincr: true},
|
54
|
+
{name: :user_id, type: :int}
|
55
|
+
],
|
56
|
+
indexes: [:user_id])
|
57
|
+
|
58
|
+
@db.tables.create(
|
59
|
+
:roles,
|
60
|
+
columns: [
|
61
|
+
{name: :id, type: :int, primarykey: true, autoincr: true},
|
62
|
+
{name: :user_id, type: :int},
|
63
|
+
{name: :role, type: :varchar},
|
64
|
+
{name: :created_at, type: :datetime},
|
65
|
+
{name: :updated_at, type: :datetime}
|
66
|
+
],
|
67
|
+
indexes: [:user_id]
|
68
|
+
)
|
69
|
+
|
70
|
+
@db.tables.create(:organizations, columns: [
|
71
|
+
{name: :id, type: :int, primarykey: true, autoincr: true},
|
72
|
+
{name: :name, type: :varchar}
|
73
|
+
])
|
74
|
+
end
|
75
|
+
|
76
|
+
after do
|
77
|
+
BazaModels.primary_db = nil
|
78
|
+
|
79
|
+
@db.close
|
80
|
+
path = db.args[:path]
|
81
|
+
File.unlink(path) if File.exist?(path)
|
82
|
+
Thread.current[:baza] = nil
|
83
|
+
@db = nil
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class Role < BazaModels::Model
|
2
|
+
belongs_to :user
|
3
|
+
|
4
|
+
has_one :organization, through: :user
|
5
|
+
|
6
|
+
scope :admin_roles, -> { where(role: "administrator") }
|
7
|
+
|
8
|
+
validates :role, presence: true
|
9
|
+
|
10
|
+
delegate :email, to: :user
|
11
|
+
delegate :created_at, to: :user, prefix: true
|
12
|
+
end
|