core_models 0.0.2

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 +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +34 -0
  4. data/lib/core_models.rb +4 -0
  5. data/lib/core_models/models/concerns/group_concerns.rb +31 -0
  6. data/lib/core_models/models/concerns/role_concerns.rb +31 -0
  7. data/lib/core_models/models/concerns/user_concerns.rb +102 -0
  8. data/lib/core_models/models/group.rb +25 -0
  9. data/lib/core_models/models/group_membership.rb +16 -0
  10. data/lib/core_models/models/groups_role.rb +15 -0
  11. data/lib/core_models/models/permission.rb +24 -0
  12. data/lib/core_models/models/role.rb +33 -0
  13. data/lib/core_models/models/roles_permission.rb +15 -0
  14. data/lib/core_models/models/user.rb +63 -0
  15. data/lib/core_models/version.rb +3 -0
  16. data/lib/generators/core_models_setup_generator.rb +19 -0
  17. data/lib/tasks/core_models_tasks.rake +4 -0
  18. data/spec/dummy/README.rdoc +28 -0
  19. data/spec/dummy/Rakefile +6 -0
  20. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  21. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  22. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  23. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  24. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  25. data/spec/dummy/bin/bundle +3 -0
  26. data/spec/dummy/bin/rails +4 -0
  27. data/spec/dummy/bin/rake +4 -0
  28. data/spec/dummy/bin/setup +29 -0
  29. data/spec/dummy/config.ru +4 -0
  30. data/spec/dummy/config/application.rb +26 -0
  31. data/spec/dummy/config/boot.rb +5 -0
  32. data/spec/dummy/config/database.yml +23 -0
  33. data/spec/dummy/config/environment.rb +5 -0
  34. data/spec/dummy/config/environments/development.rb +41 -0
  35. data/spec/dummy/config/environments/production.rb +79 -0
  36. data/spec/dummy/config/environments/test.rb +42 -0
  37. data/spec/dummy/config/initializers/assets.rb +11 -0
  38. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  39. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  40. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  41. data/spec/dummy/config/initializers/friendly_id.rb +88 -0
  42. data/spec/dummy/config/initializers/inflections.rb +16 -0
  43. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  44. data/spec/dummy/config/initializers/session_store.rb +3 -0
  45. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  46. data/spec/dummy/config/locales/en.yml +23 -0
  47. data/spec/dummy/config/routes.rb +56 -0
  48. data/spec/dummy/config/secrets.yml +22 -0
  49. data/spec/dummy/db/development.sqlite3 +0 -0
  50. data/spec/dummy/db/migrate/20150220064247_create_friendly_id_slugs.rb +15 -0
  51. data/spec/dummy/db/schema.rb +93 -0
  52. data/spec/dummy/db/test.sqlite3 +0 -0
  53. data/spec/dummy/log/development.log +256 -0
  54. data/spec/dummy/log/test.log +21878 -0
  55. data/spec/dummy/public/404.html +67 -0
  56. data/spec/dummy/public/422.html +67 -0
  57. data/spec/dummy/public/500.html +66 -0
  58. data/spec/dummy/public/favicon.ico +0 -0
  59. data/spec/dummy/test.sqlite3 +0 -0
  60. data/spec/models/group_spec.rb +94 -0
  61. data/spec/models/permission_spec.rb +49 -0
  62. data/spec/models/role_spec.rb +113 -0
  63. data/spec/models/user_spec.rb +139 -0
  64. data/spec/rails_helper.rb +57 -0
  65. data/spec/schema.rb +103 -0
  66. data/spec/spec_helper.rb +85 -0
  67. data/spec/support/factories.rb +54 -0
  68. data/spec/support/model_classes.rb +36 -0
  69. data/spec/support/setup.rb +48 -0
  70. data/spec/test.sqlite3 +0 -0
  71. metadata +294 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cf3f58b587e3777e45aec16369a533180e2b42a0
