acts_as_word_cloud 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,10 @@
1
+ class ArticleReader < ActiveRecord::Base
2
+ acts_as_word_cloud :included_methods => [:name]
3
+
4
+ belongs_to :article
5
+ belongs_to :reader
6
+
7
+ def name
8
+ "ArticleReader #{id}"
9
+ end
10
+ end
@@ -1,7 +1,10 @@
1
1
  class Author < ActiveRecord::Base
2
- acts_as_word_cloud :methods_to_use => [:name], :excluded_models => [], :skipped_attributes => [], :depth => 1
2
+ acts_as_word_cloud
3
3
 
4
4
  has_many :articles
5
5
  belongs_to :publisher
6
- belongs_to :site
6
+
7
+ def to_s
8
+ "Author #{id}"
9
+ end
7
10
  end
@@ -1,7 +1,8 @@
1
1
  class Publisher < ActiveRecord::Base
2
- acts_as_word_cloud :methods_to_use => [:name], :excluded_models => [], :skipped_attributes => [], :depth => 1
3
-
4
- has_one :site
5
- has_many :articles
6
2
  has_many :authors
3
+ has_many :articles, :through => :authors
4
+
5
+ def to_s
6
+ "Publisher #{id}"
7
+ end
7
8
  end
@@ -1,7 +1,10 @@
1
1
  class Reader < ActiveRecord::Base
2
- acts_as_word_cloud :methods_to_use => [:username], :excluded_models => [], :skipped_attributes => [], :depth => 1
2
+ acts_as_word_cloud
3
3
 
4
- has_many :followings
5
- has_many :articles, :through => :followings
6
- belongs_to :site
4
+ has_many :article_readers
5
+ has_many :articles, :through => :article_readers
6
+
7
+ def to_s
8
+ "Reader #{id}"
9
+ end
7
10
  end
@@ -2,29 +2,19 @@ class CreateSystem < ActiveRecord::Migration
2
2
  def change
3
3
  create_table :articles do |t|
4
4
  t.integer :author_id
5
- t.integer :publisher_id
6
- t.integer :site_id
7
5
  t.string :title
8
6
  t.string :genre
9
7
  t.text :content
10
8
 
11
9
  t.timestamps
12
10
  end
13
- add_index :articles, :author_id
14
- add_index :articles, :publisher_id
15
- add_index :articles, :site_id
16
11
 
17
12
  create_table :authors do |t|
18
13
  t.integer :publisher_id
19
- t.integer :site_id
20
14
  t.string :name
21
- t.string :genre
22
- t.integer :age
23
15
 
24
16
  t.timestamps
25
17
  end
26
- add_index :authors, :publisher_id
27
- add_index :authors, :site_id
28
18
 
29
19
  create_table :publishers do |t|
30
20
  t.string :name
@@ -34,31 +24,15 @@ class CreateSystem < ActiveRecord::Migration
34
24
  end
35
25
 
36
26
  create_table :readers do |t|
37
- t.integer :site_id
38
- t.string :username
27
+ t.string :name
39
28
  t.integer :age
40
29
 
41
30
  t.timestamps
42
31
  end
43
- add_index :readers, :site_id
44
32
 
45
- create_table :followings do |t|
46
- t.string :special_name
33
+ create_table :article_readers do |t|
47
34
  t.integer :article_id
48
35
  t.integer :reader_id
49
36
  end
50
- add_index :followings, :article_id
51
- add_index :followings, :reader_id
52
-
53
- create_table :sites do |t|
54
- t.integer :publisher_id
55
- t.string :name
56
- t.string :domain
57
- t.string :genre
58
-
59
- t.timestamps
60
- end
61
- add_index :sites, :publisher_id
62
-
63
37
  end
64
38
  end
@@ -13,69 +13,39 @@
13
13
 
14
14
  ActiveRecord::Schema.define(:version => 20121107162154) do
15
15
 
16
+ create_table "article_readers", :force => true do |t|
17
+ t.integer "article_id"
18
+ t.integer "reader_id"
19
+ end
20
+
16
21
  create_table "articles", :force => true do |t|
