rhosync 2.1.7 → 2.1.10

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,15 @@
1
+ ## 2.1.10
2
+ * #16001227 - raise exceptions on c2dm errors
3
+ * #1018 - delete read state for user as well
4
+
5
+ ## 2.1.9
6
+ * #15143911 - Fix for incident schema changed message
7
+
8
+ ## 2.1.8
9
+ * #1018 - added functionality to delete user source data on user delete
10
+ * updated to rake 0.9.2
11
+ * #14911833 - Add support for rolling back updates on sync errors
12
+
1
13
  ## 2.1.7
2
14
  * #14021681 - check for client on client_sync class methods
3
15
  * #14082861 - expose Store.lock timeout to high-level functions
data/Rakefile CHANGED
@@ -73,7 +73,7 @@ begin
73
73
  gemspec.add_dependency "rest-client", "~>1.6.1"
74
74
  gemspec.add_dependency "sinatra", "~>1.2"
75
75
  gemspec.add_dependency "templater", "~>1.0.0"
76
- gemspec.add_dependency "rake", "~>0.8.7"
76
+ gemspec.add_dependency "rake", "~>0.9.2"
77
77
  gemspec.add_development_dependency "log4r", "~>1.1.7"
78
78
  gemspec.add_development_dependency "jeweler", ">=1.4.0"
79
79
  gemspec.add_development_dependency "rspec", ">=1.3.0"
@@ -1,5 +1,9 @@
1
1
  Server.api :delete_user do |params,user|
2
2
  User.load(params[:user_id]).delete
3
3
  App.load(APP_NAME).users.delete(params[:user_id])
4
+ params = {:app_id => APP_NAME,:user_id => params[:user_id]}
5
+ App.load(APP_NAME).sources.members.each{ |source|
6
+ Source.load(source, params).flash_store_data
7
+ }
4
8
  "User deleted"
5
9
  end
@@ -102,18 +102,22 @@ module Rhosync
102
102
 
103
103
  # Checks if schema changed
104
104
  def schema_changed?
105
- schema_sha1 = @source.get_value(:schema_sha1)
105
+ if @source_sync.adapter.respond_to?(:schema)
106
+ schema_sha1 = @source.get_value(:schema_sha1)
107
+
108
+ if @client.get_value(:schema_sha1).nil?
109
+ @client.put_value(:schema_sha1,schema_sha1)
110
+ return false
111
+ elsif @client.get_value(:schema_sha1) == schema_sha1
112
+ return false
113
+ end
106
114
 
107
- if @client.get_value(:schema_sha1).nil?
108
115
  @client.put_value(:schema_sha1,schema_sha1)
109
- return false
110
- elsif @client.get_value(:schema_sha1) == schema_sha1
116
+ @client.put_value(:schema_page,schema_sha1)
117
+ return true
118
+ else
111
119
  return false
112
120
  end
113
-
114
- @client.put_value(:schema_sha1,schema_sha1)
115
- @client.put_value(:schema_page,schema_sha1)
116
- true
117
121
  end
118
122
 
119
123
  # Computes the metadata sha1 and returns metadata if client's sha1 doesn't
@@ -185,6 +189,9 @@ module Rhosync
185
189
  c.rename("#{operation}_errors","#{operation}_errors_page")
186
190
  end
187
191
  end
192
+ @client.lock("update_rollback") do |c|
193
+ c.rename("update_rollback","update_rollback_page")
194
+ end
188
195
  end
189
196
 
190
197
  # Computes create links for a client and stores a copy as links page
@@ -344,6 +351,7 @@ module Rhosync
344
351
  ['create','update','delete'].each do |operation|
345
352
  @client.flash_data("#{operation}_errors_page")
346
353
  end
354
+ @client.flash_data("update_rollback_page")
347
355
  end
348
356
 
349
357
  def _send_errors
@@ -352,6 +360,7 @@ module Rhosync
352
360
  res["#{operation}-error"] = @client.get_data("#{operation}_errors_page")
