my_feeds 0.0.1 → 0.1.0

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.
data/Gemfile CHANGED
@@ -1,4 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gem 'rspec'
4
+ gem 'sqlite3'
5
+
3
6
  # Specify your gem's dependencies in my_feeds.gemspec
4
7
  gemspec
data/README.md CHANGED
@@ -1,11 +1,9 @@
1
1
  # MyFeeds
2
2
 
3
- -------------------------------------
4
3
  Help you implement feeds / timeline in rails application.
5
4
 
6
5
  ## Installation
7
6
 
8
- ------------------------------------
9
7
  Add this line to your application's Gemfile:
10
8
 
11
9
  gem 'my_feeds'
@@ -20,12 +18,9 @@ Or install it yourself as:
20
18
 
21
19
  ## Usage
22
20
 
23
- ------------------------------------
24
21
 
25
22
  ####before usage
26
- my_feeds need three type model at least
27
-
28
- `feeder`, `eater` and associate model
23
+ my_feeds need `feeder`, `eater` and associate model
29
24
 
30
25
  feeder publish feeds
31
26
 
@@ -50,12 +45,17 @@ just make sure your model have a polymorphic field for feeder.
50
45
 
51
46
  and
52
47
  ```
53
- class YourModel < ActiveRecord::Base
48
+ class YourCustomModel < ActiveRecord::Base
54
49
  include MyFeeds::Identify #make sure include this module
55
- self.feed_polymorphic_name = :xxx #and set this, in this case is xxx, same with polymorphic belongs_to
50
+ self.feed_polymorphic = :likeable #and set this, in this case is likeable, it should same as the polymorphic belongs_to
56
51
 
57
- belongs_to :xxx, polymorphic: true
52
+ #same as self.feed_polymorphic
53
+ belongs_to :likeable, polymorphic: true
58
54
  end
55
+
56
+ # you should create a migration like below
57
+ # in this case, this column name is likeable_identify, it depends on feed_polymorphic
58
+ #add_column :your_customs, :likeable_identify, :string, null: false
59
59
  ```
60
60
 
61
61
  ####feeder
@@ -165,7 +165,6 @@ end
165
165
 
166
166
  ## Contributing
167
167
 
168
- -------------------
169
168
 
170
169
  1. Fork it
171
170
  2. Create your feature branch (`git checkout -b my-new-feature`)
@@ -4,32 +4,39 @@ module MyFeeds
4
4
 
5
5
  included do
6
6
  before_save :save_feed_identify
7
- class_attribute :feed_polymorphic_name
8
- self.feed_polymorphic_name = self == Feed ? :source : default_feed_polymorphic_name
9
- delegate :default_feed_polymorphic_name, :polymorphic_identify_column, :polymorphic_id_column, :polymorphic_type_column, to: :"self.class"
7
+ self.feed_polymorphic = self == Feed ? :source : default_feed_polymorphic
8
+ delegate :default_feed_polymorphic, :polymorphic_identify_column, :polymorphic_id_column, :polymorphic_type_column, to: :"self.class"
10
9
  end
11
10
 
