rack-push-notification 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.
Files changed (35) hide show
  1. data/Gemfile.lock +40 -1
  2. data/README.md +22 -5
  3. data/lib/rack/push-notification.rb +30 -108
  4. data/lib/rack/push-notification/admin.rb +129 -0
  5. data/lib/rack/push-notification/assets/images/wallpaper-clown-fish.jpg +0 -0
  6. data/lib/rack/push-notification/assets/javascripts/application.coffee +28 -0
  7. data/lib/rack/push-notification/assets/javascripts/collections/devices.coffee +28 -0
  8. data/lib/rack/push-notification/assets/javascripts/models/device.coffee +2 -0
  9. data/lib/rack/push-notification/assets/javascripts/routers/root.coffee +30 -0
  10. data/lib/rack/push-notification/assets/javascripts/rpn.coffee +14 -0
  11. data/lib/rack/push-notification/assets/javascripts/templates/_devices.jst.eco +23 -0
  12. data/lib/rack/push-notification/assets/javascripts/templates/_preview.jst.eco +24 -0
  13. data/lib/rack/push-notification/assets/javascripts/templates/compose.jst.eco +46 -0
  14. data/lib/rack/push-notification/assets/javascripts/templates/devices.jst.eco +12 -0
  15. data/lib/rack/push-notification/assets/javascripts/templates/pagination.jst.eco +12 -0
  16. data/lib/rack/push-notification/assets/javascripts/vendor/backbone.js +1431 -0
  17. data/lib/rack/push-notification/assets/javascripts/vendor/backbone.paginator.js +833 -0
  18. data/lib/rack/push-notification/assets/javascripts/vendor/codemirror.javascript.js +411 -0
  19. data/lib/rack/push-notification/assets/javascripts/vendor/codemirror.js +3047 -0
  20. data/lib/rack/push-notification/assets/javascripts/vendor/date.js +104 -0
  21. data/lib/rack/push-notification/assets/javascripts/vendor/jquery.js +9404 -0
  22. data/lib/rack/push-notification/assets/javascripts/vendor/underscore.js +1059 -0
  23. data/lib/rack/push-notification/assets/javascripts/views/compose.coffee +119 -0
  24. data/lib/rack/push-notification/assets/javascripts/views/devices.coffee +23 -0
  25. data/lib/rack/push-notification/assets/javascripts/views/pagination.coffee +29 -0
  26. data/lib/rack/push-notification/assets/stylesheets/_codemirror.sass +219 -0
  27. data/lib/rack/push-notification/assets/stylesheets/_preview.sass +148 -0
  28. data/lib/rack/push-notification/assets/stylesheets/screen.sass +110 -0
  29. data/lib/rack/push-notification/assets/views/index.haml +26 -0
  30. data/lib/rack/push-notification/device.rb +33 -0
  31. data/lib/rack/push-notification/migrations/001_base_schema.rb +26 -0
  32. data/lib/rack/push-notification/migrations/002_add_full_text_search.rb +23 -0
  33. data/rack-push-notification.gemspec +9 -1
  34. metadata +164 -8
  35. data/lib/rack/push-notification/version.rb +0 -5
