socialization 0.4.0 → 0.5.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. data/.gitignore +5 -1
  2. data/CHANGELOG.md +41 -0
  3. data/README.md +246 -0
  4. data/demo/{demo_app/.gitignore → .gitignore} +0 -0
  5. data/demo/{demo_app/Gemfile → Gemfile} +1 -1
  6. data/demo/{demo_app/README.rdoc → README.rdoc} +0 -0
  7. data/demo/{demo_app/Rakefile → Rakefile} +0 -0
  8. data/demo/{demo_app/app → app}/assets/images/rails.png +0 -0
  9. data/demo/{demo_app/app → app}/assets/javascripts/application.js +0 -0
  10. data/demo/{demo_app/app → app}/assets/stylesheets/application.css +0 -0
  11. data/demo/{demo_app/app → app}/controllers/application_controller.rb +0 -0
  12. data/demo/{demo_app/app → app}/helpers/application_helper.rb +0 -0
  13. data/demo/{demo_app/app → app}/mailers/.gitkeep +0 -0
  14. data/demo/{demo_app/app → app}/models/.gitkeep +0 -0
  15. data/demo/{demo_app/app → app}/models/celebrity.rb +0 -0
  16. data/demo/{demo_app/app → app}/models/comment.rb +0 -0
  17. data/demo/app/models/follow.rb +2 -0
  18. data/demo/app/models/like.rb +2 -0
  19. data/demo/app/models/mention.rb +2 -0
  20. data/demo/{demo_app/app → app}/models/movie.rb +0 -0
  21. data/demo/{demo_app/app → app}/models/user.rb +0 -0
  22. data/demo/{demo_app/app → app}/views/layouts/application.html.erb +0 -0
  23. data/demo/{demo_app/config.ru → config.ru} +0 -0
  24. data/demo/{demo_app/config → config}/application.rb +0 -0
  25. data/demo/{demo_app/config → config}/boot.rb +0 -0
  26. data/demo/{demo_app/config → config}/database.yml +0 -0
  27. data/demo/{demo_app/config → config}/environment.rb +0 -0
  28. data/demo/{demo_app/config → config}/environments/development.rb +0 -0
  29. data/demo/{demo_app/config → config}/environments/production.rb +0 -0
  30. data/demo/{demo_app/config → config}/environments/test.rb +0 -0
  31. data/demo/{demo_app/config → config}/initializers/backtrace_silencers.rb +0 -0
  32. data/demo/{demo_app/config → config}/initializers/inflections.rb +0 -0
  33. data/demo/{demo_app/config → config}/initializers/mime_types.rb +0 -0
  34. data/demo/{demo_app/config → config}/initializers/secret_token.rb +0 -0
  35. data/demo/{demo_app/config → config}/initializers/session_store.rb +1 -1
  36. data/demo/{demo_app/config → config}/initializers/wrap_parameters.rb +1 -1
  37. data/demo/{demo_app/config → config}/locales/en.yml +0 -0
  38. data/demo/{demo_app/config → config}/routes.rb +0 -0
  39. data/demo/{demo_app/db → db}/migrate/20120115051222_create_users.rb +0 -0
  40. data/demo/{demo_app/db → db}/migrate/20120115051234_create_movies.rb +0 -0
  41. data/demo/{demo_app/db → db}/migrate/20120115051255_create_celebrities.rb +0 -0
  42. data/demo/{demo_app/db → db}/migrate/20120115054646_create_follows.rb +0 -0
  43. data/demo/{demo_app/db → db}/migrate/20120115054647_create_likes.rb +0 -0
  44. data/demo/{demo_app/db → db}/migrate/20120221200644_create_mentions.rb +0 -0
  45. data/demo/{demo_app/db → db}/migrate/20120221202703_create_comments.rb +0 -0
  46. data/demo/{demo_app/db → db}/schema.rb +0 -1
  47. data/demo/{demo_app/db → db}/seeds.rb +0 -0
  48. data/demo/{demo_app/lib → lib}/assets/.gitkeep +0 -0
  49. data/demo/{demo_app/lib → lib}/tasks/.gitkeep +0 -0
  50. data/demo/{demo_app/public → public}/404.html +0 -0
  51. data/demo/{demo_app/public → public}/422.html +0 -0
  52. data/demo/{demo_app/public → public}/500.html +0 -0
  53. data/demo/{demo_app/public → public}/favicon.ico +0 -0
  54. data/demo/{demo_app/public → public}/index.html +0 -0
  55. data/demo/{demo_app/public → public}/robots.txt +0 -0
  56. data/demo/{demo_app/script → script}/rails +0 -0
  57. data/demo/{demo_app/test → test}/fixtures/.gitkeep +0 -0
  58. data/demo/{demo_app/test → test}/fixtures/celebrities.yml +0 -0
  59. data/demo/{demo_app/test → test}/fixtures/movies.yml +0 -0
  60. data/demo/{demo_app/test → test}/fixtures/users.yml +0 -0
  61. data/demo/{demo_app/test → test}/functional/.gitkeep +0 -0
  62. data/demo/{demo_app/test → test}/integration/.gitkeep +0 -0
  63. data/demo/{demo_app/test → test}/performance/browsing_test.rb +0 -0
  64. data/demo/{demo_app/test → test}/test_helper.rb +0 -0
  65. data/demo/{demo_app/test → test}/unit/.gitkeep +0 -0
  66. data/demo/{demo_app/test → test}/unit/celebrity_test.rb +0 -0
  67. data/demo/{demo_app/test → test}/unit/movie_test.rb +0 -0
  68. data/demo/{demo_app/test → test}/unit/user_test.rb +0 -0
  69. data/demo/{demo_app/vendor → vendor}/assets/javascripts/.gitkeep +0 -0
  70. data/demo/{demo_app/vendor → vendor}/assets/stylesheets/.gitkeep +0 -0
  71. data/demo/{demo_app/vendor → vendor}/plugins/.gitkeep +0 -0
  72. data/lib/generators/socialization/socialization_generator.rb +20 -9
  73. data/{generators/socialization/templates → lib/generators/socialization/templates/active_record}/migration_follows.rb +0 -0
  74. data/{generators/socialization/templates → lib/generators/socialization/templates/active_record}/migration_likes.rb +0 -0
  75. data/{generators/socialization/templates → lib/generators/socialization/templates/active_record}/migration_mentions.rb +0 -0
  76. data/lib/generators/socialization/templates/active_record/model_follow.rb +2 -0
  77. data/lib/generators/socialization/templates/active_record/model_like.rb +2 -0
  78. data/lib/generators/socialization/templates/active_record/model_mention.rb +2 -0
  79. data/lib/socialization.rb +3 -5
  80. data/lib/socialization/actors/follower.rb +74 -0
  81. data/lib/socialization/actors/liker.rb +74 -0
  82. data/lib/socialization/actors/mentioner.rb +74 -0
  83. data/lib/socialization/acts_as_helpers.rb +43 -0
  84. data/lib/socialization/config.rb +45 -0
  85. data/lib/socialization/helpers/string.rb +17 -0
  86. data/lib/socialization/stores/active_record/follow_store.rb +143 -0
  87. data/lib/socialization/stores/active_record/like_store.rb +143 -0
  88. data/lib/socialization/stores/active_record/mention_store.rb +143 -0
  89. data/lib/socialization/stores/redis/base.rb +8 -0
  90. data/lib/socialization/stores/redis/config.rb +11 -0
  91. data/lib/socialization/stores/redis/follow_store.rb +126 -0
  92. data/lib/socialization/stores/redis/like_store.rb +126 -0
  93. data/lib/socialization/stores/redis/mention_store.rb +126 -0
  94. data/lib/socialization/version.rb +1 -1
  95. data/lib/socialization/victims/followable.rb +38 -0
  96. data/lib/socialization/victims/likeable.rb +38 -0
  97. data/lib/socialization/victims/mentionable.rb +38 -0
  98. data/socialization.gemspec +3 -3
  99. data/test/actors/follower_test.rb +74 -0
  100. data/test/actors/liker_test.rb +74 -0
  101. data/test/actors/mentioner_test.rb +74 -0
  102. data/test/stores/active_record/follow_store_test.rb +121 -0
  103. data/test/stores/active_record/like_store_test.rb +121 -0
  104. data/test/stores/active_record/mention_store_test.rb +121 -0
  105. data/test/stores/redis/config_test.rb +30 -0
  106. data/test/stores/redis/follow_store_test.rb +153 -0
  107. data/test/stores/redis/like_store_test.rb +153 -0
  108. data/test/stores/redis/mention_store_test.rb +153 -0
  109. data/test/string_test.rb +13 -0
  110. data/test/test_helper.rb +70 -12
  111. data/test/victims/followable_test.rb +34 -0
  112. data/test/victims/likeable_test.rb +34 -0
  113. data/test/victims/mentionable_test.rb +34 -0
  114. data/test/world_test.rb +80 -69
  115. metadata +261 -176
  116. data/README.rdoc +0 -186
  117. data/demo/demo_app/app/models/follow.rb +0 -3
  118. data/demo/demo_app/app/models/like.rb +0 -3
  119. data/demo/demo_app/app/models/mention.rb +0 -3
  120. data/demo/demo_app/doc/README_FOR_APP +0 -2
  121. data/gemfiles/activerecord30.gemfile +0 -6
  122. data/gemfiles/activerecord30.gemfile.lock +0 -23
  123. data/gemfiles/activerecord31.gemfile +0 -6
  124. data/gemfiles/activerecord31.gemfile.lock +0 -25
  125. data/gemfiles/activerecord32.gemfile +0 -6
  126. data/gemfiles/activerecord32.gemfile.lock +0 -25
  127. data/generators/socialization/USAGE +0 -1
  128. data/generators/socialization/socialization_generator.rb +0 -15
  129. data/generators/socialization/templates/model_follow.rb +0 -3
  130. data/generators/socialization/templates/model_like.rb +0 -3
  131. data/generators/socialization/templates/model_mention.rb +0 -3
  132. data/lib/socialization/follow_store.rb +0 -14
  133. data/lib/socialization/followable.rb +0 -34
  134. data/lib/socialization/follower.rb +0 -50
  135. data/lib/socialization/hello.rb +0 -53
  136. data/lib/socialization/like_store.rb +0 -14
  137. data/lib/socialization/likeable.rb +0 -34
  138. data/lib/socialization/liker.rb +0 -54
  139. data/lib/socialization/mention_store.rb +0 -14
  140. data/lib/socialization/mentionable.rb +0 -36
  141. data/lib/socialization/mentioner.rb +0 -54
  142. data/test/follow_test.rb +0 -125
  143. data/test/like_test.rb +0 -125
  144. data/test/mention_test.rb +0 -116
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,9 +1,12 @@
1
1
  require 'rails/generators'
