rails-push-notifications 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -5
- data/Rakefile +7 -0
- data/lib/generators/rails-push-notifications/USAGE +2 -2
- data/lib/rails-push-notifications/apps/apns_app.rb +12 -0
- data/lib/rails-push-notifications/apps/base_app.rb +13 -0
- data/lib/rails-push-notifications/apps/gcm_app.rb +10 -0
- data/lib/rails-push-notifications/apps/mpns_app.rb +10 -0
- data/lib/rails-push-notifications/notification.rb +13 -0
- data/lib/rails-push-notifications/rails_push_notifications_railtie.rb +5 -0
- data/lib/rails-push-notifications/version.rb +1 -1
- data/spec/notification_spec.rb +2 -0
- data/spec/rails_apps/rails3_2.rb +47 -0
- data/spec/spec_helper.rb +28 -12
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 221e44ec52855989da2f9a2e67b70ddec144576b
|
4
|
+
data.tar.gz: 2cce49cbd19011f0f703f6a4199ce8f854a5cc08
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e0c997bb94f8e50f79f6fe706793f7ecb5759e116c473c3f695a598a8ec609634441a1281bfed7ea8da911d3edf40ce9b0e3e4eb7b89cb3db51765ef77db0f2
|
7
|
+
data.tar.gz: ca6224bfb6e432604bed94d8fbe70c5bc69f07fa675cb583857e2fb314ac476cb479ce8e364313417786eac7a6e0e3bf0ee52d8aaea31b30c2dbcdd8b15090cd
|
data/README.md
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
# Rpn (Ruby on Rails Push Notifications)
|
2
|
-
[![Build Status](https://travis-ci.org/calonso/rails-push-notifications.svg)](https://travis-ci.org/calonso/rails-push-notifications) [![Code Climate](https://codeclimate.com/github/calonso/rails-push-notifications/badges/gpa.svg)](https://codeclimate.com/github/calonso/rails-push-notifications)[![Test Coverage](https://codeclimate.com/github/calonso/rails-push-notifications/badges/coverage.svg)](https://codeclimate.com/github/calonso/rails-push-notifications/coverage)
|
2
|
+
[![Build Status](https://travis-ci.org/calonso/rails-push-notifications.svg)](https://travis-ci.org/calonso/rails-push-notifications) [![Code Climate](https://codeclimate.com/github/calonso/rails-push-notifications/badges/gpa.svg)](https://codeclimate.com/github/calonso/rails-push-notifications) [![Test Coverage](https://codeclimate.com/github/calonso/rails-push-notifications/badges/coverage.svg)](https://codeclimate.com/github/calonso/rails-push-notifications/coverage)
|
3
3
|
## Professional iOS, Android and Windows Phone push notifications for Ruby on Rails
|
4
4
|
|
5
|
-
|
5
|
+
RailsPushNotifications is an intuitive and easy to use gem that will allow you to easily add Push Notifications to your project.
|
6
6
|
|
7
|
-
|
7
|
+
RailsPushNotifications key features:
|
8
8
|
|
9
9
|
* Multiple Apple/Android/WinPhone applications/configurations
|
10
10
|
* Single and Bulk notifications
|
11
11
|
* Fully customizable notification's contents
|
12
|
+
* Detailed feedback on each individual notification's push results.
|
12
13
|
|
13
14
|
## Live example
|
14
15
|
|
@@ -20,7 +21,7 @@ The source code for that project is here: [https://github.com/calonso/rails_push
|
|
20
21
|
## Installation
|
21
22
|
To install the gem simply add this line to your Gemfile
|
22
23
|
|
23
|
-
gem 'rails-push-notifications', '~> 0.2'
|
24
|
+
gem 'rails-push-notifications', '~> 0.2.0'
|
24
25
|
|
25
26
|
and then install it by running
|
26
27
|
|
@@ -136,7 +137,8 @@ any improvement/bug you may find.
|
|
136
137
|
Please, feel free to contribute in building any of those or adding more stuff to this list!
|
137
138
|
|
138
139
|
* Better generation of the data for each kind of notification. Hiding the particulars
|
139
|
-
to avoid bugs
|
140
|
+
to avoid bugs.
|
141
|
+
* Rake task to push all notifications from all applications.
|
140
142
|
|
141
143
|
## Contributing
|
142
144
|
|
data/Rakefile
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler/setup"
|
1
3
|
require 'bundler'
|
4
|
+
require 'appraisal'
|
2
5
|
|
3
6
|
require 'rspec/core/rake_task'
|
4
7
|
|
@@ -6,3 +9,7 @@ RSpec::Core::RakeTask.new(:spec)
|
|
6
9
|
|
7
10
|
task :default => :spec
|
8
11
|
|
12
|
+
if !ENV["APPRAISAL_INITIALIZED"] && !ENV["TRAVIS"]
|
13
|
+
task :default => :appraisal
|
14
|
+
end
|
15
|
+
|
@@ -1,22 +1,34 @@
|
|
1
1
|
module RailsPushNotifications
|
2
|
+
#
|
3
|
+
# This class represents an Apple iOS application.
|
4
|
+
#
|
5
|
+
# @author Carlos Alonso
|
6
|
+
#
|
2
7
|
class APNSApp < BaseApp
|
3
8
|
self.table_name = 'rails_push_notifications_apns_apps'
|
4
9
|
|
10
|
+
# Requires a development certificate
|
5
11
|
validates :apns_dev_cert, presence: true
|
12
|
+
# Requires a production certificate
|
6
13
|
validates :apns_prod_cert, presence: true
|
7
14
|
|
8
15
|
before_validation { |app| app.sandbox_mode = true if app.sandbox_mode.nil? }
|
9
16
|
|
10
17
|
private
|
11
18
|
|
19
|
+
# @return [String] the certificate(dev or prod) to use
|
12
20
|
def cert
|
13
21
|
sandbox_mode ? apns_dev_cert : apns_prod_cert
|
14
22
|
end
|
15
23
|
|
24
|
+
# @return [RubyPushNotifications::APNS::APNSPusher] configured and
|
25
|
+
# ready to push
|
16
26
|
def build_pusher
|
17
27
|
RubyPushNotifications::APNS::APNSPusher.new cert, sandbox_mode
|
18
28
|
end
|
19
29
|
|
30
|
+
# @return [RubyPushNotifications::APNS::APNSNotification]. The type of
|
31
|
+
# notifications this app manages
|
20
32
|
def notification_type
|
21
33
|
RubyPushNotifications::APNS::APNSNotification
|
22
34
|
end
|
@@ -1,10 +1,20 @@
|
|
1
1
|
module RailsPushNotifications
|
2
|
+
#
|
3
|
+
# Abstract. This class is the base of all application entity type.
|
4
|
+
#
|
5
|
+
# @author Carlos Alonso
|
6
|
+
#
|
2
7
|
class BaseApp < ActiveRecord::Base
|
3
8
|
|
4
9
|
self.abstract_class = true
|
5
10
|
|
11
|
+
# has_many notifications
|
6
12
|
has_many :notifications, as: :app
|
7
13
|
|
14
|
+
#
|
15
|
+
# This method will find all notifications owned by this app and
|
16
|
+
# push them.
|
17
|
+
#
|
8
18
|
def push_notifications
|
9
19
|
pending = find_pending
|
10
20
|
to_send = pending.map do |notification|
|
@@ -19,6 +29,9 @@ module RailsPushNotifications
|
|
19
29
|
|
20
30
|
protected
|
21
31
|
|
32
|
+
#
|
33
|
+
# Method that searches the owned notifications for those not yet sent
|
34
|
+
#
|
22
35
|
def find_pending
|
23
36
|
notifications.where sent: false
|
24
37
|
end
|
@@ -1,15 +1,25 @@
|
|
1
1
|
module RailsPushNotifications
|
2
|
+
#
|
3
|
+
# This class represents an Android GCM application.
|
4
|
+
#
|
5
|
+
# @author Carlos Alonso
|
6
|
+
#
|
2
7
|
class GCMApp < BaseApp
|
3
8
|
self.table_name = 'rails_push_notifications_gcm_apps'
|
4
9
|
|
10
|
+
# Requires a gcm_key
|
5
11
|
validates :gcm_key, presence: true
|
6
12
|
|
7
13
|
private
|
8
14
|
|
15
|
+
# @return [RubyPushNotifications::GCM::GCMPusher] configured and
|
16
|
+
# ready to push
|
9
17
|
def build_pusher
|
10
18
|
RubyPushNotifications::GCM::GCMPusher.new gcm_key
|
11
19
|
end
|
12
20
|
|
21
|
+
# @return [RubyPushNotifications::GCM::GCMNotification]. The type of
|
22
|
+
# notifications this app manages
|
13
23
|
def notification_type
|
14
24
|
RubyPushNotifications::GCM::GCMNotification
|
15
25
|
end
|
@@ -1,15 +1,25 @@
|
|
1
1
|
module RailsPushNotifications
|
2
|
+
#
|
3
|
+
# This class represents an Windows Phone application.
|
4
|
+
#
|
5
|
+
# @author Carlos Alonso
|
6
|
+
#
|
2
7
|
class MPNSApp < BaseApp
|
3
8
|
self.table_name = 'rails_push_notifications_mpns_apps'
|
4
9
|
|
10
|
+
# Requires the certificate
|
5
11
|
validates :cert, presence: true
|
6
12
|
|
7
13
|
private
|
8
14
|
|
15
|
+
# @return [RubyPushNotifications::MPNS::MPNSPusher] configured and
|
16
|
+
# ready to push
|
9
17
|
def build_pusher
|
10
18
|
RubyPushNotifications::MPNS::MPNSPusher.new cert
|
11
19
|
end
|
12
20
|
|
21
|
+
# @return [RubyPushNotifications::MPNS::MPNSNotification]. The type of
|
22
|
+
# notifications this app manages
|
13
23
|
def notification_type
|
14
24
|
RubyPushNotifications::MPNS::MPNSNotification
|
15
25
|
end
|
@@ -1,23 +1,36 @@
|
|
1
1
|
module RailsPushNotifications
|
2
|
+
#
|
3
|
+
# This class represents the Notification Entity.
|
4
|
+
#
|
5
|
+
# @author Carlos Alonso
|
6
|
+
#
|
2
7
|
class Notification < ActiveRecord::Base
|
3
8
|
|
4
9
|
self.table_name = 'rails_push_notifications_notifications'
|
5
10
|
|
11
|
+
# belongs_to an app
|
6
12
|
belongs_to :app, polymorphic: true
|
7
13
|
|
14
|
+
# Requires an app
|
8
15
|
validates :app, presence: true
|
16
|
+
# Requires data
|
9
17
|
validates :data, presence: true
|
18
|
+
# Requires at least one destination
|
10
19
|
validates :destinations, presence: true, length: { minimum: 1 }
|
11
20
|
|
12
21
|
serialize :data, Hash
|
13
22
|
serialize :destinations, Array
|
14
23
|
serialize :results
|
15
24
|
|
25
|
+
# Automatically manages the sent flag, setting it to true as soon as
|
26
|
+
# it is assigned results.
|
16
27
|
before_save do |record|
|
17
28
|
record.sent = !record.results.nil?
|
18
29
|
true
|
19
30
|
end
|
20
31
|
|
32
|
+
# Automatically manages the success and failed fields, setting them to the
|
33
|
+
# value specified by the results assigned.
|
21
34
|
before_save do |record|
|
22
35
|
if record.results_changed? && record.results
|
23
36
|
record.success = record.results.success
|
@@ -1,4 +1,9 @@
|
|
1
1
|
module RailsPushNotifications
|
2
|
+
#
|
3
|
+
# This class exports the migrations generator to Rails
|
4
|
+
#
|
5
|
+
# @author Carlos Alonso
|
6
|
+
#
|
2
7
|
class RailsPushNotificationsRailtie < Rails::Railtie
|
3
8
|
generators do
|
4
9
|
require 'generators/rails-push-notifications/migrations_generator'
|
data/spec/notification_spec.rb
CHANGED
@@ -40,6 +40,7 @@ module RailsPushNotifications
|
|
40
40
|
it 'has to be a Hash' do
|
41
41
|
expect do
|
42
42
|
notification.data = 'dummy text'
|
43
|
+
notification.save
|
43
44
|
end.to raise_error ActiveRecord::SerializationTypeMismatch
|
44
45
|
end
|
45
46
|
end
|
@@ -53,6 +54,7 @@ module RailsPushNotifications
|
|
53
54
|
it 'has to be an array' do
|
54
55
|
expect do
|
55
56
|
notification.destinations = 'dummy destinations'
|
57
|
+
notification.save
|
56
58
|
end.to raise_error ActiveRecord::SerializationTypeMismatch
|
57
59
|
end
|
58
60
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'rails'
|
2
|
+
require 'rails/all'
|
3
|
+
require 'action_view/testing/resolvers'
|
4
|
+
require 'rails/test_help'
|
5
|
+
|
6
|
+
require 'rails-push-notifications'
|
7
|
+
|
8
|
+
class RailsPushNotificationsApp < Rails::Application
|
9
|
+
config.root = File.expand_path("../../..", __FILE__)
|
10
|
+
config.cache_classes = true
|
11
|
+
|
12
|
+
config.eager_load = false
|
13
|
+
config.serve_static_assets = true
|
14
|
+
config.static_cache_control = "public, max-age=3600"
|
15
|
+
|
16
|
+
config.consider_all_requests_local = true
|
17
|
+
config.action_controller.perform_caching = false
|
18
|
+
|
19
|
+
config.action_dispatch.show_exceptions = false
|
20
|
+
|
21
|
+
config.action_controller.allow_forgery_protection = false
|
22
|
+
|
23
|
+
config.active_support.deprecation = :stderr
|
24
|
+
|
25
|
+
config.middleware.delete "Rack::Lock"
|
26
|
+
config.middleware.delete "ActionDispatch::Flash"
|
27
|
+
config.middleware.delete "ActionDispatch::BestStandardsSupport"
|
28
|
+
config.secret_token = "49837489qkuweoiuoqwehisuakshdjksadhaisdy78o34y138974xyqp9rmye8yrpiokeuioqwzyoiuxftoyqiuxrhm3iou1hrzmjk"
|
29
|
+
routes.append do
|
30
|
+
get "/" => "welcome#index"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class ApplicationController < ActionController::Base
|
35
|
+
include Rails.application.routes.url_helpers
|
36
|
+
layout 'application'
|
37
|
+
self.view_paths = [ActionView::FixtureResolver.new(
|
38
|
+
"layouts/application.html.erb" => '<%= yield %>',
|
39
|
+
"welcome/index.html.erb"=> 'Hello from index.html.erb',
|
40
|
+
)]
|
41
|
+
|
42
|
+
def index
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
RailsPushNotificationsApp.initialize!
|
data/spec/spec_helper.rb
CHANGED
@@ -4,24 +4,34 @@ CodeClimate::TestReporter.start
|
|
4
4
|
|
5
5
|
Bundler.setup
|
6
6
|
|
7
|
+
require 'rails'
|
8
|
+
|
7
9
|
ENV['RAILS_ENV'] = 'test'
|
8
|
-
ENV['DATABASE_URL'] = 'sqlite3::memory:'
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
case "#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}"
|
12
|
+
when '3.2'
|
13
|
+
ENV['DATABASE_URL'] = 'sqlite3://localhost/:memory:'
|
14
|
+
require 'rails_apps/rails3_2'
|
15
|
+
require 'active_record/migration'
|
16
|
+
when '4.0'
|
17
|
+
ENV['DATABASE_URL'] = 'sqlite3://localhost/:memory:'
|
18
|
+
require 'rails_apps/rails4'
|
19
|
+
when '4.1', '4.2'
|
20
|
+
ENV['DATABASE_URL'] = 'sqlite3::memory:'
|
21
|
+
require 'rails_apps/rails4'
|
22
|
+
else
|
23
|
+
raise NotImplementedError.new "Rails Friendly URLs gem doesn't support Rails #{Rails.version}"
|
24
|
+
end
|
25
|
+
|
26
|
+
Bundler.require :default
|
27
|
+
Bundler.require :development
|
28
|
+
|
13
29
|
require 'webmock/rspec'
|
30
|
+
require 'rspec/rails'
|
14
31
|
require 'ruby-push-notifications'
|
15
32
|
|
16
33
|
Dir["./spec/support/**/*.rb"].sort.each { |f| require f }
|
17
34
|
|
18
|
-
require 'rails-push-notifications'
|
19
|
-
|
20
|
-
ActiveRecord::Base.establish_connection(
|
21
|
-
:adapter => 'sqlite3',
|
22
|
-
:database => ':memory:'
|
23
|
-
)
|
24
|
-
|
25
35
|
files = Dir.glob(File.join(File.dirname(__FILE__), '..', 'lib', 'generators', 'rails-push-notifications', 'templates', 'migrations', '*.rb'))
|
26
36
|
|
27
37
|
migrations = []
|
@@ -35,7 +45,13 @@ end
|
|
35
45
|
|
36
46
|
migrations.sort_by(&:version)
|
37
47
|
|
38
|
-
ActiveRecord::Migrator.new(:up, migrations)
|
48
|
+
migrator = ActiveRecord::Migrator.new(:up, migrations)
|
49
|
+
|
50
|
+
if Rails::VERSION::MAJOR == 3
|
51
|
+
migrator.instance_variable_set(:@migrations, migrations)
|
52
|
+
end
|
53
|
+
|
54
|
+
migrator.migrate
|
39
55
|
|
40
56
|
RSpec.configure do |config|
|
41
57
|
config.use_transactional_fixtures = true
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-push-notifications
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carlos Alonso
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '3.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '3.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: ruby-push-notifications
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.3'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
40
|
+
version: '0.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sqlite3
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -153,6 +153,7 @@ files:
|
|
153
153
|
- spec/generators/migrations_generator_spec.rb
|
154
154
|
- spec/log/test.log
|
155
155
|
- spec/notification_spec.rb
|
156
|
+
- spec/rails_apps/rails3_2.rb
|
156
157
|
- spec/rails_apps/rails4.rb
|
157
158
|
- spec/spec_helper.rb
|
158
159
|
- spec/support/factory_girl.rb
|
@@ -190,6 +191,7 @@ test_files:
|
|
190
191
|
- spec/generators/migrations_generator_spec.rb
|
191
192
|
- spec/log/test.log
|
192
193
|
- spec/notification_spec.rb
|
194
|
+
- spec/rails_apps/rails3_2.rb
|
193
195
|
- spec/rails_apps/rails4.rb
|
194
196
|
- spec/spec_helper.rb
|
195
197
|
- spec/support/factory_girl.rb
|