directed-edge 0.1.1 → 0.1.2

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.
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