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,18 @@
1
+ require "spec_helper"
2
+
3
+ describe BazaModels::Model::CustomValidations do
4
+ include DatabaseHelper
5
+
6
+ let(:user) { User.new(email: "test@example.com") }
7
+
8
+ it "validates custom validations" do
9
+ user.custom_valid = false
10
+ expect(user.valid?).to eq false
11
+ expect(user.errors.full_messages.join(". ")).to eq "Custom validate failed"
12
+ expect(user.save).to eq false
13
+
14
+ user.custom_valid = nil
15
+ expect(user.valid?).to eq true
16
+ expect(user.save).to eq true
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe BazaModels::Model::Delegation 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
+
9
+ it "delegates methods" do
10
+ user.save!
11
+ role_user.save!
12
+
13
+ expect(role_user.email).to eq "test@example.com"
14
+ expect(role_user.user_created_at).to eq user.created_at
15
+ end
16
+ end
@@ -0,0 +1,68 @@
1
+ require "spec_helper"
2
+
3
+ describe BazaModels::Model::HasManyRelations do
4
+ include DatabaseHelper
5
+
6
+ let(:organization) { Organization.new }
7
+ let(:user) { User.new(email: "test@example.com", organization: organization) }
8
+ let(:role_user) { Role.new(user: user, role: "user") }
9
+ let(:role_admin) { Role.new(user: user, role: "administrator") }
10
+
11
+ context "destroy" do
12
+ before do
13
+ user.save!
14
+ end
15
+
16
+ it "destroyes through has_many" do
17
+ role_user.save!
18
+ user.destroy!
19
+ expect { user.reload }.to raise_error(BazaModels::Errors::RecordNotFound)
20
+ expect { role_user.reload }.to raise_error(BazaModels::Errors::RecordNotFound)
21
+ end
22
+
23
+ it "restricts through has_many" do
24
+ role_admin.save!
25
+ expect { user.destroy! }.to raise_error(BazaModels::Errors::InvalidRecord)
26
+ end
27
+ end
28
+
29
+ context "relationships" do
30
+ before do
31
+ user.save!
32
+ role_user.save!
33
+ role_admin.save!
34
+ end
35
+
36
+ describe "#has_many" do
37
+ it "returns whole collections without arguments" do
38
+ expect(user.roles.to_a).to eq [role_user, role_admin]
39
+ end
40
+
41
+ it "supports class_name and proc-arguments" do
42
+ expect(user.admin_roles.to_a).to eq [role_admin]
43
+ expect(user.admin_roles.to_sql).to eq "SELECT `roles`.* FROM `roles` WHERE `roles`.`user_id` = '#{user.id}' AND `roles`.`role` = 'administrator'"
44
+ end
45
+ end
46
+ end
47
+
48
+ context "#<<" do
49
+ it "adds models to persisted parent" do
50
+ organization.save!
51
+ organization.users << User.create!(email: "test@example.com")
52
+
53
+ expect(organization.users.count).to eq 1
54
+ expect(organization.users.first.email).to eq "test@example.com"
55
+ end
56
+
57
+ it "adds models to new parent" do
58
+ organization.users << User.new(email: "test1@example.com")
59
+ organization.users << User.new(email: "test2@example.com")
60
+
61
+ expect(organization.users.count).to eq 2
62
+
63
+ organization.save!
64
+
65
+ expect(organization.users.count).to eq 2
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ describe BazaModels::Model::HasOneRelations do
4
+ include DatabaseHelper
5
+
6
+ let!(:user) { User.create!(email: "test@example.com", organization: organization) }
7
+ let(:user_passport) { UserPassport.create(user: user) }
8
+ let(:person) { Person.create!(user: user) }
9
+ let(:role_user) { Role.create!(user: user, role: "user") }
10
+ let!(:organization) { Organization.create!(name: "Test") }
11
+
12
+ it "has one thorugh" do
13
+ person
14
+ expect(user.organization).to eq organization
15
+ expect(user.person).to eq person
16
+ expect(role_user.organization).to eq organization
17
+ end
18
+
19
+ context "destroy" do
20
+ before do
21
+ user.save!
22
+ end
23
+
24
+ it "restricts through has_one" do
25
+ person
26
+ expect { user.destroy! }.to raise_error(BazaModels::Errors::InvalidRecord)
27
+ end
28
+
29
+ it "destroys through has_one" do
30
+ user_passport
31
+ user.destroy!
32
+ expect { user_passport.reload }.to raise_error(BazaModels::Errors::RecordNotFound)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ describe BazaModels::Model::Manipulation 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
+ it "#created_at" do
11
+ expect(user.created_at).to eq nil
12
+ user.save!
13
+ expect(user.created_at).to_not eq nil
14
+ end
15
+
16
+ it "#updated_at" do
17
+ expect(user.updated_at).to eq nil
18
+ user.save!
19
+ expect(user.updated_at).to_not eq nil
20
+ old_updated_at = user.updated_at
21
+ sleep 1
22
+ user.save!
23
+ expect(user.updated_at).to_not eq old_updated_at
24
+ end
25
+ end
@@ -0,0 +1,59 @@
1
+ require "spec_helper"
2
+
3
+ describe BazaModels::Model::Queries 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
+ it "#find" do
11
+ user.save!
12
+ user_found = User.find(user.id)
13
+ expect(user_found.email).to eq "test@example.com"
14
+ end
15
+
16
+ describe "#find_by" do
17
+ it "finds existing models" do
18
+ user.save!
19
+ user_found = User.find_by(id: 1, email: "test@example.com")
20
+ expect(user_found.email).to eq "test@example.com"
21
+ end
22
+
23
+ it "returns false when nothing is found" do
24
+ user_found = User.find_by(id: 1, email: "test@example.com")
25
+ expect(user_found).to eq false
26
+ end
27
+
28
+ it "#find_by!" do
29
+ expect { User.find_by!(email: "doesntexist@example.com") }.to raise_error(BazaModels::Errors::RecordNotFound)
30
+ end
31
+ end
32
+
33
+ describe "#find_or_initialize_by" do
34
+ it "finds existing models" do
35
+ user.save!
36
+ user_found = User.find_or_initialize_by(id: 1, email: "test@example.com")
37
+ expect(user_found.new_record?).to eq false
38
+ expect(user_found.persisted?).to eq true
39
+ end
40
+
41
+ it "returns false when nothing is found" do
42
+ user_found = User.find_or_initialize_by(email: "test@example.com")
43
+ expect(user_found.new_record?).to eq true
44
+ expect(user_found.persisted?).to eq false
45
+ end
46
+
47
+ it "#find_or_create_by" do
48
+ user_found = User.find_or_create_by(id: 1, email: "test@example.com")
49
+ expect(user_found.new_record?).to eq false
50
+ expect(user_found.persisted?).to eq true
51
+ end
52
+
53
+ it "#find_or_create_by!" do
54
+ user_found = User.find_or_create_by!(id: 1, email: "test@example.com")
55
+ expect(user_found.new_record?).to eq false
56
+ expect(user_found.persisted?).to eq true
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ describe BazaModels::Model::Scopes 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
+ before do
11
+ user.save!
12
+ role_user.save!
13
+ role_admin.save!
14
+ end
15
+
16
+ it "works with where" do
17
+ expect(Role.admin_roles.to_a).to eq [role_admin]
18
+ end
19
+
20
+ it "joins as well" do
21
+ expect(User.admin_roles_scope.to_a).to eq [user]
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe BazaModels::Model::TranslationFunctionality do
4
+ include DatabaseHelper
5
+
6
+ it "#model_name" do
7
+ expect(User.model_name.human).to eq "User"
8
+ end
9
+
10
+ it "#human_attribute_name" do
11
+ expect(User.human_attribute_name(:email)).to eq "Email"
12
+ end
13
+ end
@@ -0,0 +1,52 @@
1
+ require "spec_helper"
2
+
3
+ describe BazaModels::Model::Validations 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
+ describe "#valid?" do
11
+ it "returns true when valid" do
12
+ expect(user.valid?).to eq true
13
+ end
14
+
15
+ it "returns false when invalid" do
16
+ user.email = " "
17
+ expect(user.valid?).to eq false
18
+ end
19
+ end
20
+
21
+ it "#before_validation, #after_validation" do
22
+ expect(user.before_validation_called).to eq nil
23
+ expect(user.after_validation_called).to eq nil
24
+ user.valid?
25
+ expect(user.before_validation_called).to eq 1
26
+ expect(user.after_validation_called).to eq 1
27
+ end
28
+
29
+ it "#before_validation_on_create, #after_validation_on_create, #before_validation_on_update, #after_validation_on_update" do
30
+ expect(user.before_validation_on_create_called).to eq nil
31
+ expect(user.after_validation_on_create_called).to eq nil
32
+
33
+ expect(user.before_validation_on_update_called).to eq nil
34
+ expect(user.after_validation_on_update_called).to eq nil
35
+
36
+ user.save!
37
+
38
+ expect(user.before_validation_on_create_called).to eq 1
39
+ expect(user.after_validation_on_create_called).to eq 1
40
+
41
+ expect(user.before_validation_on_update_called).to eq nil
42
+ expect(user.after_validation_on_update_called).to eq nil
43
+
44
+ user.update_attributes!(email: "newemail@example.com")
45
+
46
+ expect(user.before_validation_on_create_called).to eq 1
47
+ expect(user.after_validation_on_create_called).to eq 1
48
+
49
+ expect(user.before_validation_on_update_called).to eq 1
50
+ expect(user.after_validation_on_update_called).to eq 1
51
+ end
52
+ end
@@ -1,152 +1,129 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe "BazaModels::Model" do
4
- let(:db) { @db }
5
- let(:user) { UserTest.new(email: "test@example.com") }
6
-
7
- before do
8
- @count ||= 0
9
- @count += 1
10
-
11
- require "tempfile"
12
- require "baza"
13
- require "sqlite3"
14
-
15
- path = Tempfile.new("baza_test").path
16
- File.unlink(path) if File.exists?(path)
17
-
18
- @db = Baza::Db.new(type: :sqlite3, path: path)
19
- BazaModels.primary_db = @db
20
-
21
- @db.tables.create(:user_tests, {
22
- columns: [
23
- {name: :id, type: :int, primarykey: true, autoincr: true},
24
- {name: :email, type: :varchar}
25
- ],
26
- indexes: [
27
- :email
28
- ]
29
- })
30
-
31
- require "test_classes/user_test"
32
- end
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") }
33
9
 
34
- after do
35
- BazaModels.primary_db = nil
10
+ describe "#email" do
11
+ it "returns set attributes" do
12
+ expect(user.email).to eq "test@example.com"
13
+ end
36
14
 
37
- @db.close
38
- path = db.args[:path]
39
- File.unlink(path)
40
- Thread.current[:baza] = nil
41
- @db = nil
15
+ it "returns nil for attributes that hasn't been set" do
16
+ user = User.new
17
+ expect(user.email).to eq nil
18
+ end
42
19
  end
43
20
 
44
- it "#email" do
45
- user.email.should eq "test@example.com"
21
+ it "#id #to_param" do
22
+ expect(user.id).to eq nil
23
+ expect(user.to_param).to eq nil
24
+ user.save!
25
+ expect(user.id).to_not eq nil
26
+ expect(user.to_param).to_not eq nil
27
+ expect(user.to_param).to eq user.id.to_s
46
28
  end
47
29
 
48
30
  it "#email=" do
49
31
  user.email = "newemail@example.com"
50
- user.email.should eq "newemail@example.com"
32
+ expect(user.email).to eq "newemail@example.com"
51
33
  end
52
34
 
53
35
  it "#email_was" do
36
+ user.save!
54
37
  user.email = "newemail@example.com"
55
- user.email_was.should eq "test@example.com"
38
+ expect(user.email_was).to eq "test@example.com"
56
39
  end