12
- protected
13
- def save_feed_identify
14
- instance_eval %Q{self.#{polymorphic_identify_column} = "#\{#{polymorphic_id_column}.to_s\}@#\{#{polymorphic_type_column}.to_s.underscore\}"}
15
- end
16
-
17
- private
18
11
  module ClassMethods
19
- def default_feed_polymorphic_name
12
+ def feed_polymorphic
13
+ @_feed_polymorphic
14
+ end
15
+
16
+ def feed_polymorphic= polymorphic
17
+ @_feed_polymorphic = polymorphic
18
+ class_eval %Q{
19
+ def save_feed_identify
20
+ self.#{polymorphic_identify_column} = "#\{#{polymorphic_id_column}.to_s\}@#\{#{polymorphic_type_column}.to_s.underscore\}"
21
+ end
22
+ protected :save_feed_identify
23
+ }
24
+ end
25
+
26
+ def default_feed_polymorphic
20
27
  self.to_s.underscore
21
28
  end
22
29
 
23
30
  def polymorphic_identify_column
24
- :"#{feed_polymorphic_name}_identify"
31
+ :"#{feed_polymorphic}_identify"
25
32
  end
26
33
 
27
34
  def polymorphic_id_column
28
- :"#{feed_polymorphic_name}_id"
35
+ :"#{feed_polymorphic}_id"
29
36
  end
30
37
 
31
38
  def polymorphic_type_column
32
- :"#{feed_polymorphic_name}_type"
39
+ :"#{feed_polymorphic}_type"
33
40
  end
34
41
  end
35
42
  end
@@ -1,3 +1,3 @@
1
1
  module MyFeeds
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -1,6 +1,6 @@
1
1
  class Like < ActiveRecord::Base
2
2
  include MyFeeds::Identify
3
- self.feed_polymorphic_name = :likeable
3
+ self.feed_polymorphic = :likeable
4
4
  #attr_accessible
5
5
 
6
6
  belongs_to :likeable, polymorphic: true
@@ -0,0 +1,10 @@
1
+ class Feed < ActiveRecord::Base
2
+ include MyFeeds::Identify
3
+ attr_accessible :source_id, :source_type, :event, :target_id, :target_type
4
+
5
+ #verify event uniqueness
6
+ #validates :event, uniqueness: {scope: [:source_id, :source_type, :target_id, :target_type]}, :if => :target_id
7
+
8
+ belongs_to :source, polymorphic: true
9
+ belongs_to :target, polymorphic: true
10
+ end
@@ -0,0 +1,7 @@
1
+ class Like < ActiveRecord::Base
2
+ include MyFeeds::Identify
3
+ self.feed_polymorphic = :likeable
4
+ #attr_accessible
5
+
6
+ belongs_to :likeable, polymorphic: true
7
+ end
@@ -0,0 +1,12 @@
1
+ class Post < ActiveRecord::Base
2
+ belongs_to :user
3
+ attr_accessible :content, :title
4
+
5
+ include MyFeeds::Feeder
6
+
7
+ define_feed_event :content_update
8
+
9
+ before_update do
10
+ content_update
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ class User < ActiveRecord::Base
2
+ attr_accessible :name
3
+ has_many :posts
4
+ has_many :likes
5
+
6
+ include MyFeeds::Feeder
7
+ include MyFeeds::Eater
8
+
9
+ define_feed_event :write_post, target_type: Post.to_s
10
+ define_feed_event :write_some_code
11
+
12
+ def post title, content
13
+ post = self.posts.create title: title, content: content
14
+ write_post target_id: post.id
15
+ end
16
+
17
+ def feeds
18
+ feeds_for likes
19
+ end
20
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe MyFeeds do
4
+ before :all do
5
+ @user1 = User.create name: 'jjyr'
6
+ @user2 = User.create name: 'writer'
7
+ end
8
+
9
+ describe MyFeeds::Feeder do
10
+ before :all do
11
+ @user2.write_some_code
12
+ @user2.post "i write a gem", "content is not important"
13
+ end
14
+
15
+ it "when call feed_event should create feed" do
16
+ @user2.source_feeds.count.should == 2
17
+ @user2.source_feeds.count.should == Feed.count
18
+ @user2.source_feeds.first.event.should == 'write_some_code'
19
+ @user2.source_feeds.last.event.should == 'write_post'
20
+ end
21
+
22
+ it "scope version source_feeds should work" do
23
+ @user2.write_some_code_feeds.count.should == 1
24
+ @user2.write_some_code_feeds.first.event.should == 'write_some_code'
25
+ @user2.write_post_feeds.count.should == 1
26
+ @user2.write_post_feeds.first.event.should == 'write_post'
27
+ (@user2.write_post_feeds.count + @user2.write_some_code_feeds.count).should == @user2.source_feeds.count
28
+ end
29
+ end
30
+
31
+
32
+ describe MyFeeds::Eater do
33
+ before :all do
34
+ @user1.feeds.count.should == 0
35
+ like = @user1.likes.new
36
+ like.likeable = @user2
37
+ like.save!
38
+ end
39
+
40
+ it "should have some feeds" do
41
+ @user1.feeds.count.should == Feed.count
42
+ end
43
+
44
+ it "feeds should change" do
45
+ @user2.posts.first.update_attributes content: "update"
46
+ @user1.feeds.count.should == Feed.count - 1
47
+ like = @user1.likes.new
48
+ like.likeable = @user2.posts.first
49
+ like.save!
50
+ @user1.feeds.count.should == Feed.count
51
+ end
52
+
53
+ it "scope should work" do
54
+ @user1.feeds_for(@user1.likes.where likeable_type: Post.to_s).count.should == @user1.feeds.where(source_type: Post.to_s).count
55
+ @user1.feeds_for(@user1.likes.where likeable_type: User.to_s).count.should == @user1.feeds.where(source_type: User.to_s).count
56
+ end
57
+
58
+ it "eater's feeds should match feeder's write_post_feeds" do
59
+ post_feeds = @user2.write_post_feeds.to_a
60
+ user_post_feeds = @user1.feeds.where(target_type: Post.to_s).to_a
61
+ post_feeds.count.should == user_post_feeds.count
62
+ user_post_feeds.each do |post|
63
+ post_feeds.should include(post)
64
+ end
65
+ end
66
+
67
+ it "eater's feeds should match feeder's write_some_code_feeds" do
68
+ code_feeds = @user2.write_some_code_feeds.to_a
69
+ user_feeds = @user1.feeds.where(event: 'write_some_code').to_a
70
+ code_feeds.count.should == user_feeds.count
71
+ user_feeds.each do |feed|
72
+ code_feeds.should include(feed)
73
+ end
74
+ end
75
+ end
76
+ end
data/spec/schema.rb ADDED
@@ -0,0 +1,41 @@
1
+ ActiveRecord::Schema.define(:version => 0) do
2
+
3
+ create_table "feeds", :force => true do |t|
4
+ t.integer "source_id", :null => false
5
+ t.string "source_type", :null => false
6
+ t.string "source_identify", :null => false
7
+ t.string "event", :null => false
8
+ t.integer "target_id"
9
+ t.string "target_type"
10
+ t.datetime "created_at", :null => false
11
+ t.datetime "updated_at", :null => false
12
+ end
13
+
14
+ add_index "feeds", ["source_identify"], :name => "index_feeds_on_source_identify"
15
+
16
+ create_table "likes", :force => true do |t|
17
+ t.string "likeable_identify", :null => false
18
+ t.integer "likeable_id", :null => false
19
+ t.string "likeable_type", :null => false
20
+ t.integer "user_id"
21
+ t.datetime "created_at", :null => false
22
+ t.datetime "updated_at", :null => false
23
+ end
24
+
25
+ create_table "posts", :force => true do |t|
26
+ t.string "title"
27
+ t.string "content"
28
+ t.integer "user_id"
29
+ t.datetime "created_at", :null => false
30
+ t.datetime "updated_at", :null => false
31
+ end
32
+
33
+ add_index "posts", ["user_id"], :name => "index_posts_on_user_id"
34
+
35
+ create_table "users", :force => true do |t|
36
+ t.string "name"
37
+ t.datetime "created_at", :null => false
38
+ t.datetime "updated_at", :null => false
39
+ end
40
+
41
+ end
@@ -0,0 +1,14 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+
4
+ require 'active_record'
5
+ require 'my_feeds'
6
+
7
+ require 'models/feed'
8
+ require 'models/like'
9
+ require 'models/post'
10
+ require 'models/user'
11
+
12
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
13
+ ActiveRecord::Migration.verbose = false
14
+ load(File.dirname(__FILE__) + '/schema.rb')
metadata CHANGED
@@ -1,48 +1,48 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: my_feeds
3
3
  version: !ruby/object:Gem::Version
4
+ version: 0.1.0
4
5
  prerelease:
5
- version: 0.0.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - jjy
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-11 00:00:00.000000000 Z
12
+ date: 2013-05-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
+ name: bundler
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  none: false
17
18
  requirements:
18
19
  - - ~>
19
20
  - !ruby/object:Gem::Version
20
21
  version: '1.3'
22
+ type: :development
23
+ prerelease: false
21
24
  version_requirements: !ruby/object:Gem::Requirement
22
25
  none: false
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
26
29
  version: '1.3'
27
- prerelease: false
28
- type: :development
29
- name: bundler
30
30
  - !ruby/object:Gem::Dependency
31
+ name: rake
31
32
  requirement: !ruby/object:Gem::Requirement
32
33
  none: false
33
34
  requirements:
34
35
  - - ! '>='
35
36
  - !ruby/object:Gem::Version
36
37
  version: '0'
38
+ type: :development
39
+ prerelease: false
37
40
  version_requirements: !ruby/object:Gem::Requirement
38
41
  none: false
39
42
  requirements:
40
43
  - - ! '>='
41
44
  - !ruby/object:Gem::Version
42
45
  version: '0'
43
- prerelease: false
44
- type: :development
45
- name: rake
46
46
  description: Help you implement feeds / timeline in rails application.
47
47
  email:
48
48
  - jjyruby@gmail.com
@@ -67,6 +67,13 @@ files:
67
67
  - lib/rails/generators/templates/migration.rb
68
68
  - lib/rails/generators/templates/model.rb
69
69
  - my_feeds.gemspec
70
+ - spec/models/feed.rb
71
+ - spec/models/like.rb
72
+ - spec/models/post.rb
73
+ - spec/models/user.rb
74
+ - spec/my_feeds_spec.rb
75
+ - spec/schema.rb
76
+ - spec/spec_helper.rb
70
77
  homepage: https://github.com/jjyr/my_feeds
71
78
  licenses:
72
79
  - MIT
@@ -92,4 +99,11 @@ rubygems_version: 1.8.25
92
99
  signing_key:
93
100
  specification_version: 3
94
101
  summary: my_feeds provide feed model and some helper methods, allow you to customize.
95
- test_files: []
102
+ test_files:
103
+ - spec/models/feed.rb
104
+ - spec/models/like.rb
105
+ - spec/models/post.rb
106
+ - spec/models/user.rb
107
+ - spec/my_feeds_spec.rb
108
+ - spec/schema.rb
109
+ - spec/spec_helper.rb