2
2
  require 'rails/generators/migration'
3
3
 
4
+ STORES = %w(active_record redis)
5
+
4
6
  class SocializationGenerator < Rails::Generators::Base
5
7
  include Rails::Generators::Migration
6
- source_root File.expand_path(File.join('..', '..', '..', 'generators', 'socialization', 'templates'), File.dirname(__FILE__))
8
+ source_root File.expand_path(File.join('templates'), File.dirname(__FILE__))
9
+ class_option :store, :type => :string, :default => 'active_record', :description => "Type of datastore"
7
10
 
8
11
  def self.next_migration_number(dirname)
9
12
  if ActiveRecord::Base.timestamped_migrations
@@ -14,14 +17,22 @@ class SocializationGenerator < Rails::Generators::Base
14
17
  end
15
18
 
16
19
  def create_migration_file
17
- copy_file 'model_follow.rb', 'app/models/follow.rb'
18
- copy_file 'model_like.rb', 'app/models/like.rb'
19
- copy_file 'model_mention.rb', 'app/models/mention.rb'
20
+ options[:store].downcase!
21
+ unless STORES.include?(options[:store])
22
+ puts "Invalid store '#{options[:store]}'. The following stores are valid: #{STORES.join(', ')}."
23
+ exit 1
24
+ end
20
25
 