57
40
 
58
41
  it "#changes" do
59
42
  user.email = "newemail@example.com"
60
- user.changes.should eq(email: "newemail@example.com")
43
+ expect(user.changes).to eq email: "newemail@example.com"
61
44
  end
62
45
 
63
46
  describe "#save" do
64
47
  it "inserts a new record when new" do
65
- user.new_record?.should eq true
66
- user.save
67
- user.id.should eq 1
68
- user.new_record?.should eq false
69
- end
70
- end
71
-
72
- describe "#valid?" do
73
- it "returns true when valid" do
74
- user.valid?.should eq true
75
- end
76
-
77
- it "returns false when invalid" do
78
- user.email = " "
79
- user.valid?.should eq false
48
+ expect(user.new_record?).to eq true
49
+ user.save!
50
+ expect(user.id).to eq 1
51
+ expect(user.new_record?).to eq false
80
52
  end
81
53
  end
82
54
 
83
55
  it "#update_attributes" do
84
56
  user.save!
85
- user.update_attributes(email: "newemail@example.com").should eq true
86
- user.email.should eq "newemail@example.com"
87
- user.update_attributes(email: " ").should eq false
57
+ expect(user.update_attributes(email: "newemail@example.com")).to eq true
58
+ expect(user.email).to eq "newemail@example.com"
88
59
  end
89
60
 
90
61
  it "#before_save, #after_save" do