353
361
  end
354
362
  res["source-error"] = @source.lock(:errors) { |s| s.get_data(:errors) }
363
+ res["update-rollback"] = @client.get_data(:update_rollback_page)
355
364
  res.reject! {|key,value| value.nil? or value.empty?}
356
365
  res
357
366
  end
@@ -22,7 +22,8 @@ module Rhosync
22
22
  end
23
23
  _decrypt
24
24
  rescue Exception => e
25
- #puts e.backtrace.join('\n')
25
+ log e.message
26
+ log e.backtrace.join("\n")
26
27
  raise LicenseException.new("Error verifying license.")
27
28
  end
28
29
  end
@@ -1,24 +1,42 @@
1
- require 'net/https'
1
+ require 'rest_client'
2
2
  require 'uri'
3
+
3
4
  module Rhosync
4
5
  class Android
6
+ class StaleAuthToken < Exception; end
7
+ class InvalidAuthToken < Exception; end
8
+ class AndroidPingError < Exception; end
9
+
5
10
  def self.ping(params)
6
11
  begin
7
12
  settings = get_config(Rhosync.base_directory)[Rhosync.environment]
8
13
  authtoken = settings[:authtoken]
9
-
10
- url = URI.parse('https://android.apis.google.com/c2dm/send')
11
-
12
- req = Net::HTTP::Post.new url.path, 'Authorization' => "GoogleLogin auth=#{authtoken}"
13
- req.set_form_data c2d_message(params)
14
-
15
- http = Net::HTTP.new(url.host, url.port)
16
- http.use_ssl = true
17
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
18
- res = http.request(req)
19
-
14
+
15
+ RestClient.post(
16
+ 'https://android.apis.google.com/c2dm/send', c2d_message(params),
17
+ :authorization => "GoogleLogin auth=#{authtoken}"
18
+ ) do |response, request, result, &block|
19
+ # return exceptions based on response code & body
20
+ case response.code
21
+ when 200
22
+ # TODO: Automate authtoken updates
23
+ if response[:update_client_auth]
24
+ raise StaleAuthToken.new(
25
+ "Stale auth token, please update :authtoken: in settings.yml."
26
+ )
27
+ # body will contain the exception class
28
+ elsif response.body =~ /^Error=(.*)$/
29
+ raise AndroidPingError.new("Android ping error: #{$1 || ''}")
30
+ else
31
+ response.return!(request, result, &block)
32
+ end
33
+ when 401, 403
34
+ raise InvalidAuthToken.new("Invalid auth token, please update :authtoken: in settings.yml.")
35
+ end
36
+ end
20
37
  rescue Exception => error
21
- log "Error while sending ping: #{error}"
38
+ log error
39
+ log error.backtrace.join("\n")
22
40
  raise error
23
41
  end
24
42
  end
@@ -18,6 +18,11 @@ module Rhosync
18
18
  def self.delete(app_id)
19
19
  Store.flash_data("#{class_prefix(self)}:#{app_id}:*")
20
20
  end
21
+
22
+ def self.delete_user(params)
23
+ puts "#{class_prefix(self)}:#{params[:app_id]}:#{params[:user_id]}:#{params[:source_name]}:*"
24
+ Store.flash_data("#{class_prefix(self)}:#{params[:app_id]}:#{params[:user_id]}:#{params[:source_name]}:*")
25
+ end
21
26
 
22
27
  private
23
28
  def self.get_id(params)
@@ -215,7 +215,19 @@ module Rhosync
215
215
  def read_state
216
216
  id = {:app_id => self.app_id,:user_id => user_by_partition,
217
217
  :source_name => self.name}
218
- ReadState.load(id) || ReadState.create(id)
218
+ load_read_state || ReadState.create(id)
219
+ end
220
+
221
+ def load_read_state
222
+ id = {:app_id => self.app_id,:user_id => user_by_partition,
223
+ :source_name => self.name}
224
+ ReadState.load(id)
225
+ end
226
+
227
+ def delete_user_read_state
228
+ id = {:app_id => self.app_id,:user_id => user_by_partition,
229
+ :source_name => self.name}
230
+ ReadState.delete_user(id)
219
231
  end