21
- migration_template 'migration_follows.rb', 'db/migrate/create_follows.rb'
22
- sleep 1 # wait a second to have a unique migration timestamp
23
- migration_template 'migration_likes.rb', 'db/migrate/create_likes.rb'
24
- sleep 1 # wait a second to have a unique migration timestamp
25
- migration_template 'migration_mentions.rb', 'db/migrate/create_mentions.rb'
26
+ copy_file "#{options[:store]}/model_follow.rb", 'app/models/follow.rb'
27
+ copy_file "#{options[:store]}/model_like.rb", 'app/models/like.rb'
28
+ copy_file "#{options[:store]}/model_mention.rb", 'app/models/mention.rb'
29
+
30
+ if options[:store] == 'active_record'
31
+ migration_template "#{options[:store]}/migration_follows.rb", 'db/migrate/create_follows.rb'
32
+ sleep 1 # wait a second to have a unique migration timestamp
33
+ migration_template "#{options[:store]}/migration_likes.rb", 'db/migrate/create_likes.rb'
34
+ sleep 1 # wait a second to have a unique migration timestamp
35
+ migration_template "#{options[:store]}/migration_mentions.rb", 'db/migrate/create_mentions.rb'
36
+ end
26
37
  end
27
38
  end
@@ -0,0 +1,2 @@
1
+ class Follow < Socialization::ActiveRecordStores::FollowStore
2
+ end
@@ -0,0 +1,2 @@
1
+ class Like < Socialization::ActiveRecordStores::LikeStore
2
+ end
@@ -0,0 +1,2 @@
1
+ class Mention < Socialization::ActiveRecordStores::MentionStore
2
+ end
data/lib/socialization.rb CHANGED
@@ -1,6 +1,4 @@
1
- require 'socialization/hello'
1
+ require 'socialization/config'
2
+ require 'socialization/acts_as_helpers'
2
3
 