17
22
  t.integer "author_id"
18
- t.integer "publisher_id"
19
- t.integer "site_id"
20
23
  t.string "title"
21
24
  t.string "genre"
22
25
  t.text "content"
23
- t.datetime "created_at", :null => false
24
- t.datetime "updated_at", :null => false
26
+ t.datetime "created_at"
27
+ t.datetime "updated_at"
25
28
  end
26
29
 
27
- add_index "articles", ["author_id"], :name => "index_articles_on_author_id"
28
- add_index "articles", ["publisher_id"], :name => "index_articles_on_publisher_id"
29
- add_index "articles", ["site_id"], :name => "index_articles_on_site_id"
30
-
31
30
  create_table "authors", :force => true do |t|
32
31
  t.integer "publisher_id"
33
- t.integer "site_id"
34
32
  t.string "name"
35
- t.string "genre"
36
- t.integer "age"
37
- t.datetime "created_at", :null => false
38
- t.datetime "updated_at", :null => false
39
- end
40
-
41
- add_index "authors", ["publisher_id"], :name => "index_authors_on_publisher_id"
42
- add_index "authors", ["site_id"], :name => "index_authors_on_site_id"
43
-
44
- create_table "followings", :force => true do |t|
45
- t.string "special_name"
46
- t.integer "article_id"
47
- t.integer "reader_id"
33
+ t.datetime "created_at"
34
+ t.datetime "updated_at"
48
35
  end
49
36
 
50
- add_index "followings", ["article_id"], :name => "index_followings_on_article_id"
51
- add_index "followings", ["reader_id"], :name => "index_followings_on_reader_id"
52
-
53
37
  create_table "publishers", :force => true do |t|
54
38
  t.string "name"
55
39
  t.string "location"
56
- t.datetime "created_at", :null => false
57
- t.datetime "updated_at", :null => false
40
+ t.datetime "created_at"
41
+ t.datetime "updated_at"
58
42
  end
59
43
 
60
44
  create_table "readers", :force => true do |t|
61
- t.integer "site_id"
62
- t.string "username"
63
- t.integer "age"
64
- t.datetime "created_at", :null => false
65
- t.datetime "updated_at", :null => false
66
- end
67
-
68
- add_index "readers", ["site_id"], :name => "index_readers_on_site_id"
69
-
70
- create_table "sites", :force => true do |t|
71
- t.integer "publisher_id"
72
45
  t.string "name"
73
- t.string "domain"
74
- t.string "genre"
75
- t.datetime "created_at", :null => false
76
- t.datetime "updated_at", :null => false
46
+ t.integer "age"
47
+ t.datetime "created_at"
48
+ t.datetime "updated_at"
77
49
  end
78
50
 
79
- add_index "sites", ["publisher_id"], :name => "index_sites_on_publisher_id"
80
-
81
51
  end
