rest-firebase 0.9.5 → 1.0.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.travis.yml +4 -3
- data/CHANGES.md +14 -0
- data/Gemfile +3 -0
- data/README.md +15 -1
- data/Rakefile +6 -2
- data/lib/rest-firebase.rb +10 -11
- data/rest-firebase.gemspec +7 -7
- data/task/gemgem.rb +100 -51
- data/test/test_api.rb +7 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a30e9102ed052bca42445fecdfa66a498e8e01a3
|
4
|
+
data.tar.gz: e2323344983ba8c34fcb155d28eafb5140fa6c74
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c839fdac740a2b1377bcc9a53041efbe18c046344a937d42f0bc377019031aeb5455f77f076bbc4a636304de8ae039a5e9b8336edbcd5caedec7a70eb0ac215
|
7
|
+
data.tar.gz: 93688fe31a380d56223905232f236eb7f3ac5ca8676ca22a1ba456fddccd98866a4c02be5a387f061daa7510767e75802b5aaedc445c4a0bf84ab3533b73f718
|
data/.gitignore
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
/pkg/
|
2
|
-
|
2
|
+
/coverage/
|
data/.travis.yml
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
before_install: 'git submodule update --init'
|
2
|
-
script: 'ruby -r bundler/setup -S rake test'
|
3
1
|
|
2
|
+
language: ruby
|
4
3
|
rvm:
|
5
4
|
- 1.9
|
6
5
|
- 2.0
|
7
6
|
- 2.1
|
8
|
-
- ruby
|
9
7
|
- rbx-2
|
10
8
|
- jruby
|
9
|
+
|
10
|
+
install: 'bundle install --retry=3'
|
11
|
+
script: 'ruby -r bundler/setup -S rake test'
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
# CHANGES
|
2
2
|
|
3
|
+
## rest-firebase 1.0.0 -- 2014-12-09
|
4
|
+
|
5
|
+
### Enhancement
|
6
|
+
|
7
|
+
* Encode query in JSON to make using [Firebase queries][] easy.
|
8
|
+
* Introduced `max_retries`, `retry_exceptions`, and `error_callback` from
|
9
|
+
latest rest-core (3.5.0+). See README.md for detail.
|
10
|
+
|
11
|
+
[Firebase queries]: https://www.firebase.com/docs/rest/guide/retrieving-data.html#section-rest-queries
|
12
|
+
|
13
|
+
### Internal Enhancement
|
14
|
+
|
15
|
+
* Encode payload in JSON with middleware from rest-core
|
16
|
+
|
3
17
|
## rest-firebase 0.9.5 -- 2014-11-07
|
4
18
|
|
5
19
|
* Base64url encoded JWT would no longer contain any newlines.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# rest-firebase [](http://travis-ci.org/CodementorIO/rest-firebase)
|
1
|
+
# rest-firebase [](http://travis-ci.org/CodementorIO/rest-firebase) [](https://coveralls.io/r/CodementorIO/rest-firebase)
|
2
2
|
|
3
3
|
by [Codementor][]
|
4
4
|
|
@@ -65,6 +65,17 @@ f = RestFirebase.new :site => 'https://SampleChat.firebaseIO-demo.com/',
|
|
65
65
|
:secret => 'secret',
|
66
66
|
:d => {:auth_data => 'something'},
|
67
67
|
:log_method => method(:puts),
|
68
|
+
# `timeout` in seconds
|
69
|
+
:timeout => 10,
|
70
|
+
# `max_retries` upon failures. Default is: `0`
|
71
|
+
:max_retries => 3,
|
72
|
+
# `retry_exceptions` for which exceptions should retry
|
73
|
+
# Default is: `[IOError, SystemCallError]`
|
74
|
+
:retry_exceptions =>
|
75
|
+
[IOError, SystemCallError, Timeout::Error],
|
76
|
+
# `error_callback` would get called each time there's
|
77
|
+
# an exception. Useful for monitoring and logging.
|
78
|
+
:error_callback => method(:p),
|
68
79
|
# `auth_ttl` describes when we should refresh the auth
|
69
80
|
# token. Set it to `false` to disable auto-refreshing.
|
70
81
|
# The default is 23 hours.
|
@@ -96,6 +107,9 @@ p f.post('users/tom', :some => 'other')
|
|
96
107
|
p f.get('users/tom')
|
97
108
|
p f.delete('users/tom')
|
98
109
|
|
110
|
+
# With Firebase queries (it would encode query in JSON for you)
|
111
|
+
p f.get('users/tom', :orderBy => '$key', :limitToFirst => 1)
|
112
|
+
|
99
113
|
# Need to tell onreconnect stops reconnecting, or even if we close
|
100
114
|
# the connection manually, it would still try to reconnect again.
|
101
115
|
@reconnect = false
|
data/Rakefile
CHANGED
@@ -10,14 +10,18 @@ $LOAD_PATH.unshift(File.expand_path("#{dir}/rest-core/lib"))
|
|
10
10
|
|
11
11
|
Gemgem.init(dir) do |s|
|
12
12
|
s.name = 'rest-firebase'
|
13
|
-
s.version = '0.
|
13
|
+
s.version = '1.0.0'
|
14
14
|
s.homepage = 'https://github.com/CodementorIO/rest-firebase'
|
15
15
|
|
16
16
|
s.authors = ['Codementor', 'Lin Jen-Shin (godfat)']
|
17
17
|
s.email = ['help@codementor.io']
|
18
18
|
|
19
|
-
%w[rest-core].each{ |g| s.add_runtime_dependency(g, '>=3.
|
19
|
+
%w[rest-core].each{ |g| s.add_runtime_dependency(g, '>=3.5.0') }
|
20
20
|
|
21
21
|
# exclude rest-core
|
22
22
|
s.files.reject!{ |f| f.start_with?('rest-core/') }
|
23
23
|
end
|
24
|
+
|
25
|
+
task 'test' do
|
26
|
+
SimpleCov.add_filter('rest-core/lib') if ENV['COV'] || ENV['CI']
|
27
|
+
end
|
data/lib/rest-firebase.rb
CHANGED
@@ -3,19 +3,21 @@ require 'rest-core'
|
|
3
3
|
|
4
4
|
# https://www.firebase.com/docs/security/custom-login.html
|
5
5
|
# https://www.firebase.com/docs/rest-api.html
|
6
|
+
# https://www.firebase.com/docs/rest/guide/retrieving-data.html#section-rest-queries
|
6
7
|
RestFirebase = RC::Builder.client(:d, :secret, :auth, :auth_ttl, :iat) do
|
7
|
-
use RC::Timeout , 10
|
8
|
-
|
9
8
|
use RC::DefaultSite , 'https://SampleChat.firebaseIO-demo.com/'
|
10
9
|
use RC::DefaultHeaders, {'Accept' => 'application/json',
|
11
10
|
'Content-Type' => 'application/json'}
|
12
11
|
use RC::DefaultQuery , nil
|
13
12
|
|
13
|
+
use RC::Retry , 0, RC::Retry::DefaultRetryExceptions
|
14
|
+
use RC::Timeout , 10
|
14
15
|
use RC::FollowRedirect, 1
|
15
|
-
use RC::CommonLogger , nil
|
16
16
|
use RC::ErrorHandler , lambda{ |env| RestFirebase::Error.call(env) }
|
17
17
|
use RC::ErrorDetectorHttp
|
18
|
+
use RC::JsonRequest , true
|
18
19
|
use RC::JsonResponse , true
|
20
|
+
use RC::CommonLogger , nil
|
19
21
|
use RC::Cache , nil, 600
|
20
22
|
end
|
21
23
|
|
@@ -75,15 +77,12 @@ module RestFirebase::Client
|
|
75
77
|
|
76
78
|
def request env, app=app
|
77
79
|
check_auth
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
{REQUEST_PAYLOAD => Json.encode(env[REQUEST_PAYLOAD])}
|
82
|
-
else
|
83
|
-
{}
|
80
|
+
query = env[REQUEST_QUERY].inject({}) do |q, (k, v)|
|
81
|
+
q[k] = Json.encode(v)
|
82
|
+
q
|
84
83
|
end
|
85
|
-
|
86
|
-
|
84
|
+
super(env.merge(REQUEST_PATH => "#{env[REQUEST_PATH]}.json",
|
85
|
+
REQUEST_QUERY => query), app)
|
87
86
|
end
|
88
87
|
|
89
88
|
def generate_auth opts={}
|
data/rest-firebase.gemspec
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: rest-firebase 0.
|
2
|
+
# stub: rest-firebase 1.0.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "rest-firebase"
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "1.0.0"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib"]
|
10
10
|
s.authors = [
|
11
11
|
"Codementor",
|
12
12
|
"Lin Jen-Shin (godfat)"]
|
13
|
-
s.date = "2014-
|
13
|
+
s.date = "2014-12-09"
|
14
14
|
s.description = "Ruby Firebase REST API client built on top of [rest-core][].\n\n[rest-core]: https://github.com/godfat/rest-core"
|
15
15
|
s.email = ["help@codementor.io"]
|
16
16
|
s.files = [
|
@@ -31,7 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
"test/test_api.rb"]
|
32
32
|
s.homepage = "https://github.com/CodementorIO/rest-firebase"
|
33
33
|
s.licenses = ["Apache License 2.0"]
|
34
|
-
s.rubygems_version = "2.4.
|
34
|
+
s.rubygems_version = "2.4.5"
|
35
35
|
s.summary = "Ruby Firebase REST API client built on top of [rest-core][]."
|
36
36
|
s.test_files = ["test/test_api.rb"]
|
37
37
|
|
@@ -39,11 +39,11 @@ Gem::Specification.new do |s|
|
|
39
39
|
s.specification_version = 4
|
40
40
|
|
41
41
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
42
|
-
s.add_runtime_dependency(%q<rest-core>, [">= 3.
|
42
|
+
s.add_runtime_dependency(%q<rest-core>, [">= 3.5.0"])
|
43
43
|
else
|
44
|
-
s.add_dependency(%q<rest-core>, [">= 3.
|
44
|
+
s.add_dependency(%q<rest-core>, [">= 3.5.0"])
|
45
45
|
end
|
46
46
|
else
|
47
|
-
s.add_dependency(%q<rest-core>, [">= 3.
|
47
|
+
s.add_dependency(%q<rest-core>, [">= 3.5.0"])
|
48
48
|
end
|
49
49
|
end
|
data/task/gemgem.rb
CHANGED
@@ -38,6 +38,99 @@ module Gemgem
|
|
38
38
|
self.spec = spec
|
39
39
|
end
|
40
40
|
|
41
|
+
def gem_install
|
42
|
+
require 'rubygems/commands/install_command'
|
43
|
+
# read ~/.gemrc
|
44
|
+
Gem.use_paths(Gem.configuration[:gemhome], Gem.configuration[:gempath])
|
45
|
+
Gem::Command.extra_args = Gem.configuration[:gem]
|
46
|
+
|
47
|
+
# setup install options
|
48
|
+
cmd = Gem::Commands::InstallCommand.new
|
49
|
+
cmd.handle_options([])
|
50
|
+
|
51
|
+
# install
|
52
|
+
install = Gem::Installer.new(gem_path, cmd.options)
|
53
|
+
install.install
|
54
|
+
puts "\e[35mGem installed: \e[33m#{strip_path(install.gem_dir)}\e[0m"
|
55
|
+
end
|
56
|
+
|
57
|
+
def gem_spec
|
58
|
+
create
|
59
|
+
write
|
60
|
+
end
|
61
|
+
|
62
|
+
def gem_build
|
63
|
+
require 'fileutils'
|
64
|
+
require 'rubygems/package'
|
65
|
+
gem = nil
|
66
|
+
Dir.chdir(dir) do
|
67
|
+
gem = Gem::Package.build(Gem::Specification.load(spec_path))
|
68
|
+
FileUtils.mkdir_p(pkg_dir)
|
69
|
+
FileUtils.mv(gem, pkg_dir) # gem is relative path, but might be ok
|
70
|
+
end
|
71
|
+
puts "\e[35mGem built: \e[33m#{strip_path("#{pkg_dir}/#{gem}")}\e[0m"
|
72
|
+
end
|
73
|
+
|
74
|
+
def gem_release
|
75
|
+
sh_git('tag', gem_tag)
|
76
|
+
sh_git('push')
|
77
|
+
sh_git('push', '--tags')
|
78
|
+
sh_gem('push', gem_path)
|
79
|
+
end
|
80
|
+
|
81
|
+
def gem_check
|
82
|
+
ver = spec.version.to_s
|
83
|
+
|
84
|
+
if ENV['VERSION'].nil?
|
85
|
+
puts("\e[35mExpected " \
|
86
|
+
"\e[33mVERSION\e[35m=\e[33m#{ver}\e[0m")
|
87
|
+
exit(1)
|
88
|
+
|
89
|
+
elsif ENV['VERSION'] != ver
|
90
|
+
puts("\e[35mExpected \e[33mVERSION\e[35m=\e[33m#{ver} " \
|
91
|
+
"\e[35mbut got\n " \
|
92
|
+
"\e[33mVERSION\e[35m=\e[33m#{ENV['VERSION']}\e[0m")
|
93
|
+
exit(2)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def test
|
98
|
+
return if test_files.empty?
|
99
|
+
|
100
|
+
if ENV['COV'] || ENV['CI']
|
101
|
+
require 'simplecov'
|
102
|
+
if ENV['CI']
|
103
|
+
require 'coveralls'
|
104
|
+
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
105
|
+
end
|
106
|
+
SimpleCov.start do
|
107
|
+
add_filter('test/')
|
108
|
+
add_filter('test.rb')
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
test_files.each{ |file| require "#{dir}/#{file[0..-4]}" }
|
113
|
+
end
|
114
|
+
|
115
|
+
def clean
|
116
|
+
return if ignored_files.empty?
|
117
|
+
|
118
|
+
require 'fileutils'
|
119
|
+
trash = File.expand_path("~/.Trash/#{spec.name}")
|
120
|
+
puts "Move the following files into: \e[35m#{strip_path(trash)}\e[33m"
|
121
|
+
|
122
|
+
ignored_files.each do |file|
|
123
|
+
from = "#{dir}/#{file}"
|
124
|
+
to = "#{trash}/#{File.dirname(file)}"
|
125
|
+
puts strip_path(from)
|
126
|
+
|
127
|
+
FileUtils.mkdir_p(to)
|
128
|
+
FileUtils.mv(from, to)
|
129
|
+
end
|
130
|
+
|
131
|
+
print "\e[0m"
|
132
|
+
end
|
133
|
+
|
41
134
|
def write
|
42
135
|
File.open(spec_path, 'w'){ |f| f << split_lines(spec.to_ruby) }
|
43
136
|
end
|
@@ -173,82 +266,38 @@ namespace :gem do
|
|
173
266
|
|
174
267
|
desc 'Install gem'
|
175
268
|
task :install => [:build] do
|
176
|
-
Gemgem.
|
269
|
+
Gemgem.gem_install
|
177
270
|
end
|
178
271
|
|
179
272
|
desc 'Build gem'
|
180
273
|
task :build => [:spec] do
|
181
|
-
|
182
|
-
require 'rubygems/package'
|
183
|
-
gem = nil
|
184
|
-
Dir.chdir(Gemgem.dir) do
|
185
|
-
gem = Gem::Package.build(Gem::Specification.load(Gemgem.spec_path))
|
186
|
-
FileUtils.mkdir_p(Gemgem.pkg_dir)
|
187
|
-
FileUtils.mv(gem, Gemgem.pkg_dir) # gem is relative path, but might be ok
|
188
|
-
end
|
189
|
-
puts "\e[35mGem built: \e[33m" \
|
190
|
-
"#{Gemgem.strip_path("#{Gemgem.pkg_dir}/#{gem}")}\e[0m"
|
274
|
+
Gemgem.gem_build
|
191
275
|
end
|
192
276
|
|
193
277
|
desc 'Generate gemspec'
|
194
278
|
task :spec do
|
195
|
-
Gemgem.
|
196
|
-
Gemgem.write
|
279
|
+
Gemgem.gem_spec
|
197
280
|
end
|
198
281
|
|
199
282
|
desc 'Release gem'
|
200
283
|
task :release => [:spec, :check, :build] do
|
201
|
-
Gemgem.
|
202
|
-
sh_git('tag', Gemgem.gem_tag)
|
203
|
-
sh_git('push')
|
204
|
-
sh_git('push', '--tags')
|
205
|
-
sh_gem('push', Gemgem.gem_path)
|
206
|
-
end
|
284
|
+
Gemgem.gem_release
|
207
285
|
end
|
208
286
|
|
209
287
|
task :check do
|
210
|
-
|
211
|
-
|
212
|
-
if ENV['VERSION'].nil?
|
213
|
-
puts("\e[35mExpected " \
|
214
|
-
"\e[33mVERSION\e[35m=\e[33m#{ver}\e[0m")
|
215
|
-
exit(1)
|
216
|
-
|
217
|
-
elsif ENV['VERSION'] != ver
|
218
|
-
puts("\e[35mExpected \e[33mVERSION\e[35m=\e[33m#{ver} " \
|
219
|
-
"\e[35mbut got\n " \
|
220
|
-
"\e[33mVERSION\e[35m=\e[33m#{ENV['VERSION']}\e[0m")
|
221
|
-
exit(2)
|
222
|
-
end
|
288
|
+
Gemgem.gem_check
|
223
289
|
end
|
224
290
|
|
225
291
|
end # of gem namespace
|
226
292
|
|
227
293
|
desc 'Run tests'
|
228
294
|
task :test do
|
229
|
-
|
230
|
-
Gemgem.test_files.each{ |file| require "#{Gemgem.dir}/#{file[0..-4]}" }
|
295
|
+
Gemgem.test
|
231
296
|
end
|
232
297
|
|
233
298
|
desc 'Trash ignored files'
|
234
299
|
task :clean => ['gem:spec'] do
|
235
|
-
|
236
|
-
|
237
|
-
require 'fileutils'
|
238
|
-
trash = File.expand_path("~/.Trash/#{Gemgem.spec.name}")
|
239
|
-
puts "Move the following files into:" \
|
240
|
-
" \e[35m#{Gemgem.strip_path(trash)}\e[33m"
|
241
|
-
|
242
|
-
Gemgem.ignored_files.each do |file|
|
243
|
-
from = "#{Gemgem.dir}/#{file}"
|
244
|
-
to = "#{trash}/#{File.dirname(file)}"
|
245
|
-
puts Gemgem.strip_path(from)
|
246
|
-
|
247
|
-
FileUtils.mkdir_p(to)
|
248
|
-
FileUtils.mv(from, to)
|
249
|
-
end
|
250
|
-
|
251
|
-
print "\e[0m"
|
300
|
+
Gemgem.clean
|
252
301
|
end
|
253
302
|
|
254
303
|
task :default do
|
data/test/test_api.rb
CHANGED
@@ -26,6 +26,13 @@ Pork::API.describe RestFirebase do
|
|
26
26
|
firebase.get('https://a').should.eq true
|
27
27
|
end
|
28
28
|
|
29
|
+
would 'get with query' do
|
30
|
+
stub_request(:get, "#{path}&orderBy=%22date%22&limitToFirst=1").
|
31
|
+
to_return(:body => json)
|
32
|
+
firebase.get('https://a', :orderBy => 'date', :limitToFirst => 1).
|
33
|
+
should.eq rbon
|
34
|
+
end
|
35
|
+
|
29
36
|
would 'put {"status":"ok"}' do
|
30
37
|
stub_request(:put, path).with(:body => json).to_return(:body => json)
|
31
38
|
firebase.put('https://a', rbon).should.eq rbon
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-firebase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Codementor
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-12-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-core
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 3.
|
20
|
+
version: 3.5.0
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: 3.
|
27
|
+
version: 3.5.0
|
28
28
|
description: |-
|
29
29
|
Ruby Firebase REST API client built on top of [rest-core][].
|
30
30
|
|
@@ -70,7 +70,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
70
|
version: '0'
|
71
71
|
requirements: []
|
72
72
|
rubyforge_project:
|
73
|
-
rubygems_version: 2.4.
|
73
|
+
rubygems_version: 2.4.5
|
74
74
|
signing_key:
|
75
75
|
specification_version: 4
|
76
76
|
summary: Ruby Firebase REST API client built on top of [rest-core][].
|