directed-edge 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{directed-edge}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Directed Edge"]
12
- s.date = %q{2010-03-29}
12
+ s.date = %q{2010-04-06}
13
13
  s.description = %q{Bindings for the Directed Edge webservices API}
14
14
  s.email = %q{info@directededge.com}
15
15
  s.extra_rdoc_files = [
data/lib/directed_edge.rb CHANGED
@@ -26,40 +26,6 @@ require 'rest_client'
26
26
  require 'rexml/document'
27
27
  require 'cgi'
28
28
 
29
- class Hash
30
-
31
- # An extension to normalize tokens and strings of the form foo_bar to strings
32
- # of fooBar as expected by the REST API.
33
-
34
- def normalize!
35
- each do |key, value|
36
- if !key.is_a?(String)
37
- delete(key)
38
- key = key.to_s
39
- store(key, value.to_s)
40
- end
41
- if key.match(/_\w/)
42
- delete(key)
43
- store(key.gsub(/_\w/) { |s| s[1, 1].upcase }, value.to_s)
44
- elsif !value.is_a?(String)
45
- store(key, value.to_s)
46
- end
47
- end
48
- self
49
- end
50
-
51
- def []=(key, value)
52
- store(key, value)
53
- @insert_order = [] if @insert_order.nil?
54
- @insert_order.delete(key) if @insert_order.include?(key)
55
- @insert_order.push(key)
56
- end
57
-
58
- def insert_order_each
59
- @insert_order.each { |key| yield key, fetch(key) } unless @insert_order.nil?
60
- end
61
- end
62
-
63
29
  # The DirectedEdge module contains three classes:
64
30
  #
65
31
  # - Database - encapsulation of connection a database hosted by Directed Edge.
@@ -68,11 +34,34 @@ end
68
34
 
69
35
  module DirectedEdge
70
36
 
37
+ # A hash subclass that tracks the insert order, which is useful when returning
38
+ # a set of results that include full properties.
39
+
40
+ class InsertOrderHash < Hash
41
+
42
+ # Overridden assignment to track insert order
43
+
44
+ def []=(key, value)
45
+ store(key, value)
46
+ @insert_order = [] if @insert_order.nil?
47
+ @insert_order.delete(key) if @insert_order.include?(key)
48
+ @insert_order.push(key)
49
+ end
50
+
51
+ # Provides an iterator that uses the hash's insert order
52
+
53
+ def insert_order_each
54
+ @insert_order.each { |key| yield key, fetch(key) } unless @insert_order.nil?
55
+ end
56
+ end
57
+
71
58
  # Base class used for Database and Item that has some basic resource
72
59
  # grabbing functionality.
73
60
 
74
61
  class Resource
75
62
 
63
+ private
64
+
76
65
  # Reads an item from the database and puts it into an XML document.
77
66
 
78
67
  def read_document(method='', params={})
@@ -95,7 +84,7 @@ module DirectedEdge
95
84
  # 'item1' => { 'foo' => 'bar' }
96
85
 
97
86
  def property_hash_from_document(document, element)
98
- values = {}
87
+ values = InsertOrderHash.new
99
88
  document.elements.each("//#{element}") do |e|
100
89
  values[e.text] = {}
101
90
  e.attributes.each_attribute { |a| values[e.text][a.name] = a.value }
@@ -122,6 +111,27 @@ module DirectedEdge
122
111
  end
123
112
  values
124
113
  end
114
+
115
+ # Normalizes the parameters in an argument hash to a standard form
116
+ # so that they can be passed off to the web services API -- e.g.
117
+ # :foo_bar to 'fooBar'
118
+
119
+ def normalize_params(hash)
120
+ hash.each do |key, value|
121
+ if !key.is_a?(String)
122
+ hash.delete(key)
123
+ key = key.to_s
124
+ hash.store(key, value.to_s)
125
+ end
126
+ if key.match(/_\w/)
127
+ hash.delete(key)
128
+ hash.store(key.gsub(/_\w/) { |s| s[1, 1].upcase }, value.to_s)
129
+ elsif !value.is_a?(String)
130
+ hash.store(key, value.to_s)
131
+ end
132
+ end
133
+ hash
134
+ end
125
135
  end
126
136
 
127
137
  # A Database is an encapsulation of a database being accessed via the Directed
@@ -175,12 +185,12 @@ module DirectedEdge
175
185
 
176
186
  def group_related(items=Set.new, tags=Set.new, params={})
177
187
  if !items.is_a?(Array) || items.size < 1
178
- return (params['includeProperties'] == 'true') ? {} : []
188
+ return (params['includeProperties'] == 'true') ? InsertOrderHash.new : []
179
189
  end
180
190
  params['items'] = items.to_a.join(',')
181
191
  params['tags'] = tags.to_a.join(',')
182
192
  params['union'] = true
183
- params.normalize!
193
+ params = normalize_params(params)
184
194
  if params['includeProperties'] == 'true'
185
195
  property_hash_from_document(read_document('related', params), 'related')
186
196
  else
@@ -538,7 +548,7 @@ module DirectedEdge
538
548
  # This will not reflect any unsaved changes to items.
539
549
 
540
550
  def related(tags=Set.new, params={})
541
- params.normalize!
551
+ params = normalize_params(params)
542
552
  params['tags'] = tags.to_a.join(',')
543
553
  if params['includeProperties'] == 'true'
544
554
  property_hash_from_document(read_document('related', params), 'related')
@@ -559,7 +569,7 @@ module DirectedEdge
559
569
  # This will not reflect any unsaved changes to items.
560
570
 
561
571
  def recommended(tags=Set.new, params={})
562
- params.normalize!
572
+ params = normalize_params(params)
563
573
  params['tags'] = tags.to_a.join(',')
564
574
  params.key?('excludeLinked') || params['excludeLinked'] = 'true'
565
575
  if params['includeProperties'] == 'true'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: directed-edge
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Directed Edge
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-29 00:00:00 +02:00
12
+ date: 2010-04-06 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency