Floppy-amee 0.1.2 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README +8 -1
- data/examples/view_data_item.rb +1 -1
- data/lib/amee/connection.rb +9 -4
- data/lib/amee/data_category.rb +54 -23
- data/lib/amee/data_item.rb +10 -0
- data/lib/amee/profile.rb +37 -17
- data/lib/amee/shell.rb +1 -1
- data/lib/amee/version.rb +10 -0
- data/lib/amee.rb +9 -11
- metadata +7 -6
data/README
CHANGED
@@ -22,9 +22,16 @@ Currently, you can read DataCategories, DataItems and DataItemValues. See
|
|
22
22
|
examples/view_data_*.rb for simple usage examples. You can also get the list
|
23
23
|
of available Profiles. See examples/list_profiles.rb for details.
|
24
24
|
|
25
|
+
The gem will use the AMEE JSON API if the JSON gem is installed on the local
|
26
|
+
system. Otherwise the XML API will be used. Currently, only DataCategories and
|
27
|
+
Profile lists are supported with JSON, so you can disable JSON support by setting
|
28
|
+
the fourth argument to AMEE::Connection.new() to false:
|
29
|
+
|
30
|
+
> AMEE::Connection.new($srv, $user, $pass, false) # last arg disables JSON support
|
31
|
+
|
25
32
|
== INTERACTIVE SHELL
|
26
33
|
|
27
34
|
You can use the 'ameesh' app to interactively explore the AMEE data area. Run
|
28
35
|
'ameesh -u USERNAME -p PASSWORD -s SERVER' to try it out. Source code for this
|
29
36
|
tool is in bin/ameesh and lib/amee/shell.rb. Profiles are not accessible through
|
30
|
-
this interface yet.
|
37
|
+
this interface yet.
|
data/examples/view_data_item.rb
CHANGED
@@ -17,7 +17,7 @@ OptionParser.new do |opts|
|
|
17
17
|
end.parse!
|
18
18
|
|
19
19
|
# Connect
|
20
|
-
connection = AMEE::Connection.new(options[:server], options[:username], options[:password])
|
20
|
+
connection = AMEE::Connection.new(options[:server], options[:username], options[:password], false) # Disable JSON support for now
|
21
21
|
|
22
22
|
# For each path in arg list, show details
|
23
23
|
ARGV.each do |path|
|
data/lib/amee/connection.rb
CHANGED
@@ -2,12 +2,13 @@ require 'net/http'
|
|
2
2
|
|
3
3
|
module AMEE
|
4
4
|
class Connection
|
5
|
-
|
6
|
-
def initialize(server, username = nil, password = nil)
|
5
|
+
|
6
|
+
def initialize(server, username = nil, password = nil, use_json_if_available = true)
|
7
7
|
@server = server
|
8
8
|
@username = username
|
9
9
|
@password = password
|
10
10
|
@auth_token = nil
|
11
|
+
@use_json_if_available = use_json_if_available
|
11
12
|
raise "Must specify both username and password for authenticated access" if (@username || @password) && !valid?
|
12
13
|
# Make connection to server
|
13
14
|
@http = Net::HTTP.new(@server)
|
@@ -37,7 +38,7 @@ module AMEE
|
|
37
38
|
response = nil
|
38
39
|
get = Net::HTTP::Get.new(path)
|
39
40
|
get['authToken'] = @auth_token
|
40
|
-
get['Accept'] =
|
41
|
+
get['Accept'] = content_type
|
41
42
|
response = @http.request(get)
|
42
43
|
# Handle 404s
|
43
44
|
raise AMEE::NotFound.new("URL doesn't exist on server.") if response.code == '404'
|
@@ -53,6 +54,10 @@ module AMEE
|
|
53
54
|
|
54
55
|
protected
|
55
56
|
|
57
|
+
def content_type
|
58
|
+
(@use_json_if_available && defined?(JSON)) ? 'application/json' : 'application/xml'
|
59
|
+
end
|
60
|
+
|
56
61
|
def authentication_failed?(response)
|
57
62
|
response.code == '401'
|
58
63
|
end
|
@@ -64,7 +69,7 @@ module AMEE
|
|
64
69
|
response = nil
|
65
70
|
post = Net::HTTP::Post.new("/auth")
|
66
71
|
post.body = "username=#{@username}&password=#{@password}"
|
67
|
-
post['Accept'] =
|
72
|
+
post['Accept'] = content_type
|
68
73
|
response = @http.request(post)
|
69
74
|
@auth_token = response['authToken']
|
70
75
|
raise AMEE::AuthFailed.new("Authentication failed. Please check your username and password.") unless authenticated?
|
data/lib/amee/data_category.rb
CHANGED
@@ -16,29 +16,60 @@ module AMEE
|
|
16
16
|
def self.get(connection, path)
|
17
17
|
# Load data from path
|
18
18
|
response = connection.get(path)
|
19
|
-
# Parse data from response
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
19
|
+
# Parse data from response
|
20
|
+
profiles = []
|
21
|
+
if response.slice(0,1) == '{'
|
22
|
+
# Read JSON
|
23
|
+
doc = JSON.parse(response)
|
24
|
+
data = {}
|
25
|
+
data[:uid] = doc['dataCategory']['uid']
|
26
|
+
data[:created] = DateTime.parse(doc['dataCategory']['created'])
|
27
|
+
data[:modified] = DateTime.parse(doc['dataCategory']['modified'])
|
28
|
+
data[:name] = doc['dataCategory']['name']
|
29
|
+
data[:path] = doc['path']
|
30
|
+
data[:children] = []
|
31
|
+
doc['children']['dataCategories'].each do |child|
|
32
|
+
category_data = {}
|
33
|
+
category_data[:name] = child['name']
|
34
|
+
category_data[:path] = child['path']
|
35
|
+
category_data[:uid] = child['uid']
|
36
|
+
data[:children] << category_data
|
37
|
+
end
|
38
|
+
data[:items] = []
|
39
|
+
if doc['children']['dataItems']['rows']
|
40
|
+
doc['children']['dataItems']['rows'].each do |item|
|
41
|
+
item_data = {}
|
42
|
+
item_data[:label] = item['label']
|
43
|
+
item_data[:path] = item['path']
|
44
|
+
item_data[:uid] = item['uid']
|
45
|
+
data[:items] << item_data
|
46
|
+
end
|
47
|
+
end
|
48
|
+
else
|
49
|
+
# Read XML
|
50
|
+
doc = REXML::Document.new(response)
|
51
|
+
data = {}
|
52
|
+
data[:uid] = REXML::XPath.first(doc, "/Resources/DataCategoryResource/DataCategory/@uid").to_s
|
53
|
+
data[:created] = DateTime.parse(REXML::XPath.first(doc, "/Resources/DataCategoryResource/DataCategory/@created").to_s)
|
54
|
+
data[:modified] = DateTime.parse(REXML::XPath.first(doc, "/Resources/DataCategoryResource/DataCategory/@modified").to_s)
|
55
|
+
data[:name] = REXML::XPath.first(doc, '/Resources/DataCategoryResource/DataCategory/Name').text
|
56
|
+
data[:path] = REXML::XPath.first(doc, '/Resources/DataCategoryResource/Path').text || ""
|
57
|
+
data[:children] = []
|
58
|
+
REXML::XPath.each(doc, '/Resources/DataCategoryResource/Children/DataCategories/DataCategory') do |child|
|
59
|
+
category_data = {}
|
60
|
+
category_data[:name] = child.elements['Name'].text
|
61
|
+
category_data[:path] = child.elements['Path'].text
|
62
|
+
category_data[:uid] = child.attributes['uid'].to_s
|
63
|
+
data[:children] << category_data
|
64
|
+
end
|
65
|
+
data[:items] = []
|
66
|
+
REXML::XPath.each(doc, '/Resources/DataCategoryResource/Children/DataItems/DataItem') do |item|
|
67
|
+
item_data = {}
|
68
|
+
item_data[:label] = item.elements['label'].text
|
69
|
+
item_data[:path] = item.elements['path'].text
|
70
|
+
item_data[:uid] = item.attributes['uid'].to_s
|
71
|
+
data[:items] << item_data
|
72
|
+
end
|
42
73
|
end
|
43
74
|
# Create category object
|
44
75
|
cat = Category.new(data)
|
data/lib/amee/data_item.rb
CHANGED
@@ -4,11 +4,13 @@ module AMEE
|
|
4
4
|
|
5
5
|
def initialize(data = {})
|
6
6
|
@values = data ? data[:values] : []
|
7
|
+
@choices = data ? data[:choices] : []
|
7
8
|
@label = data ? data[:label] : []
|
8
9
|
super
|
9
10
|
end
|
10
11
|
|
11
12
|
attr_reader :values
|
13
|
+
attr_reader :choices
|
12
14
|
attr_reader :label
|
13
15
|
|
14
16
|
def self.get(connection, path)
|
@@ -33,6 +35,14 @@ module AMEE
|
|
33
35
|
value_data[:uid] = value.attributes['uid'].to_s
|
34
36
|
data[:values] << value_data
|
35
37
|
end
|
38
|
+
# Get choices
|
39
|
+
data[:choices] = []
|
40
|
+
REXML::XPath.each(doc, '/Resources/DataItemResource/Choices/Choices/Choice') do |choice|
|
41
|
+
choice_data = {}
|
42
|
+
choice_data[:name] = choice.elements['Name'].text
|
43
|
+
choice_data[:value] = choice.elements['Value'].text
|
44
|
+
data[:choices] << choice_data
|
45
|
+
end
|
36
46
|
# Create item object
|
37
47
|
item = Item.new(data)
|
38
48
|
# Store connection in object for future use
|
data/lib/amee/profile.rb
CHANGED
@@ -3,27 +3,47 @@ module AMEE
|
|
3
3
|
|
4
4
|
def self.list(connection)
|
5
5
|
# Load data from path
|
6
|
-
response = connection.get('/profiles')
|
7
|
-
# Parse data from response
|
8
|
-
doc = REXML::Document.new(response)
|
6
|
+
response = connection.get('/profiles')
|
7
|
+
# Parse data from response
|
9
8
|
profiles = []
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
9
|
+
if response.slice(0,1) == '{'
|
10
|
+
# Read JSON
|
11
|
+
doc = JSON.parse(response)
|
12
|
+
doc['profiles'].each do |p|
|
13
|
+
data = {}
|
14
|
+
data[:uid] = p['uid']
|
15
|
+
data[:created] = DateTime.parse(p['created'])
|
16
|
+
data[:modified] = DateTime.parse(p['modified'])
|
17
|
+
data[:name] = p['name']
|
18
|
+
data[:path] = p['path']
|
19
|
+
# Create profile
|
20
|
+
profile = AMEE::Profile.new(data)
|
21
|
+
# Store connection in object for future use
|
22
|
+
profile.connection = connection
|
23
|
+
# Store in array
|
24
|
+
profiles << profile
|
25
|
+
end
|
26
|
+
else
|
27
|
+
# Read XML
|
28
|
+
doc = REXML::Document.new(response)
|
29
|
+
REXML::XPath.each(doc, '/Resources/ProfilesResource/Profiles/Profile') do |p|
|
30
|
+
data = {}
|
31
|
+
data[:uid] = p.attributes['uid'].to_s
|
32
|
+
data[:created] = DateTime.parse(p.attributes['created'].to_s)
|
33
|
+
data[:modified] = DateTime.parse(p.attributes['modified'].to_s)
|
34
|
+
data[:name] = p.elements['Name'].text || data[:uid]
|
35
|
+
data[:path] = p.elements['Path'].text || data[:uid]
|
36
|
+
# Create profile
|
37
|
+
profile = AMEE::Profile.new(data)
|
38
|
+
# Store connection in object for future use
|
39
|
+
profile.connection = connection
|
40
|
+
# Store in array
|
41
|
+
profiles << profile
|
42
|
+
end
|
23
43
|
end
|
24
44
|
# Done
|
25
45
|
return profiles
|
26
46
|
end
|
27
|
-
|
47
|
+
|
28
48
|
end
|
29
49
|
end
|
data/lib/amee/shell.rb
CHANGED
@@ -60,7 +60,7 @@ require 'amee'
|
|
60
60
|
include AMEE::Shell
|
61
61
|
|
62
62
|
# Set up connection
|
63
|
-
$connection = AMEE::Connection.new(ENV['AMEE_SERVER'], ENV['AMEE_USERNAME'], ENV['AMEE_PASSWORD'])
|
63
|
+
$connection = AMEE::Connection.new(ENV['AMEE_SERVER'], ENV['AMEE_USERNAME'], ENV['AMEE_PASSWORD'], false) # Disable JSON support for now
|
64
64
|
|
65
65
|
if $connection.valid?
|
66
66
|
# Change to root of data api to get going
|
data/lib/amee/version.rb
ADDED
data/lib/amee.rb
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
require 'rexml/document'
|
2
|
+
|
3
|
+
# We don't NEED the JSON gem, but if it's available, use it.
|
4
|
+
begin
|
5
|
+
require 'json'
|
6
|
+
rescue LoadError
|
7
|
+
nil
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'amee/version'
|
2
11
|
require 'amee/exceptions'
|
3
12
|
require 'amee/connection'
|
4
13
|
require 'amee/object'
|
@@ -6,14 +15,3 @@ require 'amee/data_category'
|
|
6
15
|
require 'amee/data_item'
|
7
16
|
require 'amee/data_item_value'
|
8
17
|
require 'amee/profile'
|
9
|
-
|
10
|
-
module AMEE
|
11
|
-
|
12
|
-
module VERSION #:nodoc:
|
13
|
-
MAJOR = 0
|
14
|
-
MINOR = 1
|
15
|
-
TINY = 2
|
16
|
-
STRING = [MAJOR, MINOR, TINY].join('.')
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Floppy-amee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Smith
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-07-
|
12
|
+
date: 2008-07-29 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -24,16 +24,17 @@ extra_rdoc_files: []
|
|
24
24
|
files:
|
25
25
|
- README
|
26
26
|
- COPYING
|
27
|
-
- bin/ameesh
|
28
27
|
- lib/amee.rb
|
29
28
|
- lib/amee/connection.rb
|
30
|
-
- lib/amee/data_category.rb
|
31
29
|
- lib/amee/data_item.rb
|
32
|
-
- lib/amee/data_item_value.rb
|
33
30
|
- lib/amee/exceptions.rb
|
34
|
-
- lib/amee/object.rb
|
35
31
|
- lib/amee/profile.rb
|
32
|
+
- lib/amee/version.rb
|
33
|
+
- lib/amee/data_category.rb
|
34
|
+
- lib/amee/data_item_value.rb
|
35
|
+
- lib/amee/object.rb
|
36
36
|
- lib/amee/shell.rb
|
37
|
+
- bin/ameesh
|
37
38
|
- examples/list_profiles.rb
|
38
39
|
- examples/view_data_category.rb
|
39
40
|
- examples/view_data_item.rb
|