3
- module Socialization
4
- end
5
-
6
- ActiveRecord::Base.send :include, Socialization::Hello
4
+ ActiveRecord::Base.send :include, Socialization::ActsAsHelpers
@@ -0,0 +1,74 @@
1
+ module ActiveRecord
2
+ class Base
3
+ def is_follower?
4
+ false
5
+ end
6
+ end
7
+ end
8
+
9
+ module Socialization
10
+ module Follower
11
+ extend ActiveSupport::Concern
12
+
13
+ included do
14
+ # Specifies if self can follow {Followable} objects.
15
+ #
16
+ # @return [Boolean]
17
+ def is_follower?
18
+ true
19
+ end
20
+
21
+ # Create a new {FollowStores follow} relationship.
22
+ #
23
+ # @param [Followable] followable the object to be followed.
24
+ # @return [Boolean]
25
+ def follow!(followable)
26
+ raise ArgumentError, "#{followable} is not followable!" unless followable.respond_to?(:is_followable?) && followable.is_followable?
27
+ Socialization.follow_model.follow!(self, followable)
28
+ end
29
+
30
+ # Delete a {FollowStores follow} relationship.
31
+ #
32
+ # @param [Followable] followable the object to unfollow.
33
+ # @return [Boolean]
34
+ def unfollow!(followable)
35
+ raise ArgumentError, "#{followable} is not followable!" unless followable.respond_to?(:is_followable?) && followable.is_followable?
36
+ Socialization.follow_model.unfollow!(self, followable)
37
+ end
38
+
39
+ # Toggles a {FollowStores follow} relationship.
40
+ #
41
+ # @param [Followable] followable the object to follow/unfollow.
42
+ # @return [Boolean]
43
+ def toggle_follow!(followable)
44
+ raise ArgumentError, "#{followable} is not followable!" unless followable.respond_to?(:is_followable?) && followable.is_followable?
45
+ if follows?(followable)
46
+ unfollow!(followable)
47
+ false
48
+ else
49
+ follow!(followable)
50
+ true
51
+ end
52
+ end
53
+
54
+ # Specifies if self follows a {Followable} object.
55
+ #
56
+ # @param [Followable] followable the {Followable} object to test against.
57
+ # @return [Boolean]
58
+ def follows?(followable)
59
+ raise ArgumentError, "#{followable} is not followable!" unless followable.respond_to?(:is_followable?) && followable.is_followable?
60
+ Socialization.follow_model.follows?(self, followable)
61
+ end
62
+
63
+ # Returns all the followables of a certain type that are followed by self
64
+ #
65
+ # @params [Followable] klass the type of {Followable} you want
66
+ # @params [Hash] opts a hash of options
67
+ # @return [Array<Followable, Numeric>] An array of Followable objects or IDs
68
+ def followables(klass, opts = {})
69
+ Socialization.follow_model.followables(self, klass, opts)
70
+ end
71
+
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,74 @@
1
+ module ActiveRecord
2
+ class Base
3
+ def is_liker?
4
+ false
5
+ end
6
+ end
7
+ end
8
+
9
+ module Socialization
10
+ module Liker
11
+ extend ActiveSupport::Concern
12
+
13
+ included do
14
+ # Specifies if self can like {Likeable} objects.
15
+ #
16
+ # @return [Boolean]
17
+ def is_liker?
18
+ true
19
+ end
20
+
21
+ # Create a new {LikeStores like} relationship.
22
+ #
23
+ # @param [Likeable] likeable the object to be liked.
24
+ # @return [Boolean]
25
+ def like!(likeable)
26
+ raise ArgumentError, "#{likeable} is not likeable!" unless likeable.respond_to?(:is_likeable?) && likeable.is_likeable?
27
+ Socialization.like_model.like!(self, likeable)
28
+ end
29
+
30
+ # Delete a {LikeStores like} relationship.
31
+ #
32
+ # @param [Likeable] likeable the object to unlike.
33
+ # @return [Boolean]
34
+ def unlike!(likeable)
35
+ raise ArgumentError, "#{likeable} is not likeable!" unless likeable.respond_to?(:is_likeable?) && likeable.is_likeable?
36
+ Socialization.like_model.unlike!(self, likeable)
37
+ end
38
+
39
+ # Toggles a {LikeStores like} relationship.
40
+ #
41
+ # @param [Likeable] likeable the object to like/unlike.
42
+ # @return [Boolean]
43
+ def toggle_like!(likeable)
44
+ raise ArgumentError, "#{likeable} is not likeable!" unless likeable.respond_to?(:is_likeable?) && likeable.is_likeable?
45
+ if likes?(likeable)
46
+ unlike!(likeable)
47
+ false
48
+ else
49
+ like!(likeable)
50
+ true
51
+ end
52
+ end
53
+
54
+ # Specifies if self likes a {Likeable} object.
55
+ #
56
+ # @param [Likeable] likeable the {Likeable} object to test against.
57
+ # @return [Boolean]
58
+ def likes?(likeable)
59
+ raise ArgumentError, "#{likeable} is not likeable!" unless likeable.respond_to?(:is_likeable?) && likeable.is_likeable?
60
+ Socialization.like_model.likes?(self, likeable)
61
+ end
62
+
63
+ # Returns all the likeables of a certain type that are liked by self
64
+ #
65
+ # @params [Likeable] klass the type of {Likeable} you want
66
+ # @params [Hash] opts a hash of options
67
+ # @return [Array<Likeable, Numeric>] An array of Likeable objects or IDs
68
+ def likeables(klass, opts = {})
69
+ Socialization.like_model.likeables(self, klass, opts)
70
+ end
71
+
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,74 @@
1
+ module ActiveRecord
2
+ class Base
3
+ def is_mentioner?
4
+ false
5
+ end
6
+ end
7
+ end
8
+
9
+ module Socialization
10
+ module Mentioner
11
+ extend ActiveSupport::Concern
12
+
13
+ included do
14
+ # Specifies if self can mention {Mentionable} objects.
15
+ #
16
+ # @return [Boolean]
17
+ def is_mentioner?
18
+ true
19
+ end
20
+
21
+ # Create a new {MentionStores mention} relationship.
22
+ #
23
+ # @param [Mentionable] mentionable the object to be mentioned.
24
+ # @return [Boolean]
25
+ def mention!(mentionable)
26
+ raise ArgumentError, "#{mentionable} is not mentionable!" unless mentionable.respond_to?(:is_mentionable?) && mentionable.is_mentionable?
27
+ Socialization.mention_model.mention!(self, mentionable)
28
+ end
29
+
30
+ # Delete a {MentionStores mention} relationship.
31
+ #
32
+ # @param [Mentionable] mentionable the object to unmention.
33
+ # @return [Boolean]
34
+ def unmention!(mentionable)
35
+ raise ArgumentError, "#{mentionable} is not mentionable!" unless mentionable.respond_to?(:is_mentionable?) && mentionable.is_mentionable?
36
+ Socialization.mention_model.unmention!(self, mentionable)
37
+ end
38
+
39
+ # Toggles a {MentionStores mention} relationship.
40
+ #
41
+ # @param [Mentionable] mentionable the object to mention/unmention.
42
+ # @return [Boolean]
43
+ def toggle_mention!(mentionable)
44
+ raise ArgumentError, "#{mentionable} is not mentionable!" unless mentionable.respond_to?(:is_mentionable?) && mentionable.is_mentionable?
45
+ if mentions?(mentionable)
46
+ unmention!(mentionable)
47
+ false
48
+ else
49
+ mention!(mentionable)
50
+ true
51
+ end
52
+ end
53
+
54
+ # Specifies if self mentions a {Mentionable} object.
55
+ #
56
+ # @param [Mentionable] mentionable the {Mentionable} object to test against.
57
+ # @return [Boolean]
58
+ def mentions?(mentionable)
59
+ raise ArgumentError, "#{mentionable} is not mentionable!" unless mentionable.respond_to?(:is_mentionable?) && mentionable.is_mentionable?
60
+ Socialization.mention_model.mentions?(self, mentionable)
61
+ end
62
+
63
+ # Returns all the mentionables of a certain type that are mentioned by self
64
+ #
65
+ # @params [Mentionable] klass the type of {Mentionable} you want
66
+ # @params [Hash] opts a hash of options
67
+ # @return [Array<Mentionable, Numeric>] An array of Mentionable objects or IDs
68
+ def mentionables(klass, opts = {})
69
+ Socialization.mention_model.mentionables(self, klass, opts)
70
+ end
71
+
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,43 @@
1
+ require 'active_support/concern'
2
+
3
+ %w(helpers stores actors victims).each do |path|
4
+ Dir["#{File.dirname(__FILE__)}/#{path}/**/*.rb"].each { |f| require(f) }
5
+ end
6
+
7
+ module Socialization
8
+ module ActsAsHelpers
9
+ extend ActiveSupport::Concern
10
+
11
+ module ClassMethods
12
+ # Make the current class a {Socialization::Follower}
13
+ def acts_as_follower(opts = {})
14
+ include Socialization::Follower
15
+ end
16
+
17
+ # Make the current class a {Socialization::Followable}
18
+ def acts_as_followable(opts = {})
19
+ include Socialization::Followable
20
+ end
21
+
22
+ # Make the current class a {Socialization::Liker}
23
+ def acts_as_liker(opts = {})
24
+ include Socialization::Liker
25
+ end
26
+
27
+ # Make the current class a {Socialization::Likeable}
28
+ def acts_as_likeable(opts = {})
29
+ include Socialization::Likeable
30
+ end
31
+
32
+ # Make the current class a {Socialization::Mentioner}
33
+ def acts_as_mentioner(opts = {})
34
+ include Socialization::Mentioner
35
+ end
36
+
37
+ # Make the current class a {Socialization::Mentionable}
38
+ def acts_as_mentionable(opts = {})
39
+ include Socialization::Mentionable
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,45 @@
1
+ module Socialization
2
+ class << self
3
+ def follow_model
4
+ if @follow_model
5
+ @follow_model
6
+ elsif defined?(::Follow)
7
+ ::Follow
8
+ else
9
+ raise RuntimeError.new("No Follow model has been defined.")
10
+ end
11
+ end
12
+
13
+ def follow_model=(klass)
14
+ @follow_model = klass
15
+ end
16
+
17
+ def like_model
18
+ if @like_model
19
+ @like_model
20
+ elsif defined?(::Like)
21
+ ::Like
22
+ else
23
+ raise RuntimeError.new("No Like model has been defined.")
24
+ end
25
+ end
26
+
27
+ def like_model=(klass)
28
+ @like_model = klass
29
+ end
30
+
31
+ def mention_model
32
+ if @mention_model
33
+ @mention_model
34
+ elsif defined?(::Mention)
35
+ ::Mention
36
+ else
37
+ raise RuntimeError.new("No Mention model has been defined.")
38
+ end
39
+ end
40
+
41
+ def mention_model=(klass)
42
+ @mention_model = klass
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ class String
2
+
3
+ def deep_const_get
4
+ result = nil
5
+ path = self.clone.split("::")
6
+
7
+ path.each do |p|
8
+ result = (result || Kernel).const_get(p)
9
+ end
10
+ result
11
+ end
12
+
13
+ def is_integer?
14
+ self.to_i.to_s == self
15
+ end
16
+
17
+ end