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.
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