@@ -0,0 +1,123 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Integration tests" do
4
+ describe "mixin" do
5
+ it "should set default values if called with no arguments" do
6
+ reader = Reader.new
7
+ reader.word_cloud_attributes[:included_methods].should == []
8
+ reader.word_cloud_attributes[:excluded_methods].should == []
9
+ reader.word_cloud_attributes[:excluded_models].should == []
10
+ reader.word_cloud_attributes[:depth].should == ActsAsWordCloud.config.default_search_depth
11
+ reader.word_cloud_attributes[:object_name_methods].should == ActsAsWordCloud.config.object_name_methods
12
+ end
13
+
14
+ it "should set attributes included in the mixin call" do
15
+ article = Article.new
16
+ article.word_cloud_attributes[:included_methods].should == [:truncated_title]
17
+ article.word_cloud_attributes[:excluded_methods].should == [:genre]
18
+ article.word_cloud_attributes[:excluded_models].should == [ArticleReader, Reader]
19
+ article.word_cloud_attributes[:depth].should == 2
20
+ article.word_cloud_attributes[:object_name_methods].should == [:title]
21
+ end
22
+ end
23
+
24
+ describe "included methods" do
25
+ before(:each) do
26
+ @publisher = Publisher.make(:name => "Cloudhouse")
27
+ @author = Author.make(:publisher => @publisher, :name => "Jeremiah Hemphill")
28
+ @article = Article.make(:author => @author)
29
+
30
+ @word_cloud_output = @article.word_cloud(:array)
31
+ end
32
+
33
+ it "should return database attributes" do
34
+ expected_word_cloud_output = [
35
+ @article.title,
36
+ @article.content
37
+ ]
38
+ expected_word_cloud_output.each do |str|
39
+ @word_cloud_output.should include str
40
+ end
41
+ end
42
+
43
+ it "should return associated object names" do
44
+ expected_word_cloud_output = [
45
+ @author.name,
46
+ @publisher.name,
47
+ ]
48
+ expected_word_cloud_output.each do |str|
49
+ @word_cloud_output.should include str
50
+ end
51
+ end
52
+
53
+ it "should return included methods" do
54
+ expected_word_cloud_output = [
55
+ @article.truncated_title
56
+ ]
57
+ expected_word_cloud_output.each do |str|
58
+ @word_cloud_output.should include str
59
+ end
60
+ end
61
+ end
62
+
63
+ describe "excluded methods" do
64
+ before(:each) do
65
+ @article = Article.make
66
+ @word_cloud_output = @article.word_cloud(:array)
67
+ end
68
+
69
+ it "should not include database attributes in excluded methods" do
70
+ @word_cloud_output.should_not include @article.genre
71
+ end
72
+ end
73
+
74
+ describe "excluded_models" do
75
+ before(:each) do
76
+ @article = Article.make
77
+ @reader = Reader.make(:name => "Alfredo Uribe")
78
+ @article_reader = ArticleReader.make(:article => @article, :reader => @reader)
79
+ @word_cloud_output = @article.word_cloud(:array)
80
+ end
81
+
82
+ it "should not include excluded models with an association to the current model" do
83
+ @word_cloud_output.should_not include @article_reader.name
84
+ end
85
+
86
+ it "should not include children of excluded models if the depth is set to 2" do
87
+ @word_cloud_output.should_not include @reader.name
88
+ end
89
+ end
90
+
91
+ describe "depth" do
92
+ before(:each) do
93
+ @publisher = Publisher.make(:name => "Cloudhouse")
94
+ @author = Author.make(:publisher => @publisher, :name => "Jeremiah Hemphill")
95
+ @article = Article.make(:author => @author)
96
+ @reader = Reader.make(:name => "Alfredo Uribe")
97
+ @article_reader = ArticleReader.make(:article => @article, :reader => @reader)
98
+ end
99
+
100
+ it "should return a single level of associations if the depth is set to 1" do
101
+ @word_cloud_output = @article_reader.word_cloud(:array)
102
+
103
+ expected_word_cloud_output = [ @article.title, @reader.name ]
104
+ expected_word_cloud_output.each { |str| @word_cloud_output.should include str }
105
+
106
+ unexpected_word_cloud_output = [ @publisher.name, @author.name ]
107
+ unexpected_word_cloud_output.each { |str| @word_cloud_output.should_not include str }
108
+
109
+ end
110
+
111
+ it "should return multiple levels of associations if the depth is set to 2" do
112
+ @word_cloud_output = @article.word_cloud(:array)
113
+
114
+ expected_word_cloud_output = [
115
+ @author.name,
116
+ @publisher.name,
117
+ ]
118
+ expected_word_cloud_output.each do |str|
119
+ @word_cloud_output.should include str
120
+ end
121
+ end
122
+ end
123
+ end
data/spec/spec_helper.rb CHANGED
@@ -3,12 +3,14 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
3
 
4
4
  ENV["RAILS_ENV"] = 'test'
5
5
  require File.expand_path("../dummy/config/environment", __FILE__)
6
- require File.expand_path("../dummy/features/support/blueprints", __FILE__)
7
- require File.expand_path("../dummy/lib/model_methods_helper", __FILE__)
8
6
 
