gcm_rails_mongo_mapper 0.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/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'configatron'
4
+ gem 'json'
5
+
6
+ group :development do
7
+ gem 'rdoc', '~> 3.12'
8
+ gem 'bundler', '~> 1.0.0'
9
+ gem 'jeweler', '~> 1.8.4'
10
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,26 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ configatron (2.9.1)
5
+ yamler (>= 0.1.0)
6
+ git (1.2.5)
7
+ jeweler (1.8.4)
8
+ bundler (~> 1.0)
9
+ git (>= 1.2.5)
10
+ rake
11
+ rdoc
12
+ json (1.7.3)
13
+ rake (0.9.2.2)
14
+ rdoc (3.12)
15
+ json (~> 1.4)
16
+ yamler (0.1.0)
17
+
18
+ PLATFORMS
19
+ ruby
20
+
21
+ DEPENDENCIES
22
+ bundler (~> 1.0.0)
23
+ configatron
24
+ jeweler (~> 1.8.4)
25
+ json
26
+ rdoc (~> 3.12)
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Dennis Ondeng
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.
data/README.textile ADDED
@@ -0,0 +1,129 @@
1
+ h1. Gcm on Rails (Google Cloud Messaging for Android on Rails)
2
+
3
+ Gcm on Rails (gcm_on_rails) is a Ruby on Rails gem that allows you to easily incorporate Google's 'Google Cloud Messaging for Android' into your Rails application. This gem was derived from c2dm_on_rails (https://github.com/pimeys/c2dm_on_rails) after Google deprecated C2DM on June 27, 2012
4
+
5
+ h2. Acknowledgements:
6
+
7
+ This gem was derived from Julius de Bruijn's gem c2dm_on_rails which according to him, was originally a rewrite of the gem
8
+ apn_on_rails written by Mark Bates and before him Fabien Penso and Sam Soffes. Thanks to all the above who were involved in
9
+ earlier versions or derivatives of the gem. I originally wanted to use the c2dm_on_rails gem for a project at Kopo Kopo, Inc
10
+ and the rug was pulled from under me when Google deprecated C2DM in favor of GCM (Google Cloud Messaging). I thus decided to
11
+ create an updated gem. This is also my first rubygem so please feel free to fix or add on anything you may see fit.
12
+
13
+ h2. Requirements:
14
+
15
+ You will have to sign up to GCM first via the Google APIs Console page (https://code.google.com/apis/console).
16
+ When you create an new API project, the browser url will change to something like:
17
+ <pre><code>
18
+ https://code.google.com/apis/console/#project:4815162342
19
+ </code></pre>
20
+
21
+ The value after #project (4815162342) in this example is the project ID and will be used later on as the GCM sender
22
+ ID. You will also need to obtain an Api Key and for detailed instructions on how to get one, follow the instructions
23
+ here:-
24
+
25
+ "http://developer.android.com/guide/google/gcm/gs.html":http://developer.android.com/guide/google/gcm/gs.html
26
+
27
+ GCM is designed to work on Android version 2.2 or greater, so only Android 2.2> devices are eligible. The device must
28
+ also have an active Google Account if the Android version is less than version 4.1
29
+
30
+ h2. Installing:
31
+
32
+ Installation is by simply adding the following to your Gemfile:
33
+ <pre><code>
34
+ gem 'gcm_on_rails'
35
+ </code></pre>
36
+
37
+ h2. Setup and Configuration
38
+
39
+ The following needs to be added to your Rakefile so that you can use the the Rake tasks that ship with gcm_on_rails:
40
+ <pre><code>
41
+ begin
42
+ require 'gcm_on_rails_tasks'
43
+ rescue MissingSourceFile => e
44
+ puts e.message
45
+ end
46
+ </code></pre>
47
+
48
+ To create the tables needed for Gcm on Rails, run the following task:
49
+ <pre><code>
50
+ $ rails generate gcm_migrations
51
+ </code></pre>
52
+
53
+ Gcm on Rails like its predecessor uses the Configatron gem, "http://github.com/markbates/configatron/tree/master":http://github.com/markbates/configatron/tree/master,
54
+ Some settings need to be loaded for configuration purposes. An initialzer script that can be put in config/initializers/gcm_on_rails.rb
55
+ will suffice. Below is an example of such a script.
56
+ <pre><code>
57
+ configatron.gcm_on_rails.api_url = 'https://android.googleapis.com/gcm/send'
58
+ configatron.gcm_on_rails.api_key = 'AAAAAAPPPPPPPIIIIIIIKKKKKEEEEYYYYY'
59
+ configatron.gcm_on_rails.app_name = 'com.yourapppackage.com'
60
+ configatron.gcm_on_rails.delivery_format = 'json'
61
+ </code></pre>
62
+
63
+ A couple of notes:
64
+ - The api_key is the api key that you received from Google when signing up for GCM
65
+ - Note that unlike the old C2dm on Rails, GCM on Rails switches to a simple API key for authentication. ClientLogin or OAuth2 tokens will NOT work.
66
+ - The app_name is simply the name of the pacakge of your Android app.
67
+ - GCM on Rails message requests can be either be sent in plain text or JSON format. Specify 'json' for JSON and 'plain_text' for plain text format.
68
+
69
+ That's it, you are now ready to start creating notifications.
70
+
71
+ h2. Upgrade Notes:
72
+
73
+ When upgrading to a new version of Gcm on Rails, you should alwasy run:
74
+ <pre><code>
75
+ $ rails generate gcm_migrations
76
+ </code></pre>
77
+
78
+ That way you are ensured to have the latest version of the database tables needed.
79
+
80
+ h2. Example:
81
+
82
+ Please note that a more detailed introduction to GCM is located at "http://developer.android.com/guide/google/gcm/index.html":http://developer.android.com/guide/google/gcm/index.html
83
+ <pre><code>
84
+ $ rails console
85
+ >> device = Gcm::Device.create(:registration_id => "XXXXXXXXXXXXXXXXXXXXXX")
86
+ >> notification = Gcm::Notification.new
87
+ >> notification.device = device
88
+ >> notification.collapse_key = "updates_available"
89
+ >> notification.delay_while_idle = true
90
+ >> notification.data = {:registration_ids => ["RegistrationID"], :data => {:message_text => "Get on cloud nine"}}
91
+ >> notification.save
92
+ </code></pre>
93
+
94
+ The following Rake task can then be used to deliver notifications:
95
+ <pre><code>
96
+ $ rake gcm:notifications:deliver
97
+ </code></pre>
98
+
99
+ The rake task will look for any unsent notifications in the database. If found, the notifications will then be dispatched
100
+ for delivery. If no unsent notifications exist, the Rake task simply does nothing. As described by Google, possible errors
101
+ from the GCM servers are:
102
+
103
+ |Code 200| |
104
+ | |Error: MissingRegistration. Happens when the request did not actually contain a registration_id parameter when in plain text format or registration_ids when in json format.|
105
+ | |Error: InvalidRegistration. The registration_id passed is not on the GCM servers. The device and all of its notifications will be deleted.|
106
+ | |Error: MismatchedSenderId. The sender Id that was passed is not one that the application specified as an allowed sender.|
107
+ | |Error: NotRegistered. An existing registration Id has ceased to be valid. The device and all of tis notifications will be deleted.|
108
+ | |Error: MessageTooBig. The total payload data that is in the message exceeds 4096 bytes.|
109
+
110
+ |Code 401| |
111
+ | |API Key is Invalid. Check the configuration file|
112
+
113
+ |Code 503| |
114
+ | |Service is unavailable and you should retry later. However, you must honor the 'Retry-After' header if it is included in the response from the GCM server.
115
+ Exponential backoff should be implemented in your retry mechanism.|
116
+
117
+ |Code 500| |
118
+ | |Internal server error. Retry again while still honoring 'Retry-After' header and using exponential backoff.|
119
+
120
+
121
+ h2. To-Do's:
122
+
123
+ - Tests, tests then some more tests. These need to be implemented.
124
+ - Implement "broadcasting" sending and processing responses to multiple registration id's within one request. Currently only one message to a single registration id is implemented.
125
+
126
+
127
+ Released under the MIT license.
128
+ Copyright (c) 2012 Dennis Ondeng. See LICENSE.txt for further details.
129
+
data/Rakefile ADDED
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "gcm_rails_mongo_mapper"
18
+ gem.homepage = "http://github.com/kkelani/gcm_rails_mongo_mapper"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{Google Cloud Messaging for Android on Rails using MongoMapper}
21
+ gem.description = %Q{gcm_rails_mongo_mapper is a Ruby on Rails gem based on dondeng's gcm_on_rails gem (https://github.com/dondeng/gcm_on_rails). Same funcionality except this gem works with MongoMapper. This is my first gem so any feedback is greatly appreciated!}
22
+ gem.email = "kkelani@gmail.com"
23
+ gem.authors = ["Kevin Kelani"]
24
+ gem.version = "0.0.1"
25
+ # dependencies defined in Gemfile
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+
30
+ require 'rdoc/task'
31
+ Rake::RDocTask.new do |rdoc|
32
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
33
+
34
+ rdoc.rdoc_dir = 'rdoc'
35
+ rdoc.title = "gcm_on_rails #{version}"
36
+ rdoc.rdoc_files.include('README*')
37
+ rdoc.rdoc_files.include('lib/**/*.rb')
38
+ end
39
+
40
+
41
+ task :default => :spec
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.2
@@ -0,0 +1,5 @@
1
+ module Gcm
2
+ class Base
3
+ include MongoMapper::Document
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ # Represents an Android phone.
2
+ # An Gcm::Device can have many Gcm::Notification.
3
+ #
4
+ # In order for the Gcm::Feedback system to work properly you *MUST*
5
+ # touch the <tt>last_registered_at</tt> column every time someone opens
6
+ # your application. If you do not, then it is possible, and probably likely,
7
+ # that their device will be removed and will no longer receive notifications.
8
+ #
9
+ # Example:
10
+ # Device.create(:registration_id => 'FOOBAR')
11
+ class Gcm::Device < Gcm::Base
12
+ #self.table_name = "gcm_devices"
13
+ set_collection_name "gcm_devices"
14
+
15
+ # Fields
16
+ key :registration_id, String
17
+ key :last_registered_at, DateTime
18
+ timestamps!
19
+
20
+ #has_many :notifications, :class_name => 'Gcm::Notification', :dependent => :destroy
21
+ many :notifications, :class_name => 'Gcm::Notification', :dependent => :destroy
22
+
23
+ validates_presence_of :registration_id
24
+ validates_uniqueness_of :registration_id
25
+
26
+ before_save :set_last_registered_at
27
+
28
+ # The <tt>feedback_at</tt> accessor is set when the
29
+ # device is marked as potentially disconnected from your
30
+ # application by Google.
31
+ attr_accessor :feedback_at
32
+
33
+ private
34
+ def set_last_registered_at
35
+ self.last_registered_at = Time.now if self.last_registered_at.nil?
36
+ end
37
+ end
@@ -0,0 +1,103 @@
1
+ class Gcm::Notification < Gcm::Base
2
+ #self.table_name = "gcm_notifications"
3
+ set_collection_name "gcm_notifications"
4
+
5
+ key :collapse_key, String
6
+ key :delay_while_idle, Boolean
7
+ key :sent_at, DateTime
8
+ key :time_to_live, Integer
9
+ key :data, Hash
10
+ key :date, String
11
+ key :park_id, String
12
+ key :sport_id, String
13
+ timestamps!
14
+
15
+ include ::ActionView::Helpers::TextHelper
16
+ extend ::ActionView::Helpers::TextHelper
17
+ #serialize :data
18
+
19
+ belongs_to :device, :class_name => 'Gcm::Device'
20
+ validates_presence_of :collapse_key if :time_to_live?
21
+
22
+ class << self
23
+ # Opens a connection to the Google GCM server and attempts to batch deliver
24
+ # an Array of notifications.
25
+ #
26
+ # This method expects an Array of Gcm::Notifications. If no parameter is passed
27
+ # in then it will use the following:
28
+ # Gcm::Notification.all(:conditions => {:sent_at => nil})
29
+ #
30
+ # As each Gcm::Notification is sent the <tt>sent_at</tt> column will be timestamped,
31
+ # so as to not be sent again.
32
+ #
33
+ # This can be run from the following Rake task:
34
+ # $ rake gcm:notifications:deliver
35
+ def send_notifications(notifications = Gcm::Notification.all(:conditions => {:sent_at => nil}, :joins => :device, :readonly => false))
36
+
37
+ if configatron.gcm_on_rails.delivery_format and configatron.gcm_on_rails.delivery_format == 'plain_text'
38
+ format = "plain_text"
39
+ else
40
+ format = "json"
41
+ end
42
+
43
+ unless notifications.nil? || notifications.empty?
44
+ api_key = Gcm::Connection.open
45
+ if api_key
46
+ notifications.each do |notification|
47
+ #puts "sending notification #{notification.id} to device #{notification.device.registration_id}"
48
+ response = Gcm::Connection.send_notification(notification, api_key, format)
49
+ #puts "response: #{response[:code]}; #{response.inspect}"
50
+ if response[:code] == 200
51
+ if format == "json"
52
+ error = ""
53
+ message_data = JSON.parse response[:message]
54
+ success = message_data['success']
55
+ error = message_data['results'][0]['error'] if success == 0
56
+ else #format is plain text
57
+ message_data = response[:message]
58
+ error = response[:message].split('=')[1]
59
+ end
60
+
61
+
62
+ case error
63
+ when "MissingRegistration"
64
+ ex = Gcm::Errors::MissingRegistration.new(response[:message])
65
+ #logger.warn("#{ex.message}, destroying gcm_device with id #{notification.device.id}")
66
+ puts "#{ex.message}, destroying gcm_device with id #{notification.device.id}"
67
+ notification.device.destroy
68
+ when "InvalidRegistration"
69
+ ex = Gcm::Errors::InvalidRegistration.new(response[:message])
70
+ #logger.warn("#{ex.message}, destroying gcm_device with id #{notification.device.id}")
71
+ puts "#{ex.message}, destroying gcm_device with id #{notification.device.id}"
72
+ notification.device.destroy
73
+ when "MismatchedSenderId"
74
+ ex = Gcm::Errors::MismatchSenderId.new(response[:message])
75
+ #logger.warn(ex.message)
76
+ puts ex.message
77
+ when "NotRegistered"
78
+ ex = Gcm::Errors::NotRegistered.new(response[:message])
79
+ #logger.warn("#{ex.message}, destroying gcm_device with id #{notification.device.id}")
80
+ puts "#{ex.message}, destroying gcm_device with id #{notification.device.id}"
81
+ notification.device.destroy
82
+ when "MessageTooBig"
83
+ ex = Gcm::Errors::MessageTooBig.new(response[:message])
84
+ #logger.warn(ex.message)
85
+ puts ex.message
86
+ else
87
+ notification.sent_at = Time.now
88
+ notification.save!
89
+ end
90
+ elsif response[:code] == 401
91
+ raise Gcm::Errors::InvalidAuthToken.new(message_data)
92
+ elsif response[:code] == 503
93
+ raise Gcm::Errors::ServiceUnavailable.new(message_data)
94
+ elsif response[:code] == 500
95
+ raise Gcm::Errors::InternalServerError.new(message_data)
96
+ end
97
+
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,88 @@
1
+ require 'configatron'
2
+ require 'uri'
3
+
4
+ module Gcm
5
+ module Errors
6
+
7
+ # Missing registration_id.
8
+ class MissingRegistration < StandardError
9
+ def initialize(message) # :nodoc:
10
+ super("Missing registration_id: '#{message}'")
11
+ end
12
+ end
13
+
14
+ # Invalid registration_id. Check the formatting of the registration ID that is passed to the server. Make sure
15
+ # it matches the the registration ID the phone receives in the com.google.android.c2dm.intent.REGISTRATION intent
16
+ # and that it is not being truncated or additional characters being appended
17
+ class InvalidRegistration < StandardError
18
+ def initialize(message) # :nodoc:
19
+ super("Invalid registration_id: '#{message}'")
20
+ end
21
+ end
22
+
23
+ # A registration ID is tied to a certain group of senders. When an application registers for GCM usage, it must
24
+ # specify which senders are allowed to send messages.
25
+ class MismatchSenderId < StandardError
26
+ def initialize(message) # :nodoc
27
+ super("Mismatched Sender Id: '#{message}'")
28
+ end
29
+ end
30
+
31
+ # From Google:-
32
+ # An existing registration ID may cease to be valid in a number of scenarios, including:
33
+ # - If the application manually unregisters
34
+ # - If the application is automatically unregistered which can (but not guaranteed) to happen if the user
35
+ # uninstalls the application
36
+ # - If the registration ID expires. Google might decide to refresh registration IDs
37
+ #
38
+ # For all cases above, it is recommended that this registration ID is removed from the 3rd party server
39
+ class NotRegistered < StandardError
40
+ def initialize(message) # :nodoc
41
+ super("The registration_id is no longer valid: '#{message}'")
42
+ end
43
+ end
44
+
45
+ # The payload of the message is too big, the limit is currently 4096
46
+ # bytes. Reduce the size of the message.
47
+ class MessageTooBig < StandardError
48
+ def initialize(message) # :nodoc:
49
+ super("The maximum size allowed for a notification payload is 4096 bytes: '#{message}'")
50
+ end
51
+ end
52
+
53
+ # ClientLogin AUTH_TOKEN is invalid. Check the config
54
+ class InvalidAuthToken < StandardError
55
+ def initialize(message)
56
+ super("Invalid auth token: '#{message}'")
57
+ end
58
+ end
59
+
60
+ # Indicates that server is temporarily unavailable (i.e because of timeouts, etc.)
61
+ # Sender must retry later, honoring any Retry-After header included in the response.
62
+ # Application servers must implement exponential back-off
63
+ class ServiceUnavailable < StandardError
64
+ def initialize(message)
65
+ super("Service is currently unavailable. Try again later: '#{message}'")
66
+ end
67
+ end
68
+
69
+ # Indicates an internal server error with the GCM server
70
+ class InternalServerError < StandardError
71
+ def initialize(message)
72
+ super("The was an internal error in the GCM server while trying to process the request: '#{message}'")
73
+ end
74
+ end
75
+ end
76
+
77
+ Dir.glob(File.join(File.dirname(__FILE__), 'app', 'models', 'gcm', '*.rb')).sort.each do |f|
78
+ require f
79
+ end
80
+
81
+ %w{ models controllers helpers }.each do |dir|
82
+ path = File.join(File.dirname(__FILE__), 'app', dir)
83
+ $LOAD_PATH << path
84
+ # puts "Adding #{path}"
85
+ #ActiveSupport::Dependencies.autoload_paths << path
86
+ #ActiveSupport::Dependencies.autoload_once_paths.delete(path)
87
+ end
88
+ end
@@ -0,0 +1,44 @@
1
+ require 'net/https'
2
+ require 'uri'
3
+
4
+ module Gcm
5
+ module Connection
6
+ class << self
7
+ def send_notification(notification, api_key, format)
8
+
9
+ if format == 'json'
10
+ headers = {"Content-Type" => "application/json",
11
+ "Authorization" => "key=#{api_key}"}
12
+
13
+ data = notification.data.merge({:collapse_key => notification.collapse_key}) unless notification.collapse_key.nil?
14
+ data = data.merge({:delay_while_idle => notification.delay_while_idle}) unless notification.delay_while_idle.nil?
15
+ data = data.merge({:time_to_live => notification.time_to_live}) unless notification.time_to_live.nil?
16
+ data = data.to_json
17
+ else #plain text format
18
+ headers = {"Content-Type" => "application/x-www-form-urlencoded;charset=UTF-8",
19
+ "Authorization" => "key=#{api_key}"}
20
+
21
+ post_data = notification.data[:data].map{|k, v| "&data.#{k}=#{URI.escape(v)}".reduce{|k, v| k + v}}[0]
22
+ extra_data = "registration_id=#{notification.data[:registration_ids][0]}"
23
+ extra_data = "#{extra_data}&collapse_key=#{notification.collapse_key}" unless notification.collapse_key.nil?
24
+ extra_data = "#{extra_data}&delay_while_idle=1" if notification.delay_while_idle
25
+ data = "#{extra_data}#{post_data}"
26
+ end
27
+
28
+ url_string = configatron.gcm_on_rails.api_url
29
+ url = URI.parse url_string
30
+ http = Net::HTTP.new(url.host, url.port)
31
+ http.use_ssl = true
32
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
33
+
34
+ resp, dat = http.post(url.path, data, headers)
35
+
36
+ return {:code => resp.code.to_i, :message => dat }
37
+ end
38
+
39
+ def open
40
+ configatron.gcm_on_rails.api_key
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,9 @@
1
+ namespace :gcm do
2
+ namespace :notifications do
3
+
4
+ desc "Deliver all unsent Gcm notifications."
5
+ task :deliver => [:environment] do
6
+ Gcm::Notification.send_notifications
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ Dir.glob(File.join(File.dirname(__FILE__), 'gcm_on_rails', '**/*.rb')).sort.each do |f|
2
+ require File.expand_path(f)
3
+ end
@@ -0,0 +1,3 @@
1
+ Dir.glob(File.join(File.dirname(__FILE__), 'gcm_on_rails', 'tasks', '**/*.rake')).each do |f|
2
+ load File.expand_path(f)
3
+ end
@@ -0,0 +1,32 @@
1
+ require 'rails/generators/active_record'
2
+ # Generates the migrations necessary for Gcm on Rails.
3
+ # This should be run upon install and upgrade of the
4
+ # Gcm on Rails gem.
5
+ #
6
+ # $ ruby script/generate gcm_migrations
7
+ class GcmMigrationsGenerator < Rails::Generators::Base
8
+ include Rails::Generators::Migration
9
+ extend ActiveRecord::Generators::Migration
10
+
11
+ # Set the current directory as base for the inherited generators.
12
+ def self.base_root
13
+ File.dirname(__FILE__)
14
+ end
15
+
16
+ source_root File.expand_path('../templates/gcm_migrations', __FILE__)
17
+
18
+ def create_migrations
19
+ templates = {
20
+ 'create_gcm_devices.rb' => 'db/migrate/create_gcm_devices.rb',
21
+ 'create_gcm_notifications.rb' => 'db/migrate/create_gcm_notifications.rb'
22
+ }
23
+
24
+ templates.each_pair do |name, path|
25
+ begin
26
+ migration_template(name, path)
27
+ rescue => err
28
+ puts "WARNING: #{err.message}"
29
+ end
30
+ end
31
+ end
32
+ end # GcmMigrationsGenerator
@@ -0,0 +1,16 @@
1
+ class CreateGcmDevices < ActiveRecord::Migration # :nodoc:
2
+ def self.up
3
+ create_table :gcm_devices do |t|
4
+ t.string :registration_id, :size => 120, :null => false
5
+ t.datetime :last_registered_at
6
+
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :gcm_devices, :registration_id, :unique => true
11
+ end
12
+
13
+ def self.down
14
+ drop_table :gcm_devices
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ class CreateGcmNotifications < ActiveRecord::Migration # :nodoc:
2
+
3
+ def self.up
4
+
5
+ create_table :gcm_notifications do |t|
6
+ t.integer :device_id, :null => false
7
+ t.string :collapse_key
8
+ t.text :data
9
+ t.boolean :delay_while_idle
10
+ t.datetime :sent_at
11
+ t.integer :time_to_live
12
+ t.timestamps
13
+ end
14
+
15
+ add_index :gcm_notifications, :device_id
16
+ end
17
+
18
+ def self.down
19
+ drop_table :gcm_notifications
20
+ end
21
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gcm_rails_mongo_mapper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kevin Kelani
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: configatron
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: json
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rdoc
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '3.12'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '3.12'
62
+ - !ruby/object:Gem::Dependency
63
+ name: bundler
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.0.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.0.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: jeweler
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 1.8.4
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 1.8.4
94
+ description: gcm_rails_mongo_mapper is a Ruby on Rails gem based on dondeng's gcm_on_rails
95
+ gem (https://github.com/dondeng/gcm_on_rails). Same funcionality except this gem
96
+ works with MongoMapper. This is my first gem so any feedback is greatly appreciated!
97
+ email: kkelani@gmail.com
98
+ executables: []
99
+ extensions: []
100
+ extra_rdoc_files:
101
+ - LICENSE.txt
102
+ - README.textile
103
+ files:
104
+ - Gemfile
105
+ - Gemfile.lock
106
+ - LICENSE.txt
107
+ - README.textile
108
+ - Rakefile
109
+ - VERSION
110
+ - lib/gcm_rails_mongo_mapper.rb
111
+ - lib/gcm_rails_mongo_mapper/app/models/gcm/base.rb
112
+ - lib/gcm_rails_mongo_mapper/app/models/gcm/device.rb
113
+ - lib/gcm_rails_mongo_mapper/app/models/gcm/notification.rb
114
+ - lib/gcm_rails_mongo_mapper/gcm_rails_mongo_mapper.rb
115
+ - lib/gcm_rails_mongo_mapper/libs/connection.rb
116
+ - lib/gcm_rails_mongo_mapper/tasks/gcm.rake
117
+ - lib/gcm_rails_mongo_mapper_tasks.rb
118
+ - lib/generators/gcm_migrations_generator.rb
119
+ - lib/generators/templates/gcm_migrations/create_gcm_devices.rb
120
+ - lib/generators/templates/gcm_migrations/create_gcm_notifications.rb
121
+ homepage: http://github.com/kkelani/gcm_rails_mongo_mapper
122
+ licenses:
123
+ - MIT
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ none: false
136
+ requirements:
137
+ - - ! '>='
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 1.8.24
143
+ signing_key:
144
+ specification_version: 3
145
+ summary: Google Cloud Messaging for Android on Rails using MongoMapper
146
+ test_files: []