4
+ data.tar.gz: 763caf91792393472bbe867505f4a8aa35707cb2
5
+ SHA512:
6
+ metadata.gz: 0d85d1815a6cb0cd28248ad40e6edf877193507e328d751b84d1fca783e5588a315d238c7b876c5add4df3b88efee573086b32c109096a27b9986b5a732d99a1
7
+ data.tar.gz: b72f6ed31f012c38fbfa3e89acb9128811b0aa6846115faf879f4123232835354c8cc7314b9eb3f67c4f5a3eab2670b686f8921ebd61319303bce47514d4a85f
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2015 Adam Balan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,34 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'CoreModels'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+
20
+
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'lib'
28
+ t.libs << 'test'
29
+ t.pattern = 'test/**/*_test.rb'
30
+ t.verbose = false
31
+ end
32
+
33
+
34
+ task default: :test
@@ -0,0 +1,4 @@
1
+ require 'friendly_id'
2
+
3
+ module CoreModels
4
+ end
@@ -0,0 +1,31 @@
1
+ module CoreModels
2
+ module Models
3
+ module Concerns
4
+ module GroupConcerns
5
+ def has_role?(name)
6
+ self.roles.where(role_name: name).any?
7
+ end
8
+
9
+ def get_role(name)
10
+ self.roles.find(name.parameterize)
11
+ end
12
+
13
+ def role_names
14
+ self.roles.pluck(:role_name)
15
+ end
16
+
17
+ def add_role=(name)
18
+ self.roles << self.roles.klass.find_by(role_name: name)
19
+ end
20
+
21
+ def change_roles=(names)
22
+ self.roles =self.roles.klass.where(role_name: names)
23
+ end
24
+
25
+ def remove_role=(name)
26
+ self.roles.delete(self.roles.klass.find_by(role_name: name))
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ module CoreModels
2
+ module Models
3
+ module Concerns
4
+ module RoleConcerns
5
+ def has_permission?(name)
6
+ self.permissions.where(permission_name: name).any?
7
+ end
8
+
9
+ def has_group?(name)
10
+ self.groups.where(group_name: name).any?
11
+ end
12
+
13
+ def permission_names
14
+ self.permissions.pluck(:permission_name)
15
+ end
16
+
17
+ def add_permission=(name)
18
+ self.permissions << self.permissions.klass.find_by(permission_name: name)
19
+ end
20
+
21
+ def change_permissions=(names)
22
+ self.permissions = self.permissions.klass.where(permission_name: names)
23
+ end
24
+
25
+ def remove_permission=(name)
26
+ self.permissions.delete(self.permissions.klass.find_by(permission_name: name))
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,102 @@
1
+ module CoreModels
2
+ module Models
3
+ module Concerns
4
+ module UserConcerns
5
+ def has_group?(name)
6
+ self.groups.each do |g|
7
+ if g.group_name == name
8
+ return true
9
+ end
10
+ end
11
+
12
+ return false
13
+ end
14
+
15
+ def has_role?(name)
16
+ self.roles.each do |r|
17
+ if r.role_name == name
18
+ return true
19
+ end
20
+ end
21
+
22
+ return false
23
+ end
24
+
25
+ def has_role_for_group?(name, group_name)
26
+ if self.groups.where(group_name: group_name).any?
27
+ if self.groups.find(group_name.parameterize).roles.where(role_name: name).any?
28
+ self.has_role?(name)
29
+ end
30
+ end
31
+ end
32
+
33
+ def add_group_membership(group, role)
34
+ self.group_memberships.create!(group_id: group.id, role_id: role.id)
35
+ end
36
+
37
+ def get_role_from_group_membership(group_id)
38
+ self.group_memberships.find_by!(group_id: group_id).role
39
+ end
40
+
41
+ def remove_group_membership(group_name)
42
+ group = self.groups.klass.find_by!(group_name: group_name)
43
+ self.group_memberships.where(group_id: group.id).delete_all
44
+ end
45
+
46
+ def add_group=(group_name)
47
+ self.groups << self.groups.klass.find_by(group_name: group_name)
48
+ end
49
+
50
+ def role
51
+ self.roles.first.try(:role_name)
52
+ end
53
+
54
+ def group
55
+ self.groups.first.try(:group_name)
56
+ end
57
+
58
+ def group_names
59
+ associated_groups = Array.new
60
+ self.groups.each do |group|
61
+ associated_groups.push(group.group_name)
62
+ end
63
+
64
+ associated_groups
65
+ end
66
+
67
+ def role_names
68
+ associated_roles = Array.new
69
+ self.roles.each do |role|
70
+ associated_roles.push(role.role_name)
71
+ end
72
+
73
+ associated_roles
74
+ end
75
+
76
+ def uniq_permissions
77
+ permission_array = Array.new
78
+
79
+ self.roles.each do |role|
80
+ role.permissions.each do |permission|
81
+ permission_array.push(permission.permission_name)
82
+ end
83
+ end
84
+
85
+ permission_array.uniq
86
+ end
87
+
88
+ def permissions
89
+ permission_array = Array.new
90
+
91
+ self.roles.each do |role|
92
+ role.permissions.each do |permission|
93
+ permission_array.push(permission.permission_name)
94
+ end
95
+ end
96
+
97
+ permission_array
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'concerns/group_concerns'
2
+ require 'active_support/concern'
3
+
4
+ module CoreModels
5
+ module Models
6
+ module Group
7
+ extend ActiveSupport::Concern
8
+ include CoreModels::Models::Concerns::GroupConcerns
9
+
10
+ included do
11
+ extend FriendlyId
12
+ friendly_id :group_name, use: [:slugged, :finders, :history]
13
+
14
+ has_many :group_memeberships
15
+ has_many :users, :through => :group_memberships
16
+
17
+ has_many :groups_roles
18
+ has_many :roles, :through => :groups_roles
19
+
20
+ validates :group_name, presence: true, uniqueness: true
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ require 'active_support/concern'
2
+
3
+ module CoreModels
4
+ module Models
5
+ module GroupMembership
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ belongs_to :user
10
+ belongs_to :group
11
+ belongs_to :role
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ require 'active_support/concern'
2
+
3
+ module CoreModels
4
+ module Models
5
+ module GroupsRole
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ belongs_to :group
10
+ belongs_to :role
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ require 'active_support/concern'
2
+
3
+ module CoreModels
4
+ module Models
5
+ module Permission
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ extend FriendlyId
10
+ friendly_id :permission_name, use: [:slugged, :finders, :history]
11
+
12
+ has_many :roles_permissions
13
+ has_many :roles, :through => :roles_permissions
14
+
15
+ validates :permission_name, presence: true, uniqueness: true
16
+ end
17
+
18
+ def should_generate_new_friendly_id?
19
+ permission_name_changed?
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ require_relative 'concerns/role_concerns'
2
+ require 'active_support/concern'
3
+
4
+ module CoreModels
5
+ module Models
6
+ module Role
7
+ extend ActiveSupport::Concern
8
+ include CoreModels::Models::Concerns::RoleConcerns
9
+
10
+ included do
11
+ extend FriendlyId
12
+
13
+ friendly_id :role_name, use: [:slugged, :finders, :history]
14
+
15
+ has_many :group_memberships
16
+ has_many :users, :through => :group_memberships
17
+
18
+ has_many :groups_roles
19
+ has_many :groups, :through => :groups_roles
20
+
21
+ has_many :roles_permissions
22
+ has_many :permissions, :through => :roles_permissions
23
+
24
+ validates :role_name, presence: true
25
+ validates_uniqueness_of :role_name
26
+ end
27
+
28
+ def should_generate_new_friendly_id?
29
+ role_name_changed?
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,15 @@
1
+ require 'active_support/concern'
2
+
3
+ module CoreModels
4
+ module Models
5
+ module RolesPermission
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ belongs_to :role
10
+ belongs_to :permission
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,63 @@
1
+ require_relative 'concerns/user_concerns'
2
+ require 'active_support/concern'
3
+ require 'bcrypt'
4
+
5
+ module CoreModels
6
+ module Models
7
+ module User
8
+ extend ActiveSupport::Concern
9
+ include CoreModels::Models::Concerns::UserConcerns
10
+
11
+ included do
12
+ extend FriendlyId
13
+ friendly_id :first_name, use: [:slugged, :finders, :history]
14
+
15
+ before_save :encrypt_password
16
+
17
+ has_many :group_memberships, :dependent => :delete_all
18
+ has_many :groups, :through => :group_memberships, :dependent => :delete_all
19
+ has_many :roles, :through => :group_memberships, :dependent => :delete_all
20
+
21
+ validates :first_name, presence: true
22
+ validates :user_name, uniqueness: true, presence: true, length: {minimum: 5}
23
+ validates :email, presence: true, confirmation: true, uniqueness: true
24
+ validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
25
+ validates :password, presence: true, confirmation: true, length: { minimum: 10 }, if: :new_record?
26
+
27
+ before_create{ generate_token(:auth_token) }
28
+ end
29
+
30
+ class_methods do
31
+ def authenticate_user(user_name, password)
32
+ user = self.find_by_user_name(user_name)
33
+ if(user && (user.password == BCrypt::Engine.hash_secret(password, user.salt)))
34
+ user
35
+ else
36
+ nil
37
+ end
38
+ end
39
+ end
40
+
41
+ def encrypt_password
42
+ if password.present?
43
+ self.salt = BCrypt::Engine.generate_salt
44
+ self.password = BCrypt::Engine.hash_secret(password, salt)
45
+ end
46
+ end
47
+
48
+ def send_password_reset
49
+ generate_token(:password_reset_token)
50
+ self.password_reset_timestamp = Time.zone.now
51
+ save!
52
+ UserMailer.password_reset(self).deliver
53
+ end
54
+
55
+ protected
56
+ def generate_token(column)
57
+ begin
58
+ self[column] = SecureRandom.urlsafe_base64
59
+ end while self.class.exists?(column => self[column])
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,3 @@
1
+ module CoreModels
2
+ VERSION = "0.0.2"
3
+ end