220
232
 
221
233
  def doc_suffix(doctype)
@@ -236,6 +248,12 @@ module Rhosync
236
248
  self.partition_type = value
237
249
  end
238
250
 
251
+ def flash_store_data
252
+ delete_user_read_state
253
+ flash_data('*')
254
+ flash_data(poll_interval_key)
255
+ end
256
+
239
257
  def user_by_partition
240
258
  self.partition.to_sym == :user ? self.user_id : '__shared__'
241
259
  end
@@ -117,7 +117,7 @@ module Rhosync
117
117
  true
118
118
  end
119
119
 
120
- def _process_create(client_id,key,value,links,creates,deletes)
120
+ def _process_create(client,key,value,links,creates,deletes)
121
121
  # Perform operation
122
122
  link = @adapter.create value
123
123
  # Store object-id link for the client
@@ -134,14 +134,21 @@ module Rhosync
134
134
  end
135
135
  end
136
136
 
137
- def _process_update(client_id,key,value)
138
- # Add id to object hash to forward to backend call
139
- value['id'] = key
140
- # Perform operation
141
- @adapter.update value
137
+ def _process_update(client,key,value)
138
+ begin
139
+ # Add id to object hash to forward to backend call
140
+ value['id'] = key
141
+ # Perform operation
142
+ @adapter.update value
143
+ rescue Exception => e
144
+ # TODO: This will be slow!
145
+ cd = client.get_data(:cd)
146
+ client.put_data(:update_rollback,{key => cd[key]},true) if cd[key]
147
+ raise e
148
+ end
142
149
  end
143
150
 
144
- def _process_delete(client_id,key,value,dels)
151
+ def _process_delete(client,key,value,dels)
145
152
  value['id'] = key
146
153
  # Perform operation
147
154
  @adapter.delete value
@@ -167,14 +174,15 @@ module Rhosync
167
174
  # Call on source adapter to process individual object
168
175
  case operation
169
176
  when 'create'
170
- _process_create(client_id,key,value,links,creates,deletes)
177
+ _process_create(client,key,value,links,creates,deletes)
171
178
  when 'update'
172
- _process_update(client_id,key,value)
179
+ _process_update(client,key,value)
173
180
  when 'delete'
174
- _process_delete(client_id,key,value,dels)
181
+ _process_delete(client,key,value,dels)
175
182
  end
176
183
  rescue Exception => e
177
184
  log "SourceAdapter raised #{operation} exception: #{e}"
185
+ log e.backtrace.join("\n")
178
186
  errors ||= {}
179
187
  errors[key] = value
180
188
  errors["#{key}-error"] = {'message'=>e.message}
@@ -1,3 +1,3 @@
1
1
  module Rhosync
2
- VERSION = '2.1.7'
2
+ VERSION = '2.1.10'
3
3
  end
@@ -1,18 +1,37 @@
1
1
  require File.join(File.dirname(__FILE__),'api_helper')
2
2
 
3
3
  describe "RhosyncApiDeleteUser" do
4
- it_should_behave_like "ApiHelper"
4
+ it_should_behave_like "ApiHelper"
5
5
 
6
6
  it "should delete user" do
7
7
  params = {:api_token => @api_token,
8
- :attributes => {:login => 'testuser1', :password => 'testpass1'}}
9
- post "/api/create_user", params
10
- last_response.should be_ok
11
- User.is_exist?(params[:attributes][:login]).should == true
12
- post "/api/delete_user", {:api_token => @api_token,
13
- :user_id => params[:attributes][:login]}
14
- last_response.should be_ok
15
- User.is_exist?(params[:attributes][:login]).should == false
16
- App.load(@test_app_name).users.members.should == ["testuser"]
8
+ :attributes => {:login => 'testuser1', :password => 'testpass1'}}
9
+ post "/api/create_user", params
10
+ last_response.should be_ok
11
+ User.is_exist?(params[:attributes][:login]).should == true
12
+
13
+ #set up two users with data for the same source
14
+ params2 = {:app_id => APP_NAME,:user_id => 'testuser1'}
15
+ params3 = {:app_id => APP_NAME,:user_id => 'testuser'}
16
+ s = Source.load('SampleAdapter', params2)
17
+ s2 = Source.load('SampleAdapter', params3)
18
+ time = Time.now.to_i
19
+ s.read_state.refresh_time = time
20
+ s2.read_state.refresh_time = time
21
+ set_state(s.docname(:delete) => {'4'=>@product4})
22
+ set_state(s2.docname(:delete) => {'4'=>@product4})
23
+ verify_result(s.docname(:delete) => {'4'=>@product4})
24
+ verify_result(s2.docname(:delete) => {'4'=>@product4})
25
+
26
+
27
+ post "/api/delete_user", {:api_token => @api_token, :user_id => params[:attributes][:login]}
28
+ last_response.should be_ok
29
+ verify_result(s.docname(:delete) => {})
30
+ verify_result(s2.docname(:delete) => {'4'=>@product4})
31
+ s.load_read_state.should == nil
32
+ s2.load_read_state.refresh_time.should == time
33
+ User.is_exist?(params[:attributes][:login]).should == false
34
+ App.load(APP_NAME).users.members.should == ["testuser"]
35
+
17
36
  end
18
37
  end
@@ -68,6 +68,9 @@ describe "ClientSync" do
68
68
  end
69
69
 
70
70
  it "should handle update errors" do
71
+ broken_object = { ERROR => { 'price' => '99.99' } }
72
+ set_state(@c.docname(:cd) => broken_object)
73
+ set_test_data('test_db_storage',broken_object)
71
74
  receive_and_send_cud('update')
72
75
  end
73
76
 
@@ -97,10 +100,19 @@ describe "ClientSync" do
97
100
  def receive_and_send_cud(operation)
98
101
  msg = "Error #{operation} record"
99
102
  op_data = {operation=>{ERROR=>{'an_attribute'=>msg,'name'=>'wrongname'}}}