9
- require 'rspec'
7
+ # require 'rails/test_help'
8
+ require 'rspec/rails'
10
9
  require 'acts_as_word_cloud'
10
+ require 'database_cleaner'
11
11
 
12
+ # Run any available migration
13
+ ActiveRecord::Migrator.migrate File.expand_path("../dummy/db/migrate/", __FILE__)
12
14
 
13
15
  # Requires supporting files with custom matchers and macros, etc,
14
16
  # in ./support/ and its subdirectories.
@@ -17,5 +19,18 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
17
19
  RSpec.configure do |config|
18
20
 
19
21
  config.mock_with :rspec
22
+
23
+ config.before(:suite) do
24
+ DatabaseCleaner.strategy = :transaction
25
+ DatabaseCleaner.clean_with(:truncation)
26
+ end
27
+
28
+ config.before(:each) do
29
+ DatabaseCleaner.start
30
+ end
31
+
32
+ config.after(:each) do
33
+ DatabaseCleaner.clean
34
+ end
20
35
 
21
36
  end
@@ -14,22 +14,15 @@ def generate_tiny_text
14
14
  end
15
15
 
16
16
  Article.blueprint do
17
- author = Author.make
18
- author_id { author.id }
19
- publisher_id { author.publisher.id }
20
- site_id { author.site.id }
17
+ author { Author.make }
21
18
  title { generate_tiny_text }
22
19
  genre { generate_tiny_text }
23
20
  content { generate_text }
24
21
  end
25
22
 
26
23
  Author.blueprint do
27
- site = Site.make
28
- site_id { site.id }
29
- publisher_id { site.publisher.id }
24
+ publisher { Publisher.make }
30
25
  name { generate_tiny_text }
31
- genre { generate_tiny_text }
32
- age { generate_age }
33
26
  end
34
27
 
35
28
  Publisher.blueprint do
@@ -37,21 +30,13 @@ Publisher.blueprint do
37
30
  location { generate_tiny_text }
38
31
  end
39
32
 
40
- Following.blueprint do
41
- special_name { generate_tiny_text }
42
- article_id { Article.make }
43
- reader_id { Reader.make }
33
+ ArticleReader.blueprint do
34
+ article { Article.make }
35
+ reader { Reader.make }
44
36
  end
45
37
 
46
38
  Reader.blueprint do
47
- site_id { Site.make }
48
- username { generate_tiny_text }
39
+ name { generate_tiny_text }
49
40
  age { generate_age }
50
41
  end
51
42
 
52
- Site.blueprint do
53
- publisher_id { Publisher.make }
54
- name { generate_tiny_text }
55
- domain { generate_tiny_text }
56
- genre { generate_tiny_text }
57
- end
metadata CHANGED
@@ -2,15 +2,16 @@
2
2
  name: acts_as_word_cloud
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.0.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jeremiah Hemphill
9
+ - Alfredo Uribe
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
13
 
13
- date: 2013-02-19 00:00:00 Z
14
+ date: 2013-02-21 00:00:00 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: rails
@@ -46,24 +47,24 @@ dependencies:
46
47
  prerelease: false
47
48
  version_requirements: *id003
48
49
  - !ruby/object:Gem::Dependency
49
- name: rdoc
50
+ name: rspec-rails
50
51
  requirement: &id004 !ruby/object:Gem::Requirement
51
52
  none: false
52
53
  requirements:
53
- - - ~>
54
+ - - ">="
54
55
  - !ruby/object:Gem::Version
55
- version: "3.12"
56
+ version: "0"
56
57
  type: :development
57
58
  prerelease: false
58
59
  version_requirements: *id004
59
60
  - !ruby/object:Gem::Dependency
60
- name: cucumber
61
+ name: database_cleaner
61
62
  requirement: &id005 !ruby/object:Gem::Requirement
62
63
  none: false
63
64
  requirements:
64
- - - ">="
65
+ - - ~>
65
66
  - !ruby/object:Gem::Version
66
- version: "0"
67
+ version: 0.6.7
67
68
  type: :development
68
69
  prerelease: false
69
70
  version_requirements: *id005
@@ -122,9 +123,6 @@ files:
122
123
  - Rakefile
123
124
  - VERSION
124
125
  - acts_as_word_cloud.gemspec
125
- - features/acts_as_word_cloud.feature
126
- - features/step_definitions/acts_as_word_cloud_steps.rb
127
- - features/support/env.rb
128
126
  - lib/acts_as_word_cloud.rb
129
127
  - lib/acts_as_word_cloud/config.rb
130
128
  - lib/acts_as_word_cloud/engine.rb
@@ -132,7 +130,6 @@ files:
132
130
  - lib/acts_as_word_cloud/word_cloud.rb
133
131
  - lib/generators/acts_as_word_cloud/install_generator.rb
134
132
  - lib/generators/acts_as_word_cloud/templates/config.rb
135
- - lib/model_methods_helper.rb
136
133
  - spec/acts_as_word_cloud_spec.rb
137
134
  - spec/dummy/README.rdoc
138
135
  - spec/dummy/Rakefile
@@ -143,11 +140,10 @@ files:
143
140
  - spec/dummy/app/mailers/.gitkeep
144
141
  - spec/dummy/app/models/.gitkeep
145
142
  - spec/dummy/app/models/article.rb
143
+ - spec/dummy/app/models/article_reader.rb
146
144
  - spec/dummy/app/models/author.rb
147
- - spec/dummy/app/models/following.rb
148
145
  - spec/dummy/app/models/publisher.rb
149
146
  - spec/dummy/app/models/reader.rb
150
- - spec/dummy/app/models/site.rb
151
147
  - spec/dummy/app/views/layouts/application.html.erb
152
148
  - spec/dummy/config.ru
153
149
  - spec/dummy/config/application.rb
@@ -167,16 +163,16 @@ files:
167
163
  - spec/dummy/config/routes.rb
168
164
  - spec/dummy/db/migrate/20121107162154_create_system.rb
169
165
  - spec/dummy/db/schema.rb
170
- - spec/dummy/features/support/blueprints.rb
171
166
  - spec/dummy/lib/assets/.gitkeep
172
- - spec/dummy/lib/model_methods_helper.rb
173
167
  - spec/dummy/log/.gitkeep
174
168
  - spec/dummy/public/404.html
175
169
  - spec/dummy/public/422.html
176
170
  - spec/dummy/public/500.html
177
171
  - spec/dummy/public/favicon.ico
178
172
  - spec/dummy/script/rails
173
+ - spec/integration_spec.rb
179
174
  - spec/spec_helper.rb
175
+ - spec/support/blueprints.rb
180
176
  homepage: http://github.com/jeremiahishere/acts_as_word_cloud
181
177
  licenses:
182
178
  - MIT
@@ -190,7 +186,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
190
186
  requirements:
191
187
  - - ">="
192
188
  - !ruby/object:Gem::Version
193
- hash: 4154919138677042520
189
+ hash: 2660284366431254682
194
190
  segments:
195
191
  - 0
196
192
  version: "0"
