baza_models 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +35 -0
  3. data/Gemfile +9 -3
  4. data/Gemfile.lock +90 -51
  5. data/README.md +98 -3
  6. data/Rakefile +20 -17
  7. data/VERSION +1 -1
  8. data/baza_models.gemspec +149 -0
  9. data/config/best_project_practice_rubocop.yml +2 -0
  10. data/config/best_project_practice_rubocop_todo.yml +35 -0
  11. data/lib/baza_models.rb +15 -0
  12. data/lib/baza_models/autoloader.rb +135 -0
  13. data/lib/baza_models/baza_orm_adapter.rb +39 -0
  14. data/lib/baza_models/can_can_adapter.rb +9 -0
  15. data/lib/baza_models/class_translation.rb +44 -0
  16. data/lib/baza_models/errors.rb +24 -2
  17. data/lib/baza_models/model.rb +236 -115
  18. data/lib/baza_models/model/belongs_to_relations.rb +49 -0
  19. data/lib/baza_models/model/custom_validations.rb +24 -0
  20. data/lib/baza_models/model/delegation.rb +21 -0
  21. data/lib/baza_models/model/has_many_relations.rb +85 -0
  22. data/lib/baza_models/model/has_one_relations.rb +93 -0
  23. data/lib/baza_models/model/manipulation.rb +123 -0
  24. data/lib/baza_models/model/queries.rb +45 -0
  25. data/lib/baza_models/model/scopes.rb +19 -0
  26. data/lib/baza_models/model/translation_functionality.rb +30 -0
  27. data/lib/baza_models/model/validations.rb +95 -0
  28. data/lib/baza_models/query.rb +447 -0
  29. data/lib/baza_models/query/inspector.rb +74 -0
  30. data/lib/baza_models/query/not.rb +34 -0
  31. data/lib/baza_models/ransacker.rb +30 -0
  32. data/lib/baza_models/test_database_cleaner.rb +23 -0
  33. data/lib/baza_models/validators/base_validator.rb +14 -0
  34. data/lib/baza_models/validators/confirmation_validator.rb +12 -0
  35. data/lib/baza_models/validators/format_validator.rb +11 -0
  36. data/lib/baza_models/validators/length_validator.rb +16 -0
  37. data/lib/baza_models/validators/uniqueness_validator.rb +21 -0
  38. data/shippable.yml +3 -1
  39. data/spec/baza_models/autoloader_spec.rb +57 -0
  40. data/spec/baza_models/baza_orm_adapter_spec.rb +52 -0
  41. data/spec/baza_models/class_translation_spec.rb +25 -0
  42. data/spec/baza_models/factory_girl_spec.rb +13 -0
  43. data/spec/baza_models/model/belongs_to_relations_spec.rb +26 -0
  44. data/spec/baza_models/model/custom_validations_spec.rb +18 -0
  45. data/spec/baza_models/model/delgation_spec.rb +16 -0
  46. data/spec/baza_models/model/has_many_relations_spec.rb +68 -0
  47. data/spec/baza_models/model/has_one_relations_spec.rb +35 -0
  48. data/spec/baza_models/model/manipulation_spec.rb +25 -0
  49. data/spec/baza_models/model/queries_spec.rb +59 -0
  50. data/spec/baza_models/model/scopes_spec.rb +23 -0
  51. data/spec/baza_models/model/translate_functionality_spec.rb +13 -0
  52. data/spec/baza_models/model/validations_spec.rb +52 -0
  53. data/spec/baza_models/model_spec.rb +75 -98
  54. data/spec/baza_models/query/not_spec.rb +16 -0
  55. data/spec/baza_models/query_spec.rb +155 -0
  56. data/spec/baza_models/ransacker_spec.rb +15 -0
  57. data/spec/baza_models/validators/confirmation_validator_spec.rb +28 -0
  58. data/spec/baza_models/validators/format_validator_spec.rb +17 -0
  59. data/spec/baza_models/validators/length_validator_spec.rb +19 -0
  60. data/spec/baza_models/validators/uniqueness_validator_spec.rb +24 -0
  61. data/spec/factories/organization.rb +5 -0
  62. data/spec/factories/user.rb +7 -0
  63. data/spec/spec_helper.rb +17 -5
  64. data/spec/support/database_helper.rb +87 -0
  65. data/spec/test_classes/organization.rb +3 -0
  66. data/spec/test_classes/person.rb +3 -0
  67. data/spec/test_classes/role.rb +12 -0
  68. data/spec/test_classes/user.rb +40 -0
  69. data/spec/test_classes/user_passport.rb +3 -0
  70. metadata +146 -7
  71. 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
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :organization do
3
+ name "Test organization"
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :user do
3
+ organization
4
+
5
+ email "user@example.com"
6
+ end
7
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,13 +1,25 @@
1
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
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 'rspec'
5
- require 'baza_models'
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,3 @@
1
+ class Organization < BazaModels::Model
2
+ has_many :users, dependent: :destroy
3
+ end
@@ -0,0 +1,3 @@
1
+ class Person < BazaModels::Model
2
+ belongs_to :user
3
+ 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