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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 45df4ea3a44c2d4bd3987e9732b5d3c4bc8244e3
4
- data.tar.gz: 558d531d7bd4f7a87bcb1a8d9eb6472aa892ed9d
3
+ metadata.gz: a30e9102ed052bca42445fecdfa66a498e8e01a3
4
+ data.tar.gz: e2323344983ba8c34fcb155d28eafb5140fa6c74
5
5
  SHA512:
6
- metadata.gz: 040559b33938b07933026e8824b81ff087ed1b83221e23dea9abb8dc0f2d07967d7fa267aa4c3f22f2f1939bf88e5ded0ff27e713f3555887b394388918e1987
7
- data.tar.gz: 367a943d81a2eaa5220a6bb737f6f697ffd81c4a6c7dd0eb1c82ed6c099bb20d471cdf6970c09aadfab342ebfe6b44e874147e7b3fa212bee2ebcc2c3510a51a
6
+ metadata.gz: 6c839fdac740a2b1377bcc9a53041efbe18c046344a937d42f0bc377019031aeb5455f77f076bbc4a636304de8ae039a5e9b8336edbcd5caedec7a70eb0ac215
7
+ data.tar.gz: 93688fe31a380d56223905232f236eb7f3ac5ca8676ca22a1ba456fddccd98866a4c02be5a387f061daa7510767e75802b5aaedc445c4a0bf84ab3533b73f718
data/.gitignore CHANGED
@@ -1,2 +1,2 @@
1
1
  /pkg/
2
- Gemfile.lock
2
+ /coverage/
@@ -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
@@ -18,6 +18,9 @@ gem 'multi_json'
18
18
 
19
19
  gem 'rack'
20
20
 
21
+ gem 'simplecov', :require => false if ENV['COV']
22
+ gem 'coveralls', :require => false if ENV['CI']
23
+
21
24
  platforms :ruby do
22
25
  gem 'yajl-ruby'
23
26
  end
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # rest-firebase [![Build Status](https://secure.travis-ci.org/CodementorIO/rest-firebase.png?branch=master)](http://travis-ci.org/CodementorIO/rest-firebase)
1
+ # rest-firebase [![Build Status](https://secure.travis-ci.org/CodementorIO/rest-firebase.png?branch=master)](http://travis-ci.org/CodementorIO/rest-firebase) [![Coverage Status](https://coveralls.io/repos/CodementorIO/rest-firebase/badge.png)](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.9.5'
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.3.0') }
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
@@ -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
- path = "#{env[REQUEST_PATH]}.json"
80
- payload = if env[REQUEST_PAYLOAD]
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
- super(env.merge(REQUEST_PATH => path).merge(payload), app)
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={}
@@ -1,16 +1,16 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: rest-firebase 0.9.5 ruby lib
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.9.5"
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-11-07"
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.2"
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.3.0"])
42
+ s.add_runtime_dependency(%q<rest-core>, [">= 3.5.0"])
43
43
  else
44
- s.add_dependency(%q<rest-core>, [">= 3.3.0"])
44
+ s.add_dependency(%q<rest-core>, [">= 3.5.0"])
45
45
  end
46
46
  else
47
- s.add_dependency(%q<rest-core>, [">= 3.3.0"])
47
+ s.add_dependency(%q<rest-core>, [">= 3.5.0"])
48
48
  end
49
49
  end
@@ -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.sh_gem('install', Gemgem.gem_path)
269
+ Gemgem.gem_install
177
270
  end
178
271
 
179
272
  desc 'Build gem'
180
273
  task :build => [:spec] do
181
- require 'fileutils'
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.create
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.module_eval do
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
- ver = Gemgem.spec.version.to_s
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
- next if Gemgem.test_files.empty?
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
- next if Gemgem.ignored_files.empty?
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
@@ -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.9.5
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-11-07 00:00:00.000000000 Z
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.3.0
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.3.0
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.2
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][].