91
- user.before_save_called.should eq nil
92
- user.after_save_called.should eq nil
62
+ expect(user.before_save_called).to eq nil
63
+ expect(user.after_save_called).to eq nil
93
64
  user.save!
94
- user.before_save_called.should eq 1
95
- user.after_save_called.should eq 1
65
+ expect(user.before_save_called).to eq 1
66
+ expect(user.after_save_called).to eq 1
96
67
  user.save!
97
- user.before_save_called.should eq 2
98
- user.after_save_called.should eq 2
68
+ expect(user.before_save_called).to eq 2
69
+ expect(user.after_save_called).to eq 2
99
70
  end
100
71
 
101
72
  it "#before_create, #after_create" do
102
- user.before_create_called.should eq nil
103
- user.after_create_called.should eq nil
73
+ expect(user.before_create_called).to eq nil
74
+ expect(user.after_create_called).to eq nil
104
75
  user.save!
105
- user.before_create_called.should eq 1
106
- user.after_create_called.should eq 1
76
+ expect(user.before_create_called).to eq 1
77
+ expect(user.after_create_called).to eq 1
107
78
  user.save!
108
- user.before_create_called.should eq 1
109
- user.after_create_called.should eq 1
79
+ expect(user.before_create_called).to eq 1
80
+ expect(user.after_create_called).to eq 1
110
81
  end
111
82
 
112
83
  it "#before_destroy, #after_destroy" do
113
84
  user.save!
114
- user.before_destroy_called.should eq nil
115
- user.after_destroy_called.should eq nil
85
+ expect(user.before_destroy_called).to eq nil
86
+ expect(user.after_destroy_called).to eq nil
116
87
  user.destroy!
117
- user.before_destroy_called.should eq 1
118
- user.after_destroy_called.should eq 1
88
+ expect(user.before_destroy_called).to eq 1
89
+ expect(user.after_destroy_called).to eq 1
119
90
  end
120
91
 
121
- it "#before_validation, #after_validation" do
122
- user.before_validation_called.should eq nil
123
- user.after_validation_called.should eq nil
124
- user.valid?
125
- user.before_validation_called.should eq 1
126
- user.after_validation_called.should eq 1
92
+ it "can use callbacks as blocks" do
93
+ expect(user.before_save_block_called).to eq nil
94
+ user.save!
95
+ expect(user.before_save_block_called).to eq 1
96
+ user.save!
97
+ expect(user.before_save_block_called).to eq 2
127
98
  end
128
99
 
129
- it "#before_validation_on_create, #after_validation_on_create, #before_validation_on_update, #after_validation_on_update" do
130
- user.before_validation_on_create_called.should eq nil
131
- user.after_validation_on_create_called.should eq nil
100
+ it "has array accessors" do
101
+ expect(user[:email]).to eq "test@example.com"
102
+ user[:email] = "new@example.com"
103
+ expect(user[:email]).to eq "new@example.com"
132
104
 
133
- user.before_validation_on_update_called.should eq nil
134
- user.after_validation_on_update_called.should eq nil
105
+ user.write_attribute(:email, "new2@example.com")
106
+ expect(user.read_attribute(:email)).to eq "new2@example.com"
107
+ end
135
108
 
109
+ it "#to_key" do
110
+ expect(user.to_key).to eq nil
136
111
  user.save!
112
+ expect(user.to_key).to eq [1]
113
+ end
137
114
 
138
- user.before_validation_on_create_called.should eq 1
139
- user.after_validation_on_create_called.should eq 1
140
-
141
- user.before_validation_on_update_called.should eq nil
142
- user.after_validation_on_update_called.should eq nil
143
-
144
- user.update_attributes!(email: "newemail@example.com")
145
-
146
- user.before_validation_on_create_called.should eq 1
147
- user.after_validation_on_create_called.should eq 1
115
+ it "#changed?" do
116
+ expect(user.changed?).to eq true
117
+ user.save!
118
+ expect(user.changed?).to eq false
119
+ user.email = "new@example.com"
120
+ expect(user.changed?).to eq true
121
+ user.save!
122
+ expect(user.changed?).to eq false
123
+ end
148
124
 
149
- user.before_validation_on_update_called.should eq 1
150
- user.after_validation_on_update_called.should eq 1
125
+ it "doesnt care if initialized data has keys as strings" do
126
+ user = User.new("email" => "test@example.com")
127
+ expect(user.email).to eq "test@example.com"
151
128
  end
152
129
  end