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