100
- @cs.receive_cud(op_data)
101
- @cs.send_cud.should == [{"version"=>ClientSync::VERSION},
102
- {"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
103
- {"#{operation}-error"=>{"#{ERROR}-error"=>{"message"=>msg},ERROR=>op_data[operation][ERROR]}}]
103
+ @cs.receive_cud(op_data)
104
+ if operation == 'update'
105
+ @cs.send_cud.should == [{"version"=>ClientSync::VERSION},
106
+ {"token"=>""}, {"count"=>0}, {"progress_count"=>1}, {"total_count"=>1},
107
+ {
108
+ "update-rollback"=>{"0_broken_object_id"=>{"price"=>"99.99"}},
109
+ "#{operation}-error"=>{"#{ERROR}-error"=>{"message"=>msg},ERROR=>op_data[operation][ERROR]}
110
+ }]
111
+ else
112
+ @cs.send_cud.should == [{"version"=>ClientSync::VERSION},
113
+ {"token"=>""}, {"count"=>0}, {"progress_count"=>0}, {"total_count"=>0},
114
+ {"#{operation}-error"=>{"#{ERROR}-error"=>{"message"=>msg},ERROR=>op_data[operation][ERROR]}}]
115
+ end
104
116
  end
105
117
  end
106
118
 
data/spec/doc/doc_spec.rb CHANGED
@@ -173,6 +173,11 @@ eol
173
173
 
174
174
  ['create','update','delete'].each do |operation|
175
175
  it "client #{operation} object(s) with error" do
176
+ if operation == 'update'
177
+ broken_object = { ERROR => { 'price' => '99.99' } }
178
+ set_state(@c.docname(:cd) => broken_object)
179
+ set_test_data('test_db_storage',broken_object)
180
+ end
176
181
  params = {operation=>{ERROR=>{'an_attribute'=>"error #{operation}",'name'=>'wrongname'}},
177
182
  :client_id => @c.id,
178
183
  :source_name => @s.name}
@@ -8,28 +8,56 @@ describe "Ping Android" do
8
8
  @params = {"device_pin" => @c.device_pin,
9
9
  "sources" => [@s.name], "message" => 'hello world',
10
10
  "vibrate" => '5', "badge" => '5', "sound" => 'hello.mp3'}
11
- post = mock('post')
12
- post.stub!(:new).and_return(post)
13
- post.stub!(:set_form_data)
14
- Net::HTTP::Post.stub!(:new).and_return(post)
15
-
16
- @http = mock('http')
17
- @http.stub!(:request)
18
- @http.stub!(:use_ssl=)
19
- @http.stub!(:verify_mode=)
20
- @http.stub!(:start).and_yield(@http)
21
- Net::HTTP.stub!(:new).and_return(@http)
11
+ @response = mock('response')
22
12
  end
23
13
 
24
- it "should ping android" do
25
- Android.ping(@params)
14
+ it "should ping android successfully" do
15
+ result = 'id=0:34234234134254%abc123\n'
16
+ @response.stub!(:code).and_return(200)
17
+ @response.stub!(:body).and_return(result)
18
+ @response.stub!(:[]).and_return(false)
19
+ @response.stub!(:return!).and_return(@response)
20
+ RestClient.stub!(:post).and_yield(@response)
21
+ Android.ping(@params).body.should == result
26
22
  end
27
23
 
28
- it "should ping android with connection error" do
24
+ it "should ping android with 503 connection error" do
29
25
  error = 'Connection refused'
30
- @http.stub!(:request).and_return { raise SocketError.new(error) }
31
- Android.should_receive(:log).once.with("Error while sending ping: #{error}")
32
- lambda { Android.ping(@params) }.should raise_error(SocketError,error)
26
+ @response.stub!(:body).and_return(error)
27
+ RestClient.stub!(:post).and_return { raise RestClient::Exception.new(@response,503) }
28
+ Android.should_receive(:log).twice
29
+ lambda { Android.ping(@params) }.should raise_error(RestClient::Exception)
30
+ end
31
+
32
+ it "should ping android with 200 error message" do
33
+ error = 'Error=QuotaExceeded'
34
+ @response.stub!(:code).and_return(200)
35
+ @response.stub!(:body).and_return(error)
36
+ @response.stub!(:[]).and_return(nil)
37
+ RestClient.stub!(:post).and_yield(@response)
38
+ Android.should_receive(:log).twice
39
+ lambda { Android.ping(@params) }.should raise_error(Android::AndroidPingError, "Android ping error: QuotaExceeded")
40
+ end
41
+
42
+ it "should ping android with stale auth token" do
43
+ @response.stub!(:code).and_return(200)
44
+ @response.stub!(:body).and_return('')
45
+ @response.stub!(:[]).and_return({:update_client_auth => 'abc123'})
46
+ RestClient.stub!(:post).and_yield(@response)
47
+ Android.should_receive(:log).twice
48
+ lambda { Android.ping(@params) }.should raise_error(
49
+ Android::StaleAuthToken, "Stale auth token, please update :authtoken: in settings.yml."
50
+ )
51
+ end
52
+
53
+ it "should ping android with 401 error message" do
54
+ @response.stub!(:code).and_return(401)
55
+ @response.stub!(:body).and_return('')
56
+ RestClient.stub!(:post).and_yield(@response)
57
+ Android.should_receive(:log).twice
58
+ lambda { Android.ping(@params) }.should raise_error(
59
+ Android::InvalidAuthToken, "Invalid auth token, please update :authtoken: in settings.yml."
60
+ )
33
61
  end
34
62
 
35
63
  it "should compute c2d_message" do
@@ -22,4 +22,13 @@ describe "ReadState" do
22
22
  ReadState.delete(@a_fields[:name])
23
23
  Store.db.keys("read_state*").should == []
24
24
  end
25
+
26
+ it "should delete read_state from source" do
27
+ time = Time.now.to_i
28
+ @s.read_state.refresh_time = time
29
+ @s.load_read_state.refresh_time.should == time
30
+
31
+ @s.delete_user_read_state
32
+ @s.load_read_state.should == nil
33
+ end
25
34
  end
@@ -145,11 +145,15 @@ describe "SourceSync" do
145
145
  it "should do update with errors" do
146
146
  msg = "Error updating record"
147
147
  data = add_error_object({'4'=> { 'price' => '199.99' }},msg)
148
- set_state(@c.docname(:update) => data)
148
+ set_state(@c.docname(:update) => data,
149
+ @c.docname(:cd) => { ERROR => { 'price' => '99.99' } }
150
+ )
149
151
  @ss.update(@c.id)
150
- verify_result(@c.docname(:update_errors) =>
151
- {"#{ERROR}-error"=>{"message"=>msg}, ERROR=>data[ERROR]},
152
- @c.docname(:update) => {'4'=> { 'price' => '199.99'}})
152
+ verify_result(
153
+ @c.docname(:update_errors) =>
154
+ {"#{ERROR}-error"=>{"message"=>msg}, ERROR=>data[ERROR]},
155
+ @c.docname(:update) => {'4'=> { 'price' => '199.99'}},
156
+ @c.docname(:update_rollback) => {ERROR=>{"price"=>"99.99"}})
153
157
  end
154
158
  end
155
159
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rhosync
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 2
8
8
  - 1
9
- - 7
10
- version: 2.1.7
9
+ - 10
10
+ version: 2.1.10
11
11
  platform: ruby
12
12
  authors:
13
13
  - Rhomobile
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-27 00:00:00 Z
18
+ date: 2011-08-23 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: json
@@ -168,12 +168,12 @@ dependencies:
168
168
  requirements:
169
169
  - - ~>
170
170
  - !ruby/object:Gem::Version
171
- hash: 49
171
+ hash: 63
172
172
  segments:
173
173
  - 0
174
- - 8
175
- - 7
176
- version: 0.8.7
174
+ - 9
175
+ - 2
176
+ version: 0.9.2
177
177
  type: :runtime
178
178
  version_requirements: *id010
179
179
  - !ruby/object:Gem::Dependency
@@ -540,9 +540,6 @@ files:
540
540
  - spec/testdata/upload2.txt
541
541
  - spec/user_spec.rb
542
542
  - tasks/redis.rake
543
- - examples/simple/application.rb
544
- - examples/simple/sources/sample_adapter.rb
545
- - examples/simple/sources/simple_adapter.rb
546
543
  homepage: http://rhomobile.com/products/rhosync
547
544
  licenses: []
548
545
 
@@ -572,77 +569,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
572
569
  requirements: []
573
570
 
574
571
  rubyforge_project:
575
- rubygems_version: 1.8.5
572
+ rubygems_version: 1.8.7
576
573
  signing_key:
577
574
  specification_version: 3
578
575
  summary: RhoSync Synchronization Framework
579
- test_files:
580
- - examples/simple/application.rb
581
- - examples/simple/sources/sample_adapter.rb
582
- - examples/simple/sources/simple_adapter.rb
583
- - spec/api/api_helper.rb
584
- - spec/api/create_client_spec.rb
585
- - spec/api/create_user_spec.rb
586
- - spec/api/delete_client_spec.rb
587
- - spec/api/delete_user_spec.rb
588
- - spec/api/get_api_token_spec.rb
589
- - spec/api/get_client_params_spec.rb
590
- - spec/api/get_db_doc_spec.rb
591
- - spec/api/get_license_info_spec.rb
592
- - spec/api/get_source_params_spec.rb
593
- - spec/api/list_client_docs_spec.rb
594
- - spec/api/list_clients_spec.rb
595
- - spec/api/list_source_docs_spec.rb
596
- - spec/api/list_sources_spec.rb
597
- - spec/api/list_users_spec.rb
598
- - spec/api/ping_spec.rb
599
- - spec/api/push_deletes_spec.rb
600
- - spec/api/push_objects_spec.rb
601
- - spec/api/reset_spec.rb
602
- - spec/api/rhosync_api_spec.rb
603
- - spec/api/set_db_doc_spec.rb
604
- - spec/api/set_refresh_time_spec.rb
605
- - spec/api/stats_spec.rb
606
- - spec/api/update_user_spec.rb
607
- - spec/api/upload_file_spec.rb
608
- - spec/api_token_spec.rb
609
- - spec/app_spec.rb
610
- - spec/apps/rhotestapp/application.rb
611
- - spec/apps/rhotestapp/sources/base_adapter.rb
612
- - spec/apps/rhotestapp/sources/fixed_schema_adapter.rb
613
- - spec/apps/rhotestapp/sources/sample_adapter.rb
614
- - spec/apps/rhotestapp/sources/simple_adapter.rb
615
- - spec/apps/rhotestapp/sources/sub_adapter.rb
616
- - spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem.rb
617
- - spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem/mygem.rb
618
- - spec/bulk_data/bulk_data_spec.rb
619
- - spec/client_spec.rb
620
- - spec/client_sync_spec.rb
621
- - spec/doc/doc_spec.rb
622
- - spec/document_spec.rb
623
- - spec/generator/generator_spec.rb
624
- - spec/generator/generator_spec_helper.rb
625
- - spec/jobs/bulk_data_job_spec.rb
626
- - spec/jobs/ping_job_spec.rb
627
- - spec/jobs/source_job_spec.rb
628
- - spec/license_spec.rb
629
- - spec/model_spec.rb
630
- - spec/perf/bulk_data_perf_spec.rb
631
- - spec/perf/perf_spec_helper.rb
632
- - spec/perf/store_perf_spec.rb
633
- - spec/ping/android_spec.rb
634
- - spec/ping/apple_spec.rb
635
- - spec/ping/blackberry_spec.rb
636
- - spec/read_state_spec.rb
637
- - spec/rhosync_spec.rb
638
- - spec/server/server_spec.rb
639
- - spec/source_adapter_spec.rb
640
- - spec/source_spec.rb
641
- - spec/source_sync_spec.rb
642
- - spec/spec_helper.rb
643
- - spec/stats/middleware_spec.rb
644
- - spec/stats/record_spec.rb
645
- - spec/store_spec.rb
646
- - spec/sync_states_spec.rb
647
- - spec/test_methods_spec.rb
648
- - spec/user_spec.rb
576
+ test_files: []
577
+
@@ -1,27 +0,0 @@
1
- class Application < Rhosync::Base
2
- class << self
3
- def authenticate(username,password,session)
4
- true # do some interesting authentication here...
5
- end
6
-
7
- # Add hooks for application startup here
8
- # Don't forget to call super at the end!
9
- def initializer(path)
10
- super
11
- end
12
-
13
- # Calling super here returns rack tempfile path:
14
- # i.e. /var/folders/J4/J4wGJ-r6H7S313GEZ-Xx5E+++TI
15
- # Note: This tempfile is removed when server stops or crashes...
16
- # See http://rack.rubyforge.org/doc/Multipart.html for more info
17
- #
18
- # Override this by creating a copy of the file somewhere
19
- # and returning the path to that file (then don't call super!):
20
- # i.e. /mnt/myimages/soccer.png
21
- def store_blob(obj,field_name,blob)
22
- super #=> returns blob[:tempfile]
23
- end
24
- end
25
- end
26
-
27
- Application.initializer(ROOT_PATH)
@@ -1,5 +0,0 @@
1
- class SimpleAdapter < SourceAdapter
2
- def initialize(source,credential)
3
- super(source,credential)
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class SimpleAdapter < SourceAdapter
2
- def initialize(source,credential)
3
- super(source,credential)
4
- end
5
- end