@@ -0,0 +1,110 @@
1
+ @import "compass"
2
+
3
+ $btnPrimaryBackground: #f00
4
+ @import "bootstrap"
5
+
6
+
7
+ @mixin helvetica-font-stack
8
+ font-family: "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif
9
+
10
+ @mixin meslo-font-stack
11
+ font-family: "Meslo", Menlo, Monaco, monospace
12
+
13
+ @import "./codemirror"
14
+ @import "./preview"
15
+
16
+ html body
17
+ font-family: "Helvetica Neue", "Helvetica", sans-serif
18
+ -webkit-text-stroke: 1px transparent
19
+ -webkit-background-clip: padding-box
20
+
21
+ & > header
22
+ @extend .navbar
23
+ @extend .navbar-static-top
24
+
25
+ nav
26
+ @extend .navbar-inner
27
+
28
+ ul
29
+ @extend .nav
30
+
31
+ [role="main"]
32
+ & > header
33
+ @extend .page-header
34
+
35
+ h1
36
+
37
+ aside
38
+ float: right
39
+
40
+ section
41
+ @extend .row
42
+
43
+ & > .alert
44
+ width: 95%
45
+ margin-top: 1em
46
+
47
+ .alert
48
+ clear: both
49
+
50
+ form#compose
51
+ +clearfix
52
+
53
+ fieldset
54
+ @extend .span7
55
+ float: left
56
+
57
+ ol
58
+ list-style: none
59
+ padding: 0
60
+ margin: 0
61
+
62
+ li
63
+ @extend .control-group
64
+
65
+ input[type="radio"], label
66
+ display: inline-block
67
+
68
+ input[type="radio"]
69
+ margin-right: 0.5em
70
+ margin-top: -5px
71
+
72
+ label
73
+ @extend .control-label
74
+
75
+ textarea
76
+ display: block
77
+ margin-left: 1.5em
78
+ width: 530px
79
+ font-size: 0.9em
80
+
81
+ hr
82
+ clear: both
83
+ width: 100%
84
+ margin-top: 5em
85
+
86
+ button
87
+ @extend .btn
88
+ @extend .btn-large
89
+ float: right
90
+
91
+ table
92
+ @extend .table
93
+ @extend .table-bordered
94
+ @extend .table-hover
95
+
96
+ caption
97
+ span
98
+ float: left
99
+ display: block
100
+ position: relative
101
+ top: -20px
102
+
103
+ form.filter
104
+ @extend .form-search
105
+ float: right
106
+ margin-bottom: 0
107
+
108
+ input[type="text"]
109
+ @extend .input-medium
110
+ @extend .search-query
@@ -0,0 +1,26 @@
1
+ !!! 5
2
+ %html{lang: "en"}
3
+ %head
4
+ %meta{charset: "utf-8"}
5
+ %meta{:'http-equiv' => "X-UA-Compatible", content: "IE=edge,chrome=1"}
6
+ %title Rack::PushNotification Admin Console
7
+ %link{rel: "shortcut icon", href: "/favicon.ico", type: "image/x-icon"}
8
+ %link{rel: "license", href: "http://opensource.org/licenses/MIT", :title => "MIT License"}
9
+ %link{rel: "description", href: "Push Notifications"}
10
+ %link{rel: "stylesheet", href: "/stylesheets/screen.css", type: 'text/css', media: "screen", charset: "utf-8"}
11
+
12
+ %body
13
+ %header
14
+ %nav
15
+ .container
16
+ %a.brand{href: "/"} Rack::PushNotification
17
+
18
+ %ul
19
+ %li.devices
20
+ %a{href: "/"} Devices
21
+ %li.compose
22
+ %a{href: "/compose"} Compose
23
+
24
+ .container{role: "main"}
25
+
26
+ %script{type: "text/javascript", src: "/javascripts/application.js" }
@@ -0,0 +1,33 @@
1
+ Sequel.connect(ENV['DATABASE_URL'] || "postgres://localhost:5432/rack_push_notification")
2
+
3
+ module Rack
4
+ class PushNotification::Device < Sequel::Model
5
+ self.dataset = :devices
6
+
7
+ Sequel::Migrator.run(self.db, ::File.join(::File.dirname(__FILE__), "migrations"))
8
+
9
+ self.strict_param_setting = false
10
+ self.raise_on_save_failure = false
11
+
12
+ plugin :json_serializer, naked: true, except: :id
13
+ plugin :validation_helpers
14
+ plugin :timestamps, force: true
15
+ plugin :schema
16
+
17
+ def before_validation
18
+ normalize_token!
19
+ end
20
+
21
+ def validate
22
+ validates_presence :token
23
+ validates_unique :token
24
+ validates_format /[[:xdigit:]]{40}/, :token
25
+ end
26
+
27
+ private
28
+
29
+ def normalize_token!
30
+ self.token = self.token.strip.gsub(/[<\s>]/, '')
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ Sequel.migration do
2
+ up do
3
+ create_table :devices do
4
+ primary_key :id
5
+
6
+ column :token, :varchar, empty: false, unique: true
7
+ column :alias, :varchar
8
+ column :badge, :int4, null: false, default: 0
9
+ column :locale, :varchar
10
+ column :language, :varchar
11
+ column :timezone, :varchar, empty: false, default: 'UTC'
12
+ column :ip_address, :inet
13
+ column :lat, :float8
14
+ column :lng, :float8
15
+ column :tags, :'text[]'
16
+
17
+ index :token
18
+ index :alias
19
+ index [:lat, :lng]
20
+ end
21
+ end
22
+
23
+ down do
24
+ drop_table :devices
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ Sequel.migration do
2
+ up do
3
+ add_column :devices, :tsv, 'TSVector'
4
+
5
+ run %{
6
+ CREATE INDEX tsv_GIN ON devices \
7
+ USING GIN(tsv);
8
+ }
9
+
10
+ run %{
11
+ CREATE TRIGGER TS_tsv \
12
+ BEFORE INSERT OR UPDATE ON devices \
13
+ FOR EACH ROW EXECUTE PROCEDURE \
14
+ tsvector_update_trigger(tsv, 'pg_catalog.english', token, alias, locale, timezone);
15
+ }
16
+ end
17
+
18
+ down do
19
+ drop_column :devices, :tsv
20
+ drop_index :devices, :tsv_GIN
21
+ drop_trigger :devices, :TS_tsv
22
+ end
23
+ end
@@ -16,9 +16,17 @@ Gem::Specification.new do |s|
16
16
 