@@ -1,9 +0,0 @@
1
- Feature: something something
2
- In order to something something
3
- A user something something
4
- something something something
5
-
6
- Scenario: something something
7
- Given inspiration
8
- When I create a sweet new gem
9
- Then everyone should see how awesome I am
@@ -1,13 +0,0 @@
1
- require 'bundler'
2
- begin
3
- Bundler.setup(:default, :development)
4
- rescue Bundler::BundlerError => e
5
- $stderr.puts e.message
6
- $stderr.puts "Run `bundle install` to install missing gems"
7
- exit e.status_code
8
- end
9
-
10
- $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
11
- require 'acts_as_word_cloud'
12
-
13
- require 'rspec/expectations'
@@ -1,87 +0,0 @@
1
- require 'find'
2
- class ModelMethodsHelper
3
-
4
- # finds or makes a model based on the given attributes
5
- # @param [Constant] model_name The name of the model
6
- # @param [Hash] attributes The attributes to find the model or add to the new one
7
- def self.find_or_make_by_attributes(model_name, attributes)
8
- instances = model_name.where(attributes)
9
- if instances.empty?
10
- return model_name.make(attributes)
11
- else
12
- return instances.first
13
- end
14
- end
15
-
16
- # Uses the descendants_of method to determine the model structure
17
- # Then tableizes and converts to symbol
18
- #
19
- # Load all models must be run for accurate descendants list
20
- # it is now being called every time this method is called
21
- # for now it works because this is only called one time when the authorization config is loaded on initialize
22
- # if this ever changes, this code may need to be update (2-15-2012)
23
- #
24
- # @return [Array] Array with file names underscored and pluralized in the format [:users, :case_placements, :roles, :job_locations, ... ]
25
- def self.get_model_symbol_array
26
- # Old method:
27
- # Major redesign of this method that finds namespaced models
28
- # Finds all files in the given folder, tries to find the ruby files
29
- # Then processes the names to get the names we need for the code
30
- #
31
- # @return [Array] Array with file names underscored and pluralized in the format [:users, :case_placements, :roles, :job_locations, ... ]
32
- #model_array = []
33
- #Find.find("#{Rails.root.to_s}/app/models") do |model_path|
34
- # if model_path.match(/\.rb$/)
35
- # model_path = model_path.gsub("#{Rails.root.to_s}/app/models/", "")
36
- # model_path = model_path.gsub("/","_")
37
- # model_path = model_path.gsub(/\.rb$/, "")
38
- # model_array.push model_path.pluralize.to_sym
39
- # end
40
- #end
41
- #return model_array
42
-
43
- # new method
44
- self.load_all_models
45
- # returns the table name if there is one or tableizes the model name if not
46
- # our permissions system generally uses table names for model permissions
47
- return self.descendants_of(ActiveRecord::Base).map{ |m| m.abstract_class ? m.to_s.tableize.to_sym : m.table_name.to_sym }
48
- end
49
-
50
- # Requires all models so that they are visible in the object space
51
- # This is only necessary when we are not caching classes
52
- def self.load_all_models
53
- if !::Rails.application.config.cache_classes
54
- Dir[Rails.root.join("app/models/**/*.rb")].each {|f| require f}
55
- end
56
- end
57
-
58
- # Return a list of descendants of the given model.
59
- #
60
- # If direct is set to true, only return immediate descendants
61
- # The load_all_models must be called before this is called or the result may not be correct
62
- #
63
- # @param [Constant] parent_class The parent class to look for descendants for
64
- # @param [Boolean] direct Whether to look for all descendants or immediate descendants
65
- # @return [Array] An array of class constants that satisfy the conditions of the parameters
66
- def self.descendants_of(parent_class, direct = false)
67
- classes = []
68
- ObjectSpace.each_object(::Class).each do |klass|
69
- if direct
70
- classes << klass if klass.superclass == parent_class
71
- else
72
- classes << klass if klass < parent_class
73
- end
74
- end
75
- return classes
76
- end
77
-
78
- # Convenience method to return the results of descendants_of with direct set to true
79
- #
80
- # The load_all_models must be called before this is called or the result may not be correct
81
- #
82
- # @param [Constant] parent_class The parent class to look for descendants for
83
- # @return [Array] An array of class constants that satisfy the conditions of the parameters
84
- def self.direct_descendants_of(parent_class)
85
- return self.descendants_of(parent_class, true)
86
- end
87
- end
@@ -1,5 +0,0 @@
1
- class Following < ActiveRecord::Base
2
-
3
- belongs_to :article
4
- belongs_to :reader
5
- end
@@ -1,8 +0,0 @@
1
- class Site < ActiveRecord::Base
2
- acts_as_word_cloud :methods_to_use => [:domain], :excluded_models => [], :skipped_attributes => [], :depth => 2
3
-
4
- has_many :articles
5
- has_many :authors
6
- has_many :readers
7
- belongs_to :publisher
8
- end