ECS 0.1.0 → 0.1.1

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.
Files changed (4) hide show
  1. data/CHANGELOG +8 -0
  2. data/lib/ecs.rb +24 -10
  3. data/test/unit/ecs_test.rb +42 -0
  4. metadata +2 -2
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ 0.1.1
2
+ * Forces ECS API version 2007-02-22
3
+ * Modified ECS.method_missing to understand methods like ECS.search_INDEX_by_PARAMETER
4
+ This means you can do ECS.search_DVD_by_Actor( 'Carrot Top' )
5
+ or ECS.search_Books_by_Title( 'Microserfs' )
6
+ * Added ECS.counter to track calls to the web service
7
+
8
+
1
9
  0.1.0
2
10
  * Initial release
3
11
  * Forces ECS API version 2007-01-17
data/lib/ecs.rb CHANGED
@@ -29,6 +29,7 @@ module ECS
29
29
  @@cache_directory = ''
30
30
  @@cache = true
31
31
  @@cache_suffix = 'ecs_cache'
32
+ @@counter = 0
32
33
 
33
34
  # libxml-ruby is not able to do XML::Document#find or XML::Node#find with xml returned from Amazon.
34
35
  # If you remove the namespace from the xml, it works perfectly
@@ -36,22 +37,23 @@ module ECS
36
37
 
37
38
  def self.method_missing( meth, *args )
38
39
  meth_s = meth.to_s
40
+ a = *args
39
41
  begin
40
42
  klass_name = meth_s.camel_case
41
43
  instance = nil
42
- if meth_s =~ /^(.*)_response_group$/
44
+ case meth_s
45
+ when /^(.*)_response_group$/
43
46
  instance = self.resolve_response_group_klass( klass_name )
47
+ when /^search_([^_]*)_by_([^_]*)$/
48
+ # Allow things like ECS.search_Books_by_Author( 'Marcus Aurelius' )
49
+ params = { :SearchIndex => $1 }.merge( a.is_a?( Hash ) ? a : { $2.to_sym => a } )
50
+ instance = self.item_search( params )
44
51
  else
45
52
  klass = self.resolve_operation_klass( klass_name )
46
-
47
- # string_to_eval = "#{klass_name}.new"
48
- # puts "Now going to #{string_to_eval}"
49
53
  instance = klass.new
50
- # instance = instance_eval( string_to_eval, __FILE__, __LINE__ )
51
- instance.parameters = *args
52
- instance.parameters = {} unless instance.parameters.is_a?( Hash )
54
+ instance.parameters = a.is_a?( Hash ) ? a : {}
53
55
 
54
- # If no ResponsGroup is set, then allow the defaults
56
+ # If no ResponseGroup is set, then allow the defaults
55
57
  unless instance.parameters[:ResponseGroup].nil?
56
58
  # Otherwise, be sure :Request is included
57
59
  instance.parameters[:ResponseGroup] = [instance.parameters[:ResponseGroup]] unless instance.parameters[:ResponseGroup].is_a?( Array )
@@ -63,8 +65,18 @@ module ECS
63
65
  raise NameError, "#{e.message}"#Are you sure that ECS::#{klass_name} is defined?"
64
66
  end
65
67
  end
66
-
67
-
68
+
69
+
70
+ def self.counter
71
+ @@counter
72
+ end
73
+ def self.reset_counter
74
+ @@counter = 0
75
+ end
76
+ def self.increment_counter
77
+ @@counter += 1
78
+ end
79
+
68
80
  def self.associate_id
69
81
  @@associate_id
70
82
  end
@@ -133,6 +145,7 @@ module ECS
133
145
  parameters.delete( :locale )
134
146
 
135
147
  sleep( ECS::TimeManagement.sleep_duration )
148
+ self.increment_counter
136
149
  url = "#{ self.base_urls[locale] }&AWSAccessKeyId=#{self.access_key_id}&Version=#{self.api_version}&AssociateTag=#{self.associate_id}&#{ parameters.keys.map{ |k| "#{ERB::Util.url_encode( k.to_s ) }=#{ERB::Util.url_encode( parameters[k].is_a?( Array ) ? parameters[k].join( ',' ) : parameters[k].to_s )}" }.join( '&' ) }"
137
150
  #puts url
138
151
  r = Net::HTTP.get_response( URI.parse( url ) )
@@ -240,6 +253,7 @@ module ECS
240
253
  def self.resolve_cache_tag( p={} )
241
254
  "#{cache_directory}/#{Digest::MD5.hexdigest( p.is_a?( String ) ? p : query_string( p ) )}.#{@@cache_suffix}"
242
255
  end
256
+
243
257
  end
244
258
 
245
259
  ##At this point I can do
@@ -230,6 +230,27 @@ class ECSTest < Test::Unit::TestCase
230
230
  assert_equal '', ECS.query_string( 'c=d&a=b' )
231
231
  end
232
232
 
233
+
234
+ def test_counter
235
+ initial_counter = ECS.counter
236
+ assert ECS.reset_counter
237
+ assert_equal 0, ECS.counter
238
+
239
+ (1..10).to_a.each do |i|
240
+ assert ECS.increment_counter
241
+ end
242
+ assert_equal 10, ECS.counter
243
+ assert ECS.reset_counter
244
+ assert_equal 0, ECS.counter
245
+
246
+ while ECS.counter < initial_counter do
247
+ ECS.increment_counter
248
+ end
249
+ assert_equal initial_counter, ECS.counter
250
+ end
251
+
252
+
253
+
233
254
  def test_call_web_service
234
255
  sleep 1 #make sure we don't need to sleep
235
256
  time_1 = time_2 = time_3 = nil
@@ -357,6 +378,27 @@ class ECSTest < Test::Unit::TestCase
357
378
  def test_api_version
358
379
  assert_equal '2007-02-22', ECS.api_version
359
380
  end
381
+
382
+
383
+ def test_index_type_search
384
+ search_results = ECS.search_Books_by_Author( 'Steven King' )
385
+
386
+ assert_equal 10, search_results.Item.size
387
+ assert_equal 0, search_results.errors.size
388
+ first_title = search_results.Item.first.ItemAttributes.Title.content
389
+
390
+ search_results = ECS.search_Books_by_Author( :Author => 'Steven King', :locale => :uk )
391
+
392
+ assert_equal 10, search_results.Item.size
393
+ assert_equal 0, search_results.errors.size
394
+ assert_not_equal first_title, search_results.Item.first.ItemAttributes.Title.content
395
+
396
+ search_results = ECS.search_DVD_by_Title( "James Bond" )
397
+ assert_equal 10, search_results.Item.size
398
+
399
+ search_results = ECS.search_Music_by_Artist( "U2" )
400
+ assert_equal 10, search_results.Item.size
401
+ end
360
402
  end
361
403
 
362
404
 
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: ECS
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.0
7
- date: 2007-03-08 00:00:00 -08:00
6
+ version: 0.1.1
7
+ date: 2007-03-12 00:00:00 -07:00
8
8
  summary: A Ruby interface to Amazon's E-Commerce Service.
9
9
  require_paths:
10
10
  - lib