17
17
  s.add_dependency "rack", "~> 1.4"
18
18
  s.add_dependency "rack-contrib", "~> 1.1.0"
19
+ s.add_dependency "sequel", "~> 3.37.0"
19
20
  s.add_dependency "sinatra", "~> 1.3.2"
20
21
  s.add_dependency "sinatra-param", "~> 0.1.1"
21
- s.add_dependency "sequel", "~> 3.37.0"
22
+ s.add_dependency "coffee-script", "~> 2.2.0"
23
+ s.add_dependency "eco", "~> 1.0.0"
24
+ s.add_dependency "haml", "~> 3.1.7"
25
+ s.add_dependency "sass", "~> 3.2.3"
26
+ s.add_dependency "bootstrap-sass", "~> 2.1.1"
27
+ s.add_dependency "sprockets", "~> 2.8.1"
28
+ s.add_dependency "sprockets-sass", "~> 0.9.1"
29
+ s.add_dependency "houston", "~> 0.1.1"
22
30
 
23
31
  s.files = Dir["./**/*"].reject { |file| file =~ /\.\/(bin|example|log|pkg|script|spec|test|vendor)/ }
24
32
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-push-notification
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-28 00:00:00.000000000 Z
12
+ date: 2012-12-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -75,6 +75,22 @@ dependencies:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
77
  version: 1.1.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: sequel
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 3.37.0
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 3.37.0
78
94
  - !ruby/object:Gem::Dependency
79
95
  name: sinatra
80
96
  requirement: !ruby/object:Gem::Requirement
@@ -108,13 +124,13 @@ dependencies:
108
124
  - !ruby/object:Gem::Version
109
125
  version: 0.1.1
110
126
  - !ruby/object:Gem::Dependency
111
- name: sequel
127
+ name: coffee-script
112
128
  requirement: !ruby/object:Gem::Requirement
113
129
  none: false
114
130
  requirements:
115
131
  - - ~>
116
132
  - !ruby/object:Gem::Version
117
- version: 3.37.0
133
+ version: 2.2.0
118
134
  type: :runtime
119
135
  prerelease: false
120
136
  version_requirements: !ruby/object:Gem::Requirement
@@ -122,7 +138,119 @@ dependencies:
122
138
  requirements:
123
139
  - - ~>
124
140
  - !ruby/object:Gem::Version
125
- version: 3.37.0
141
+ version: 2.2.0
142
+ - !ruby/object:Gem::Dependency
143
+ name: eco
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ~>
148
+ - !ruby/object:Gem::Version
149
+ version: 1.0.0
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: 1.0.0
158
+ - !ruby/object:Gem::Dependency
159
+ name: haml
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ~>
164
+ - !ruby/object:Gem::Version
165
+ version: 3.1.7
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: 3.1.7
174
+ - !ruby/object:Gem::Dependency
175
+ name: sass
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ~>
180
+ - !ruby/object:Gem::Version
181
+ version: 3.2.3
182
+ type: :runtime
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ~>
188
+ - !ruby/object:Gem::Version
189
+ version: 3.2.3
190
+ - !ruby/object:Gem::Dependency
191
+ name: bootstrap-sass
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ~>
196
+ - !ruby/object:Gem::Version
197
+ version: 2.1.1
198
+ type: :runtime
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ~>
204
+ - !ruby/object:Gem::Version
205
+ version: 2.1.1
206
+ - !ruby/object:Gem::Dependency
207
+ name: sprockets
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ~>
212
+ - !ruby/object:Gem::Version
213
+ version: 2.8.1
214
+ type: :runtime
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ~>
220
+ - !ruby/object:Gem::Version
221
+ version: 2.8.1
222
+ - !ruby/object:Gem::Dependency
223
+ name: sprockets-sass
224
+ requirement: !ruby/object:Gem::Requirement
225
+ none: false
226
+ requirements:
227
+ - - ~>
228
+ - !ruby/object:Gem::Version
229
+ version: 0.9.1
230
+ type: :runtime
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - ~>
236
+ - !ruby/object:Gem::Version
237
+ version: 0.9.1
238
+ - !ruby/object:Gem::Dependency
239
+ name: houston
240
+ requirement: !ruby/object:Gem::Requirement
241
+ none: false
242
+ requirements:
243
+ - - ~>
244
+ - !ruby/object:Gem::Version
245
+ version: 0.1.1
246
+ type: :runtime
247
+ prerelease: false
248
+ version_requirements: !ruby/object:Gem::Requirement
249
+ none: false
250
+ requirements:
251
+ - - ~>
252
+ - !ruby/object:Gem::Version
253
+ version: 0.1.1
126
254
  description: Generate a REST API for registering and querying push notification device
