redis-messages 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +2 -0
- data/Gemfile +2 -0
- data/LICENSE +23 -0
- data/README.rdoc +21 -0
- data/Rakefile +10 -0
- data/features/redis_messages_named.feature +35 -0
- data/features/redis_messages_standard.feature +48 -0
- data/features/redis_messages_user_injection.feature +36 -0
- data/features/step_definitions/common_steps.rb +47 -0
- data/features/step_definitions/rails_setup_steps.rb +6 -0
- data/features/support/env.rb +6 -0
- data/features/support/matchers.rb +7 -0
- data/lib/generators/redis_messages/USAGE +50 -0
- data/lib/generators/redis_messages/redis_messages_generator.rb +91 -0
- data/lib/generators/redis_messages/templates/message.rb +23 -0
- data/lib/generators/redis_messages/templates/message_migration.rb +15 -0
- data/lib/generators/redis_messages/templates/redis.rb +1 -0
- data/lib/generators/redis_messages/templates/tests/rspec/sessions_controller.rb +39 -0
- data/lib/generators/redis_messages/templates/tests/rspec/user.rb +83 -0
- data/lib/generators/redis_messages/templates/tests/rspec/users_controller.rb +56 -0
- data/lib/generators/redis_messages/templates/user.rb +12 -0
- data/lib/generators/redis_messages/templates/user_injection_code.rb +10 -0
- data/lib/generators/redis_messages/templates/user_migration.rb +15 -0
- data/test/test_helper.rb +119 -0
- data/test/test_nifty_authentication_generator.rb +274 -0
- data/test/test_nifty_config_generator.rb +37 -0
- data/test/test_nifty_layout_generator.rb +42 -0
- metadata +180 -0
data/CHANGELOG
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Copyright (c) 2010 Seivan Heidari
|
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.
|
21
|
+
By reading this fine print your soul is now the exclusive property of WeDoBDD Productions and its Subsidiaries.
|
22
|
+
Unauthorized use of seivan gems, images, materials, souls, odors and oxygen is strongly discouraged. We know where you sleep.
|
23
|
+
Also, your mum & bring back prop8
|
data/README.rdoc
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
== Install
|
2
|
+
|
3
|
+
gem install redis-messages
|
4
|
+
|
5
|
+
== Rails 3
|
6
|
+
|
7
|
+
To use redis-messages with Rails 3 you will need to include it in your Gemfile.
|
8
|
+
|
9
|
+
group :development do
|
10
|
+
gem "redis-messages"
|
11
|
+
end
|
12
|
+
|
13
|
+
== Usage
|
14
|
+
== Included Generators
|
15
|
+
* rails g redis_messages : Will name keys and models as User and Message and the Redis constant to R
|
16
|
+
|
17
|
+
* rails g redis_messages letter user : Assuming the User model already exist, this will inject code into it and create a Letter model.
|
18
|
+
|
19
|
+
* rails g redis_messages letter player Red : Creates a Letter and Player model and names the Redis constant to Red
|
20
|
+
|
21
|
+
* And don't forget to run your migrations since we also utilize SQL here.
|
data/Rakefile
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
Feature: Redis Messages Generator With Named Models
|
2
|
+
In order to send letters to multiple users
|
3
|
+
As a rails developer
|
4
|
+
I want to generate a messaging library using letters as a name
|
5
|
+
|
6
|
+
|
7
|
+
Scenario: Generate named messages
|
8
|
+
Given a new Rails app
|
9
|
+
When I run "rails g redis_messages letters players Red"
|
10
|
+
Then I should see the following files
|
11
|
+
| app/models/letter.rb |
|
12
|
+
# | app/helpers/messages_helper.rb |
|
13
|
+
| db/migrate |
|
14
|
+
And I should see "class Letter < ActiveRecord::Base" in file "app/models/letter.rb"
|
15
|
+
And I should see "belongs_to :player" in file "app/models/letter.rb"
|
16
|
+
|
17
|
+
And I should see "Red.smembers(Letter.receivers_for(self.id))" in file "app/models/letter.rb"
|
18
|
+
And I should see "Red.sadd(Letter.inbox_for(username), self.id)" in file "app/models/letter.rb"
|
19
|
+
And I should see "Red.sadd(Letter.receivers_for(self.id), username)" in file "app/models/letter.rb"
|
20
|
+
|
21
|
+
And I should see "def self.inbox_for(username)" in file "app/models/letter.rb"
|
22
|
+
And I should see "("letter:#{username}:inbox")" in file "app/models/letter.rb"
|
23
|
+
|
24
|
+
And I should see "def self.receivers_for(letter_id)" in file "app/models/letter.rb"
|
25
|
+
And I should see "("letter:#{letter_id}:receivers")" in file "app/models/letter.rb"
|
26
|
+
|
27
|
+
And I should see the following files
|
28
|
+
|app/models/player.rb|
|
29
|
+
And I should see "class Player < ActiveRecord::Base" in file "app/models/player.rb"
|
30
|
+
And I should see "has_many :letters" in file "app/models/player.rb"
|
31
|
+
And I should see "letter_ids = Red.smembers(Letter.inbox_for(self.username))" in file "app/models/player.rb"
|
32
|
+
And I should see "Letter.where(:visible => true, :id => letter_ids).order("created_at DESC")" in file "app/models/player.rb"
|
33
|
+
|
34
|
+
And I should see "self.letters(:visible => true)" in file "app/models/player.rb"
|
35
|
+
And I should not see file "temp_file.rb"
|
@@ -0,0 +1,48 @@
|
|
1
|
+
Feature: Redis Messages Generator
|
2
|
+
In order to send messages to multiple users
|
3
|
+
As a rails developer
|
4
|
+
I want to generate a messaging library
|
5
|
+
|
6
|
+
Scenario: Generate default messages
|
7
|
+
Given a new Rails app
|
8
|
+
When I run "rails g redis_messages"
|
9
|
+
Then I should see the following files
|
10
|
+
| app/models/message.rb |
|
11
|
+
# | app/helpers/messages_helper.rb |
|
12
|
+
| db/migrate |
|
13
|
+
And I should see "class Message < ActiveRecord::Base" in file "app/models/message.rb"
|
14
|
+
And I should see "belongs_to :user" in file "app/models/message.rb"
|
15
|
+
|
16
|
+
And I should see "def recievers" in file "app/models/message.rb"
|
17
|
+
And I should see "R.smembers(Message.receivers_for(self.id))" in file "app/models/message.rb"
|
18
|
+
And I should see "end" in file "app/models/message.rb"
|
19
|
+
And I should see "def send_to(receivers_usernames)" in file "app/models/message.rb"
|
20
|
+
And I should see "receivers_usernames.each do |username|" in file "app/models/message.rb"
|
21
|
+
And I should see "R.sadd(Message.inbox_for(username), self.id)" in file "app/models/message.rb"
|
22
|
+
And I should see "R.sadd(Message.receivers_for(self.id), username)" in file "app/models/message.rb"
|
23
|
+
And I should see "end" in file "app/models/message.rb"
|
24
|
+
And I should see "end" in file "app/models/message.rb"
|
25
|
+
|
26
|
+
And I should see "def self.inbox_for(username)" in file "app/models/message.rb"
|
27
|
+
And I should see "("message:#{username}:inbox")" in file "app/models/message.rb"
|
28
|
+
And I should see "end" in file "app/models/message.rb"
|
29
|
+
|
30
|
+
And I should see "def self.receivers_for(message_id)" in file "app/models/message.rb"
|
31
|
+
And I should see "("message:#{message_id}:receivers")" in file "app/models/message.rb"
|
32
|
+
And I should see "end" in file "app/models/message.rb"
|
33
|
+
And I should see "end" in file "app/models/message.rb"
|
34
|
+
|
35
|
+
And I should see the following files
|
36
|
+
|app/models/user.rb|
|
37
|
+
And I should see "class User < ActiveRecord::Base" in file "app/models/user.rb"
|
38
|
+
And I should see "has_many :messages" in file "app/models/user.rb"
|
39
|
+
And I should see "def inbox" in file "app/models/user.rb"
|
40
|
+
And I should see "message_ids = R.smembers(Message.inbox_for(self.username))" in file "app/models/user.rb"
|
41
|
+
And I should see "Message.where(:visible => true, :id => message_ids).order("created_at DESC")" in file "app/models/user.rb"
|
42
|
+
And I should see "end" in file "app/models/user.rb"
|
43
|
+
And I should see "def outbox" in file "app/models/user.rb"
|
44
|
+
And I should see "self.messages(:visible => true)" in file "app/models/user.rb"
|
45
|
+
And I should see "end" in file "app/models/user.rb"
|
46
|
+
And I should see "end" in file "app/models/user.rb"
|
47
|
+
And I should not see file "temp_file.rb"
|
48
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
Feature: Redis Messages Generator With Existing User Model
|
2
|
+
In order to send letters to multiple users
|
3
|
+
As a rails developer
|
4
|
+
I want to inject the messaging code into the existing User model
|
5
|
+
|
6
|
+
|
7
|
+
Scenario: Generate injected code into existing User Model
|
8
|
+
Given a new Rails app
|
9
|
+
When I run "rails g model user players username:string"
|
10
|
+
When I run "rails g redis_messages letters players Red"
|
11
|
+
Then I should see the following files
|
12
|
+
| app/models/letter.rb |
|
13
|
+
# | app/helpers/messages_helper.rb |
|
14
|
+
| db/migrate |
|
15
|
+
And I should see "class Letter < ActiveRecord::Base" in file "app/models/letter.rb"
|
16
|
+
And I should see "belongs_to :player" in file "app/models/letter.rb"
|
17
|
+
|
18
|
+
And I should see "Red.smembers(Letter.receivers_for(self.id))" in file "app/models/letter.rb"
|
19
|
+
And I should see "Red.sadd(Letter.inbox_for(username), self.id)" in file "app/models/letter.rb"
|
20
|
+
And I should see "Red.sadd(Letter.receivers_for(self.id), username)" in file "app/models/letter.rb"
|
21
|
+
|
22
|
+
And I should see "def self.inbox_for(username)" in file "app/models/letter.rb"
|
23
|
+
And I should see "("letter:#{username}:inbox")" in file "app/models/letter.rb"
|
24
|
+
|
25
|
+
And I should see "def self.receivers_for(letter_id)" in file "app/models/letter.rb"
|
26
|
+
And I should see "("letter:#{letter_id}:receivers")" in file "app/models/letter.rb"
|
27
|
+
|
28
|
+
And I should see the following files
|
29
|
+
|app/models/player.rb|
|
30
|
+
And I should see "class Player < ActiveRecord::Base" in file "app/models/player.rb"
|
31
|
+
And I should see "has_many :letters" in file "app/models/player.rb"
|
32
|
+
And I should see "letter_ids = Red.smembers(Letter.inbox_for(self.username))" in file "app/models/player.rb"
|
33
|
+
And I should see "Letter.where(:visible => true, :id => letter_ids).order("created_at DESC")" in file "app/models/player.rb"
|
34
|
+
|
35
|
+
And I should see "self.letters(:visible => true)" in file "app/models/player.rb"
|
36
|
+
And I should not see file "temp_file.rb"
|
@@ -0,0 +1,47 @@
|
|
1
|
+
When /^I run "([^\"]*)"$/ do |command|
|
2
|
+
system("cd #{@current_directory} && #{command}").should be_true
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I add "([^\"]*)" to file "([^\"]*)"$/ do |content, short_path|
|
6
|
+
path = File.join(@current_directory, short_path)
|
7
|
+
File.should exist(path)
|
8
|
+
File.open(path, 'a') { |f| f.write(content + "\n") }
|
9
|
+
end
|
10
|
+
|
11
|
+
When /^I replace "([^\"]*)" with "([^\"]*)" in file "([^\"]*)"$/ do |old_content, new_content, short_path|
|
12
|
+
path = File.join(@current_directory, short_path)
|
13
|
+
File.should exist(path)
|
14
|
+
content = File.read(path).gsub(old_content, new_content)
|
15
|
+
File.open(path, 'w') { |f| f.write(content) }
|
16
|
+
end
|
17
|
+
|
18
|
+
Then /^I should see file "([^\"]*)"$/ do |path|
|
19
|
+
File.should exist(File.join(@current_directory, path))
|
20
|
+
end
|
21
|
+
|
22
|
+
Then /^I should not see file "([^\"]*)"$/ do |path|
|
23
|
+
File.should_not exist(File.join(@current_directory, path))
|
24
|
+
end
|
25
|
+
Then /^I should see "(.*)" in file "([^\"]*)"$/ do |content, short_path|
|
26
|
+
path = File.join(@current_directory, short_path)
|
27
|
+
File.should exist(path)
|
28
|
+
File.readlines(path).join.should include(content)
|
29
|
+
end
|
30
|
+
|
31
|
+
Then /^I should see the following files$/ do |table|
|
32
|
+
table.raw.flatten.each do |path|
|
33
|
+
File.should exist(File.join(@current_directory, path))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Then /^I should see the following in file "([^\"]*)"$/ do |short_path, table|
|
38
|
+
path = File.join(@current_directory, short_path)
|
39
|
+
File.should exist(path)
|
40
|
+
table.raw.flatten.each do |content|
|
41
|
+
File.readlines(path).join.should include(content)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
Then /^I should successfully run "([^\"]*)"$/ do |command|
|
46
|
+
system("cd #{@current_directory} && #{command}").should be_true
|
47
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
Description:
|
2
|
+
Generates a user model, users controller, and sessions controller. The
|
3
|
+
users controller handles the registration and the sessions controller
|
4
|
+
handles authentication. This is similar to restful_authentication, but
|
5
|
+
simpler.
|
6
|
+
|
7
|
+
IMPORTANT: This generator uses the "title" helper method which is generated
|
8
|
+
by the nifty_layout generator. You may want to run that generator first.
|
9
|
+
|
10
|
+
Usage:
|
11
|
+
If you do not pass any arguments, the model name will default to "user", and
|
12
|
+
the authentication controller will default to "session". You can override
|
13
|
+
each of these respectively by passing one or two arguments. Either name can
|
14
|
+
be CamelCased or under_scored.
|
15
|
+
|
16
|
+
Make sure to setup the authlogic gem if you are using that option.
|
17
|
+
|
18
|
+
gem "authlogic" # in Gemfile
|
19
|
+
|
20
|
+
Examples:
|
21
|
+
rails generate nifty:authentication
|
22
|
+
|
23
|
+
Creates user model, users_controller, and sessions_controller.
|
24
|
+
|
25
|
+
rails generate nifty:authentication account
|
26
|
+
|
27
|
+
Creates account model, accounts_controller, and sessions_controller.
|
28
|
+
|
29
|
+
rails generate nifty:authentication Account UserSession
|
30
|
+
|
31
|
+
Creates account model, accounts_controller, and user_sessions_controller.
|
32
|
+
|
33
|
+
Methods:
|
34
|
+
There are several methods generated which you can use in your application.
|
35
|
+
Here's a common example of what you might add to your layout.
|
36
|
+
|
37
|
+
<% if logged_in? %>
|
38
|
+
Welcome <%= current_user.username %>! Not you?
|
39
|
+
<%= link_to "Log out", logout_path %>
|
40
|
+
<% else %>
|
41
|
+
<%= link_to "Sign up", signup_path %> or
|
42
|
+
<%= link_to "log in", login_path %>.
|
43
|
+
<% end %>
|
44
|
+
|
45
|
+
You can also restrict unregistered users from accessing a controller using
|
46
|
+
a before filter. For example.
|
47
|
+
|
48
|
+
before_filter :login_required, :except => [:index, :show]
|
49
|
+
|
50
|
+
See the generated file lib/authentication.rb for details.
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'rails/generators/base'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
class RedisMessagesGenerator < Rails::Generators::Base #:nodoc:
|
5
|
+
include Rails::Generators::Migration
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
7
|
+
|
8
|
+
argument :message_name, :type => :string, :default => 'message', :banner => 'message_name'
|
9
|
+
argument :user_name, :type => :string, :default => 'user', :banner => 'user_name'
|
10
|
+
argument :redis_constant_name, :type => :string, :default => "R", :banner => "redis_constant_name"
|
11
|
+
|
12
|
+
|
13
|
+
def create_model_files
|
14
|
+
if File.exist?(File.join(Dir.pwd, "app", "models", "#{user_singular_name}.rb"))
|
15
|
+
template('user_injection_code.rb', "temp_file.rb") #I need to READ this with the erb in it
|
16
|
+
code = IO.read(File.join(Dir.pwd,"temp_file.rb"))
|
17
|
+
inject_into_class(File.join(Dir.pwd, "app", "models", "#{user_singular_name}.rb"), user_class_name, code)
|
18
|
+
File.delete(File.join(Dir.pwd,"temp_file.rb"))
|
19
|
+
else
|
20
|
+
template 'user.rb', "app/models/#{user_singular_name}.rb"
|
21
|
+
end
|
22
|
+
template 'message.rb', "app/models/#{message_singular_name}.rb"
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_migration
|
26
|
+
migration_template 'message_migration.rb', "db/migrate/create_#{message_plural_name}.rb"
|
27
|
+
migration_template 'user_migration.rb', "db/migrate/create_#{user_plural_name}.rb" if File.exist?(File.join(Dir.pwd, "app", "models", "#{user_singular_name}.rb"))
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_gems_and_initializer
|
31
|
+
unless File.read(destination_path("Gemfile")).include? "redis"
|
32
|
+
gem "redis"
|
33
|
+
template"redis.rb", "config/initializers/redis.rb"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def message_singular_name
|
39
|
+
message_name.underscore.singularize
|
40
|
+
end
|
41
|
+
|
42
|
+
def message_plural_name
|
43
|
+
message_singular_name.pluralize
|
44
|
+
end
|
45
|
+
|
46
|
+
def message_class_name
|
47
|
+
message_name.singularize.camelize
|
48
|
+
end
|
49
|
+
|
50
|
+
def message_plural_class_name
|
51
|
+
message_plural_name.camelize
|
52
|
+
end
|
53
|
+
|
54
|
+
def user_singular_name
|
55
|
+
user_name.underscore.singularize
|
56
|
+
end
|
57
|
+
|
58
|
+
def user_plural_name
|
59
|
+
user_singular_name.pluralize
|
60
|
+
end
|
61
|
+
|
62
|
+
def user_class_name
|
63
|
+
user_name.singularize.camelize
|
64
|
+
end
|
65
|
+
|
66
|
+
def user_plural_class_name
|
67
|
+
user_plural_name.camelize
|
68
|
+
end
|
69
|
+
|
70
|
+
def destination_path(path)
|
71
|
+
File.join(destination_root, path)
|
72
|
+
end
|
73
|
+
|
74
|
+
# FIXME: Should be proxied to ActiveRecord::Generators::Base
|
75
|
+
# Implement the required interface for Rails::Generators::Migration.
|
76
|
+
|
77
|
+
def self.next_migration_number(dirname) #:nodoc:
|
78
|
+
if ActiveRecord::Base.timestamped_migrations
|
79
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
80
|
+
else
|
81
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
#
|
87
|
+
# def self.banner
|
88
|
+
# "#{$0} seivan:#{generator_name} #{self.arguments.map{ |a| a.usage }.join(' ')} [options]"
|
89
|
+
# end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class <%= message_class_name %> < ActiveRecord::Base
|
2
|
+
belongs_to :<%= user_singular_name %>
|
3
|
+
|
4
|
+
def recievers
|
5
|
+
<%= redis_constant_name %>.smembers(<%= message_class_name %>.receivers_for(self.id))
|
6
|
+
end
|
7
|
+
|
8
|
+
#You want to do this in a background job, may I recommend resque.
|
9
|
+
def send_to(receivers_usernames)
|
10
|
+
receivers_usernames.each do |username|
|
11
|
+
<%= redis_constant_name %>.sadd(<%= message_class_name %>.inbox_for(username), self.id)
|
12
|
+
<%= redis_constant_name %>.sadd(<%= message_class_name %>.receivers_for(self.id), username)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.inbox_for(username)
|
17
|
+
("<%= message_singular_name %>:#{username}:inbox")
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.receivers_for(<%= message_singular_name %>_id)
|
21
|
+
("<%= message_singular_name %>:#{<%= message_singular_name %>_id}:receivers")
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Create<%= message_plural_class_name %> < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :<%= message_plural_name %> do |t|
|
4
|
+
t.string :title
|
5
|
+
t.string :content
|
6
|
+
t.boolean :visible
|
7
|
+
t.integer :<%= user_singular_name %>_id
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.down
|
13
|
+
drop_table :<%= message_plural_name %>
|
14
|
+
end
|
15
|
+
end
|