rest-firebase 0.9.5 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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][].