127
255
  tokens.
128
256
  email: m@mattt.me
@@ -132,7 +260,35 @@ extra_rdoc_files: []
132
260
  files:
133
261
  - ./Gemfile
134
262
  - ./Gemfile.lock
135
- - ./lib/rack/push-notification/version.rb
263
+ - ./lib/rack/push-notification/admin.rb
264
+ - ./lib/rack/push-notification/assets/images/wallpaper-clown-fish.jpg
265
+ - ./lib/rack/push-notification/assets/javascripts/application.coffee
266
+ - ./lib/rack/push-notification/assets/javascripts/collections/devices.coffee
267
+ - ./lib/rack/push-notification/assets/javascripts/models/device.coffee
268
+ - ./lib/rack/push-notification/assets/javascripts/routers/root.coffee
269
+ - ./lib/rack/push-notification/assets/javascripts/rpn.coffee
270
+ - ./lib/rack/push-notification/assets/javascripts/templates/_devices.jst.eco
271
+ - ./lib/rack/push-notification/assets/javascripts/templates/_preview.jst.eco
272
+ - ./lib/rack/push-notification/assets/javascripts/templates/compose.jst.eco
273
+ - ./lib/rack/push-notification/assets/javascripts/templates/devices.jst.eco
274
+ - ./lib/rack/push-notification/assets/javascripts/templates/pagination.jst.eco
275
+ - ./lib/rack/push-notification/assets/javascripts/vendor/backbone.js
276
+ - ./lib/rack/push-notification/assets/javascripts/vendor/backbone.paginator.js
277
+ - ./lib/rack/push-notification/assets/javascripts/vendor/codemirror.javascript.js
278
+ - ./lib/rack/push-notification/assets/javascripts/vendor/codemirror.js
279
+ - ./lib/rack/push-notification/assets/javascripts/vendor/date.js
280
+ - ./lib/rack/push-notification/assets/javascripts/vendor/jquery.js
281
+ - ./lib/rack/push-notification/assets/javascripts/vendor/underscore.js
282
+ - ./lib/rack/push-notification/assets/javascripts/views/compose.coffee
283
+ - ./lib/rack/push-notification/assets/javascripts/views/devices.coffee
284
+ - ./lib/rack/push-notification/assets/javascripts/views/pagination.coffee
285
+ - ./lib/rack/push-notification/assets/stylesheets/_codemirror.sass
286
+ - ./lib/rack/push-notification/assets/stylesheets/_preview.sass
287
+ - ./lib/rack/push-notification/assets/stylesheets/screen.sass
288
+ - ./lib/rack/push-notification/assets/views/index.haml
289
+ - ./lib/rack/push-notification/device.rb
290
+ - ./lib/rack/push-notification/migrations/001_base_schema.rb
291
+ - ./lib/rack/push-notification/migrations/002_add_full_text_search.rb
136
292
  - ./lib/rack/push-notification.rb
137
293
  - ./LICENSE
138
294
  - ./rack-push-notification.gemspec
@@ -152,7 +308,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
308
  version: '0'
153
309
  segments:
154
310
  - 0
155
- hash: 1277678436408848925
311
+ hash: -2802516591035753533
156
312
  required_rubygems_version: !ruby/object:Gem::Requirement
157
313
  none: false
158
314
  requirements:
@@ -161,7 +317,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
317
  version: '0'
162
318
  segments:
163
319
  - 0
164
- hash: 1277678436408848925
320
+ hash: -2802516591035753533
165
321
  requirements: []
166
322
  rubyforge_project:
167
323
  rubygems_version: 1.8.24