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 +1 -1
- data/directed-edge.gemspec +2 -2
- data/lib/directed_edge.rb +49 -39
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
data/directed-edge.gemspec
CHANGED
@@ -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.
|
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-
|
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
|
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
|
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
|
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.
|
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-
|
12
|
+
date: 2010-04-06 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|