redis-messages 0.1
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/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
|