PushIt 1.0.2 → 1.0.4
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.
- checksums.yaml +15 -7
- data/bin/pushit +267 -266
- metadata +48 -41
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
|
-
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MzZhM2YzOTNhODBmYTAxMmQ0YTIwMThhODljM2Q4ZDM1ZGU2MWZiOA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MGJjMTZjNDEzYjRlMjIzODJhYWY0MWNkMTcyMjAwYzY4MTI3NTRkNQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZDUwMDAzNWUyNWI1YzcxMjE4ZjViYjFlMDE0OGZmOGZiNmE4ODIyYTNhZWU1
|
10
|
+
MzdiZjQ0N2JiNzhkNmEyYzI5MGNhOWM4ZTRkYjAwMjNlNzkyN2I3Y2FhN2Jh
|
11
|
+
OTQ2MjYzOWUxNTQwOTljODdjYzdlZmVhNDAwNmNiNmYyNTJhYzQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OWM0MjFmYzM2YjYzNTRiMjAyMmYxOWM5MmVjMDZlYjkwZDM3NjJkOTUzM2U4
|
14
|
+
NDk1N2NiMjJiNjFjYzI0YzJiOTZiYzAzYWVmYmE5NmE3ZjViMTUxNWQxOWM5
|
15
|
+
M2QzOWUwNDE5OGQ0OTU0ZWVkOWFhYWJlZDg2MDVmZWFmNTFhNzI=
|
data/bin/pushit
CHANGED
@@ -1,266 +1,267 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'colored'
|
5
|
-
require 'commander/import'
|
6
|
-
require 'houston'
|
7
|
-
require 'yaml'
|
8
|
-
# require File.expand_path('../devices.rb', __FILE__)
|
9
|
-
|
10
|
-
#
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
program :
|
16
|
-
program :
|
17
|
-
|
18
|
-
|
19
|
-
program :
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
#
|
31
|
-
#
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
c.
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
c.option '-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
if
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
print "
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
end
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
c.
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
c.option '-
|
125
|
-
c.option '-
|
126
|
-
c.option '-
|
127
|
-
c.option '-
|
128
|
-
|
129
|
-
|
130
|
-
c.option '-
|
131
|
-
|
132
|
-
|
133
|
-
c.option '-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
chosenDevices.
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
@
|
171
|
-
@
|
172
|
-
@
|
173
|
-
@
|
174
|
-
|
175
|
-
|
176
|
-
debug_log "
|
177
|
-
debug_log "
|
178
|
-
debug_log "
|
179
|
-
debug_log "
|
180
|
-
debug_log "
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
notification
|
226
|
-
notification
|
227
|
-
notification.
|
228
|
-
notification.
|
229
|
-
notification.
|
230
|
-
notification.
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
custom_payload.merge!({:
|
237
|
-
custom_payload.merge!({
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
end
|
265
|
-
|
266
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'colored'
|
5
|
+
require 'commander/import'
|
6
|
+
require 'houston'
|
7
|
+
require 'yaml'
|
8
|
+
# require File.expand_path('../devices.rb', __FILE__)
|
9
|
+
|
10
|
+
# TODO: Add an option for Cucumber tests to use so that they can determine the final contents of the payload.
|
11
|
+
# Possible future feature: Enable storing of device information within the gem, importing and exporting the .yaml file.
|
12
|
+
|
13
|
+
HighLine.track_eof = false # Fix for built-in Ruby
|
14
|
+
|
15
|
+
program :name, 'PushIt'
|
16
|
+
program :version, '1.0'
|
17
|
+
program :description, 'Sends push notifications to iOS apps. Ensure that your certificate path is relative to your current directory.'
|
18
|
+
|
19
|
+
program :help, 'Author', 'Oletha Lai'
|
20
|
+
program :help_formatter, :compact
|
21
|
+
|
22
|
+
default_command :help
|
23
|
+
|
24
|
+
begin
|
25
|
+
@devices = YAML::load_file "devices.yaml"
|
26
|
+
rescue
|
27
|
+
say_error 'No devices.yaml file was found.'.red
|
28
|
+
end
|
29
|
+
|
30
|
+
# Convenience method for debug logging.
|
31
|
+
# Takes a String as the log parameter.
|
32
|
+
# Prints the log in blue.
|
33
|
+
def debug_log (log)
|
34
|
+
puts log.blue if $DEBUG_MODE
|
35
|
+
end
|
36
|
+
|
37
|
+
command :devices do |c|
|
38
|
+
|
39
|
+
c.syntax = 'pushit devices [options]'
|
40
|
+
c.description = 'Prints out the list of available devices to push to.'
|
41
|
+
|
42
|
+
c.example 'Print the list.', 'pushit devices -f mini'
|
43
|
+
|
44
|
+
c.option '-f', '--filter STRING', 'Filters printed results by device type.'
|
45
|
+
c.option '-d', '--debug', 'Enables debug mode.'
|
46
|
+
|
47
|
+
c.action do |args, options|
|
48
|
+
$DEBUG_MODE = options.debug.nil? ? false : true
|
49
|
+
|
50
|
+
# Check that there is at least 1 device available
|
51
|
+
say_error "There are no available devices.".red and abort if @devices.empty?
|
52
|
+
|
53
|
+
# Filter the list if filtering has been requested.
|
54
|
+
if options.filter
|
55
|
+
@filter = options.filter.downcase
|
56
|
+
debug_log "filter: #{@filter}"
|
57
|
+
@filtered_devices = Hash.new
|
58
|
+
debug_log "Created filtered devices hash."
|
59
|
+
@devices.each do |device, info|
|
60
|
+
debug_log "Checking for '#{@filter}' on #{device}."
|
61
|
+
if info[:model].downcase.match(/#{filter}/)
|
62
|
+
debug_log "Matched. Adding #{device} to filtered devices hash."
|
63
|
+
@filtered_devices[device] = info
|
64
|
+
end
|
65
|
+
end
|
66
|
+
debug_log "Filtering finished."
|
67
|
+
|
68
|
+
# Check that there was at least 1 result from the filtering
|
69
|
+
say_error "No devices matched your filter.".red and abort if @filtered_devices.empty?
|
70
|
+
end
|
71
|
+
|
72
|
+
# Sends the filtered list to be printed if it exists.
|
73
|
+
device_info = @filtered_devices ? @filtered_devices : @devices
|
74
|
+
debug_log @filtered_devices ? "Sending filtered devices list to be printed." : "Filtered devices undefined. Sending full device list to be printed."
|
75
|
+
|
76
|
+
# Print the list
|
77
|
+
debug_log "Commencing list printing..."
|
78
|
+
device_info.each do |device, info|
|
79
|
+
print "#{device}".bold
|
80
|
+
|
81
|
+
# To ensure that the items are in line with each other, the space of 5 tabs (4 spaces each) will be given for the name field and the space of 3 tabs will be given for the device type
|
82
|
+
chars = device.to_s.length
|
83
|
+
space_to_next_tab = (4 - (chars % 4))
|
84
|
+
if space_to_next_tab != 4
|
85
|
+
print "\t"
|
86
|
+
chars += space_to_next_tab
|
87
|
+
end
|
88
|
+
while chars % 20 != 0
|
89
|
+
print "\t"
|
90
|
+
chars += 4
|
91
|
+
end
|
92
|
+
|
93
|
+
print "#{info[:model]}".green
|
94
|
+
|
95
|
+
chars = info[:model].length
|
96
|
+
space_to_next_tab = (4 - (chars % 4))
|
97
|
+
if space_to_next_tab != 4
|
98
|
+
print "\t"
|
99
|
+
chars += space_to_next_tab
|
100
|
+
end
|
101
|
+
while chars % 12 != 0
|
102
|
+
print "\t"
|
103
|
+
chars += 4
|
104
|
+
end
|
105
|
+
|
106
|
+
print "#{info[:token]}".blue
|
107
|
+
print "\n"
|
108
|
+
end
|
109
|
+
debug_log "List printing complete."
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
command :push do |c|
|
114
|
+
|
115
|
+
c.syntax = 'pushit push DEVICE [options]'
|
116
|
+
c.description = 'Push a notification to the given device. Try running --help for options.'
|
117
|
+
|
118
|
+
c.example 'Send the reference name for your device and any additional options.', 'pushit push johns_ipad --link web -m This is a web link! -b 1'
|
119
|
+
|
120
|
+
# The command should send different payloads based on the options specified.
|
121
|
+
|
122
|
+
c.option '-a', '--app STRING', 'Specify the app you want the notification to be sent to. Ensure you have the certificate for the app named <app>.pem in this directory. You could also specify the path to the certificate from this directory, less ".pem".'
|
123
|
+
|
124
|
+
c.option '-m', '--message STRING', 'The message to appear on the notification.'
|
125
|
+
c.option '-b', '--badge NUMBER', 'Sets the app badge when the notification is received.'
|
126
|
+
c.option '-s', '--sound STRING', 'Specifies a sound to be played when the notification is received.'
|
127
|
+
c.option '-n', '--newsstand', 'Adds content-available to the payload. Newsstand apps only.'
|
128
|
+
c.option '-i', '--issue NUMBER', 'Sets the issue ID of the issue to be downloaded in the background.'
|
129
|
+
|
130
|
+
c.option '-l', '--link STRING', 'Sends a link of the given type. Choose from: web, itunes, appstore, email, page, location, telephone.'
|
131
|
+
c.option '-t', '--button STRING', 'Sets the action button on the notification. If no --button option is chosen, View will appear by default. Choose from: install, read, watch, browse, listen, visit.'
|
132
|
+
|
133
|
+
c.option '-e', '--environment ENV', [:production, :development], 'Environment to send push notification (production or development (default))'
|
134
|
+
c.option '-d', '--debug', 'Enables debug mode.'
|
135
|
+
|
136
|
+
c.action do |chosenDevices, options|
|
137
|
+
$DEBUG_MODE = options.debug.nil? ? false : true
|
138
|
+
|
139
|
+
# Log devices specified.
|
140
|
+
if $DEBUG_MODE
|
141
|
+
print "Debug logs will appear in ".bold + "blue".bold.blue + ".\n".bold
|
142
|
+
debug_log chosenDevices.empty? ? "No devices specified." : "Devices specified:"
|
143
|
+
chosenDevices.each do |chosenDevice|
|
144
|
+
debug_log "#{chosenDevice}"
|
145
|
+
end
|
146
|
+
print "\n"
|
147
|
+
end
|
148
|
+
|
149
|
+
# Ensures that a recipient device was specified.
|
150
|
+
say_error "Push aborted. One or more device references required.".red and abort if chosenDevices.empty?
|
151
|
+
|
152
|
+
# Ensures that data is available for the specified device.
|
153
|
+
chosenDevices.each do |chosenDevice|
|
154
|
+
if @devices[chosenDevice.to_sym].nil?
|
155
|
+
say_error "Push aborted. No data was found for #{chosenDevice}.".red and abort
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
debug_log "Setting environment..."
|
160
|
+
if options.environment
|
161
|
+
@environment = options.environment
|
162
|
+
say_error "Invalid environment,'#{@environment}' (should be either development or production)" and abort unless [:development, :production].include?(@environment)
|
163
|
+
else
|
164
|
+
@environment = :development
|
165
|
+
end
|
166
|
+
debug_log "environment: #{@environment}"
|
167
|
+
|
168
|
+
@app = options.app if options.app # This will be converted to the certificate filename later on.
|
169
|
+
|
170
|
+
@message = options.message
|
171
|
+
@badge = options.badge.nil? ? nil : options.badge.to_i
|
172
|
+
@sound = options.sound
|
173
|
+
@newsstand = options.newsstand ? true : false
|
174
|
+
@issue_id = options.issue.nil? ? nil : options.issue.to_i
|
175
|
+
|
176
|
+
debug_log "app: #{@app}"
|
177
|
+
debug_log "message: #{@message}"
|
178
|
+
debug_log "badge: #{@badge}"
|
179
|
+
debug_log "sound: #{@sound}"
|
180
|
+
debug_log "newsstand: #{@newsstand}"
|
181
|
+
debug_log "issue_id: #{@issue_id}"
|
182
|
+
|
183
|
+
unless @message or @badge or @sound or @newsstand
|
184
|
+
debug_log "message, badge, sound and newsstand values not specified."
|
185
|
+
@message = ask_editor "Please enter a message."
|
186
|
+
say_error "Push aborted. You must include use least one of the message, badge, sound or newsstand options.".red and abort if @message.nil?
|
187
|
+
end
|
188
|
+
|
189
|
+
if options.link
|
190
|
+
debug_log "Setting link..."
|
191
|
+
case options.link.downcase
|
192
|
+
when 'web'
|
193
|
+
@link = 'http://www.google.com/'
|
194
|
+
when 'itunes'
|
195
|
+
@link = 'itms://itunes.apple.com/gb/album/insomnia-best-faithless/id305775034'
|
196
|
+
when 'appstore'
|
197
|
+
@link = 'https://itunes.apple.com/us/app/wwdc/id640199958'
|
198
|
+
when 'email'
|
199
|
+
@link = 'mailto:testuser@pushit.com?subject=Email%20from%20a%20push%20notification%20link!'
|
200
|
+
when 'page'
|
201
|
+
@link = 'pm-page://local/54637/72/3/0.4746,0.7323,0.1845,0.5763'
|
202
|
+
when 'location'
|
203
|
+
@link = 'http://maps.apple.com/?q=cupertino'
|
204
|
+
when 'telephone'
|
205
|
+
@link = 'tel:150' # Free from a T-Mobile phone.
|
206
|
+
else
|
207
|
+
say_error "Push aborted. Invalid link type.".red and abort
|
208
|
+
end
|
209
|
+
debug_log "link: #{@link}"
|
210
|
+
end
|
211
|
+
|
212
|
+
if options.button
|
213
|
+
debug_log "Setting button..."
|
214
|
+
button_title = options.button.capitalize
|
215
|
+
unless button_title == ('Install' or 'Read' or 'Watch' or 'Browse' or 'Listen' or 'Visit')
|
216
|
+
say_error "Push aborted. Invalid button title.".red and abort
|
217
|
+
end
|
218
|
+
@button = "APNSActionButton" + button_title
|
219
|
+
debug_log "button: #{@button}"
|
220
|
+
end
|
221
|
+
|
222
|
+
@notifications = []
|
223
|
+
debug_log "Created notifications array."
|
224
|
+
chosenDevices.each do |device|
|
225
|
+
debug_log "Setting up notification for device: #{device}"
|
226
|
+
notification = Houston::Notification.new({})
|
227
|
+
notification.token = @devices[device.to_sym][:token]
|
228
|
+
notification.alert = @message if @message
|
229
|
+
notification.badge = @badge if @badge
|
230
|
+
notification.sound = @sound if @sound
|
231
|
+
notification.content_available = @newsstand if @newsstand
|
232
|
+
|
233
|
+
custom_payload = Hash.new
|
234
|
+
debug_log "Created custom payload hash."
|
235
|
+
|
236
|
+
custom_payload.merge!({:new_issue_identifier => "#{@issue_id}"}) if @issue_id
|
237
|
+
custom_payload.merge!({:pmps => {:'link-url' => "#{@link}"}}) if @link
|
238
|
+
custom_payload.merge!({'alert' => {:body => "#{@message}", :'action-loc-key' => "#{@button}"}}) if @button
|
239
|
+
|
240
|
+
debug_log "Merging custom payload..."
|
241
|
+
notification.custom_data.merge!(custom_payload)
|
242
|
+
|
243
|
+
debug_log "Adding notification to notifications array..."
|
244
|
+
@notifications << notification
|
245
|
+
debug_log "Notification added."
|
246
|
+
end
|
247
|
+
debug_log "All notifications added."
|
248
|
+
|
249
|
+
debug_log "Creating Houston Client..."
|
250
|
+
client = @environment == :production ? Houston::Client.production : Houston::Client.development
|
251
|
+
debug_log "Setting certificate..."
|
252
|
+
client.certificate = File.read(@app.nil? ? "cert.pem" : "#{@app}.pem")
|
253
|
+
# client.passphrase = password("Please enter the password for the #{@app.capitalize} application certificate:", '*')
|
254
|
+
|
255
|
+
debug_log "Beginning push operation..."
|
256
|
+
begin
|
257
|
+
client.push(*@notifications)
|
258
|
+
rescue => message
|
259
|
+
say_error "Exception sending notification: #{message}".red and abort
|
260
|
+
end
|
261
|
+
debug_log "Push complete."
|
262
|
+
|
263
|
+
say_ok "Push notification send successful!".green
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
|
metadata
CHANGED
@@ -1,67 +1,74 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: PushIt
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Oletha Lai
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2013-06-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
15
14
|
name: houston
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: "0"
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
23
20
|
type: :runtime
|
24
|
-
version_requirements: *id001
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: colored
|
27
21
|
prerelease: false
|
28
|
-
|
29
|
-
requirements:
|
30
|
-
-
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: colored
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
31
34
|
type: :runtime
|
32
|
-
|
33
|
-
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Uses Houston (https://github.com/nomad/houston/) to send push notifications
|
42
|
+
to iOS devices.
|
34
43
|
email: oletha@gmail.com
|
35
|
-
executables:
|
44
|
+
executables:
|
36
45
|
- pushit
|
37
46
|
extensions: []
|
38
|
-
|
39
47
|
extra_rdoc_files: []
|
40
|
-
|
41
|
-
files:
|
48
|
+
files:
|
42
49
|
- bin/pushit
|
43
50
|
homepage: https://github.com/olethalai/challenges/tree/master/apns-cli
|
44
|
-
licenses:
|
45
|
-
|
51
|
+
licenses:
|
52
|
+
- MIT
|
46
53
|
metadata: {}
|
47
|
-
|
48
54
|
post_install_message:
|
49
55
|
rdoc_options: []
|
50
|
-
|
51
|
-
require_paths:
|
56
|
+
require_paths:
|
52
57
|
- lib
|
53
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
-
requirements:
|
55
|
-
-
|
56
|
-
|
57
|
-
|
58
|
-
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
59
68
|
requirements: []
|
60
|
-
|
61
69
|
rubyforge_project:
|
62
|
-
rubygems_version: 2.0.
|
70
|
+
rubygems_version: 2.0.7
|
63
71
|
signing_key:
|
64
72
|
specification_version: 4
|
65
73
|
summary: Sends push notifications from the command line.
|
66
74
|
test_files: []
|
67
|
-
|