amee 2.7.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/{CHANGELOG → CHANGELOG.txt} +11 -0
  2. data/Gemfile.lock +37 -0
  3. data/LICENSE.txt +27 -0
  4. data/{README → README.txt} +6 -4
  5. data/Rakefile +84 -17
  6. data/VERSION +1 -1
  7. data/amee.gemspec +172 -0
  8. data/bin/ameesh +3 -0
  9. data/examples/create_profile.rb +3 -0
  10. data/examples/create_profile_item.rb +3 -0
  11. data/examples/list_profiles.rb +3 -0
  12. data/examples/view_data_category.rb +3 -0
  13. data/examples/view_data_item.rb +3 -0
  14. data/examples/view_profile_item.rb +3 -0
  15. data/init.rb +3 -0
  16. data/lib/amee/collection.rb +3 -0
  17. data/lib/amee/connection.rb +3 -0
  18. data/lib/amee/data_category.rb +3 -0
  19. data/lib/amee/data_item.rb +3 -0
  20. data/lib/amee/data_item_value.rb +3 -0
  21. data/lib/amee/data_item_value_history.rb +3 -0
  22. data/lib/amee/data_object.rb +3 -0
  23. data/lib/amee/drill_down.rb +3 -0
  24. data/lib/amee/exceptions.rb +3 -0
  25. data/lib/amee/item_definition.rb +3 -0
  26. data/lib/amee/item_value_definition.rb +3 -0
  27. data/lib/amee/logger.rb +3 -0
  28. data/lib/amee/object.rb +3 -0
  29. data/lib/amee/pager.rb +3 -0
  30. data/lib/amee/parse_helper.rb +3 -0
  31. data/lib/amee/profile.rb +3 -0
  32. data/lib/amee/profile_category.rb +3 -0
  33. data/lib/amee/profile_item.rb +3 -0
  34. data/lib/amee/profile_item_value.rb +3 -0
  35. data/lib/amee/profile_object.rb +3 -0
  36. data/lib/amee/rails.rb +3 -0
  37. data/lib/amee/shell.rb +3 -0
  38. data/lib/amee/user.rb +3 -0
  39. data/lib/amee/v3/collection.rb +61 -0
  40. data/lib/amee/v3/connection.rb +99 -0
  41. data/lib/amee/v3/item_definition.rb +73 -0
  42. data/lib/amee/v3/item_value_definition.rb +99 -0
  43. data/lib/amee/v3/item_value_definition_list.rb +53 -0
  44. data/lib/amee/v3/meta_helper.rb +28 -0
  45. data/lib/amee/v3/return_value_definition.rb +202 -0
  46. data/lib/amee/v3.rb +12 -0
  47. data/lib/amee.rb +4 -0
  48. data/rails/init.rb +3 -0
  49. data/spec/amee_spec.rb +3 -0
  50. data/spec/cache_spec.rb +3 -0
  51. data/spec/connection_spec.rb +3 -0
  52. data/spec/data_category_spec.rb +4 -1
  53. data/spec/data_item_spec.rb +3 -0
  54. data/spec/data_item_value_history_spec.rb +3 -0
  55. data/spec/data_item_value_spec.rb +3 -0
  56. data/spec/data_object_spec.rb +3 -0
  57. data/spec/drill_down_spec.rb +3 -0
  58. data/spec/fixtures/BD88D30D1214.xml +1 -0
  59. data/spec/fixtures/empty_return_value_definition_list.xml +6 -0
  60. data/spec/fixtures/itemdef.xml +20 -0
  61. data/spec/fixtures/itemdef_441BF4BEA15B.xml +14 -0
  62. data/spec/fixtures/itemdef_no_usages.xml +10 -0
  63. data/spec/fixtures/itemdef_one_usage.xml +14 -0
  64. data/spec/fixtures/ivdlist.xml +605 -0
  65. data/spec/fixtures/ivdlist_BD88D30D1214.xml +1 -0
  66. data/spec/fixtures/return_value_definition.xml +18 -0
  67. data/spec/fixtures/return_value_definition_list.xml +46 -0
  68. data/spec/item_definition_spec.rb +12 -9
  69. data/spec/item_value_definition_spec.rb +29 -19
  70. data/spec/logger_spec.rb +2 -2
  71. data/spec/object_spec.rb +3 -0
  72. data/spec/parse_helper_spec.rb +3 -0
  73. data/spec/profile_category_spec.rb +3 -0
  74. data/spec/profile_item_spec.rb +3 -0
  75. data/spec/profile_item_value_spec.rb +3 -0
  76. data/spec/profile_object_spec.rb +3 -0
  77. data/spec/profile_spec.rb +3 -0
  78. data/spec/rails_spec.rb +3 -0
  79. data/spec/spec_helper.rb +7 -0
  80. data/spec/user_spec.rb +3 -0
  81. data/spec/v3/connection_spec.rb +169 -0
  82. data/spec/v3/item_definition_spec.rb +328 -0
  83. data/spec/v3/item_value_definition_spec.rb +116 -0
  84. data/spec/v3/return_value_definition_spec.rb +90 -0
  85. metadata +38 -10
  86. data/COPYING +0 -19
@@ -0,0 +1,61 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ module AMEE
5
+ class Collection < Array
6
+
7
+ def v3
8
+ collectionpath=~/^\/3/
9
+ end
10
+
11
+ def fetch_with_v3
12
+ @options.merge! @pager.options if @pager
13
+ retries = [1] * connection.retries
14
+ begin
15
+ if @use_v3_connection == true
16
+ @response = @connection.v3_get(collectionpath, @options)
17
+ else
18
+ @response= @connection.get(collectionpath, @options).body
19
+ end
20
+ if @response.is_json?
21
+ @json = true
22
+ @doc = JSON.parse(@response)
23
+ else
24
+ @doc = load_xml_doc(@response)
25
+ end
26
+ rescue JSON::ParserError, Nokogiri::XML::SyntaxError
27
+ @connection.expire(collectionpath)
28
+ if delay = retries.shift
29
+ sleep delay
30
+ retry
31
+ else
32
+ raise
33
+ end
34
+ end
35
+ end
36
+ alias_method_chain :fetch, :v3
37
+
38
+ def each_page_with_v3
39
+ @pager=AMEE::Limiter.new(@options) if v3
40
+ # in v3 need to specify limit to start with, not in v2
41
+ begin
42
+ fetch
43
+ yield
44
+ if json
45
+ @pager = v3 ? AMEE::Limiter.from_json(doc,@pager.options.merge(@options)) : # json not built
46
+ AMEE::Pager.from_json(doc['pager'])
47
+ else
48
+ @pager = v3 ?
49
+ AMEE::Limiter.from_xml(doc.xpath('/Representation/*').first,
50
+ @pager.options.merge(@options)) :
51
+ AMEE::Pager.from_xml(doc.xpath('/Resources//Pager').first)
52
+ end
53
+ break if @max && length>=@max
54
+ end while @pager && @pager.next! #pager is nil if no pager in response,
55
+ # pager.next! is false if @pager said current=last.
56
+ end
57
+ alias_method_chain :each_page, :v3
58
+
59
+ end
60
+ end
61
+
@@ -0,0 +1,99 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ module AMEE
5
+ class Connection
6
+ def v3_connection
7
+ @v3_http ||= begin
8
+ @v3_http = Net::HTTP.new(v3_hostname, @port)
9
+ if @ssl == true
10
+ @v3_http.use_ssl = true
11
+ if File.exists? RootCA
12
+ @v3_http.ca_file = RootCA
13
+ @v3_http.verify_mode = OpenSSL::SSL::VERIFY_PEER
14
+ @v3_http.verify_depth = 5
15
+ end
16
+ end
17
+ @v3_http.set_debug_output($stdout) if @debug
18
+ @v3_http
19
+ end
20
+ end
21
+ def v3_get(path, options = {})
22
+ # Create URL parameters
23
+ unless options.empty?
24
+ path += "?" + options.map { |x| "#{CGI::escape(x[0].to_s)}=#{CGI::escape(x[1].to_s)}" }.join('&')
25
+ end
26
+ cache(path) { v3_request(Net::HTTP::Get.new(path)) }
27
+ end
28
+ def v3_put(path, options = {})
29
+ expire_matching "#{parent_path(path)}.*"
30
+ put = Net::HTTP::Put.new(path)
31
+ if options[:body]
32
+ put.body = options[:body]
33
+ put['Content-Type'] = content_type :xml if options[:body].is_xml?
34
+ put['Content-Type'] = content_type :json if options[:body].is_json?
35
+ else
36
+ put.set_form_data(options)
37
+ end
38
+ v3_request put
39
+ end
40
+ def v3_post(path, options = {})
41
+ expire_matching "#{raw_path(path)}.*"
42
+ post = Net::HTTP::Post.new(path)
43
+ returnobj=options.delete(:returnobj) || false
44
+ post.set_form_data(options)
45
+ v3_request post,returnobj
46
+ end
47
+ def v3_delete(path, options = {})
48
+ expire_matching "#{parent_path(path)}.*"
49
+ delete = Net::HTTP::Delete.new(path)
50
+ v3_request delete
51
+ end
52
+ def v3_auth
53
+ # now the same as v2, i.e.
54
+ [@username,@password]
55
+ end
56
+ private
57
+ def v3_hostname
58
+ unless @server.starts_with?("platform-api-")
59
+ if @server.starts_with?("platform-")
60
+ @server.gsub("platform-", "platform-api-")
61
+ else
62
+ "platform-api-#{@server}"
63
+ end
64
+ else
65
+ @server
66
+ end
67
+ end
68
+ def v3_request(req,returnobj=false)
69
+ # Open HTTP connection
70
+ v3_connection.start
71
+ # Set auth
72
+ req.basic_auth *v3_auth
73
+ # Do request
74
+ timethen=Time.now
75
+ response = send_request(v3_connection, req, :xml)
76
+ Logger.log.debug("Requested #{req.class} at #{req.path} with #{req.body}, taking #{(Time.now-timethen)*1000} miliseconds")
77
+ v3_response_ok? response, req
78
+ returnobj ? response : response.body
79
+ ensure
80
+ v3_connection.finish if v3_connection.started?
81
+ end
82
+
83
+ def v3_response_ok?(response, request)
84
+ case response.code
85
+ when '200', '201', '204'
86
+ return true
87
+ when '404'
88
+ raise AMEE::NotFound.new("The URL was not found on the server.\nRequest: #{request.method} #{request.path}")
89
+ when '403'
90
+ raise AMEE::PermissionDenied.new("You do not have permission to perform the requested operation.\nRequest: #{request.method} #{request.path}\n#{request.body}\Response: #{response.body}")
91
+ when '401'
92
+ raise AMEE::AuthFailed.new("Authentication failed. Please check your username and password.")
93
+ when '400'
94
+ raise AMEE::BadRequest.new("Bad request. This is probably due to malformed input data.\nRequest: #{request.method} #{request.path}\n#{request.body}\Response: #{response.body}")
95
+ end
96
+ raise AMEE::UnknownError.new("An error occurred while talking to AMEE: HTTP response code #{response.code}.\nRequest: #{request.method} #{request.path}\n#{request.body}\Response: #{response.body}")
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,73 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ module AMEE
5
+ module Admin
6
+ class ItemDefinition < AMEE::Object
7
+
8
+ include ParseHelper
9
+
10
+ def initialize_with_v3(data = {})
11
+ @usages = data[:usages] || []
12
+ initialize_without_v3(data)
13
+ end
14
+ alias_method_chain :initialize, :v3
15
+
16
+ attr_accessor :usages
17
+
18
+ def self.metaxmlpathpreamble
19
+ '/Representation/ItemDefinition/'
20
+ end
21
+
22
+ def self.load(connection,uid,options={})
23
+ ItemDefinition.v3_get(connection,uid,options)
24
+ end
25
+
26
+ def self.v3_get(connection, uid, options={})
27
+ # Load data from path
28
+ response = connection.v3_get("/#{AMEE_API_VERSION}/definitions/#{uid};full", options)
29
+ # Parse response
30
+ item_definition = ItemDefinition.parse(connection, response, false)
31
+ # Done
32
+ return item_definition
33
+ rescue
34
+ raise AMEE::BadData.new("Couldn't load ItemDefinition. Check that your URL is correct.\n#{$!}\n#{response}")
35
+ end
36
+
37
+ def self.from_xml_with_v3(xml, is_list = true)
38
+ return self.from_xml_without_v3(xml, is_list) if xml.include?('<Resources>')
39
+ # Parse data from response into hash
40
+ doc = load_xml_doc(xml)
41
+ data = {}
42
+ data[:uid] = x '@uid', :doc => doc, :meta => true
43
+ data[:created] = DateTime.parse(x '@created', :doc => doc, :meta => true)
44
+ data[:modified] = DateTime.parse(x '@modified', :doc => doc, :meta => true)
45
+ data[:name] = x 'Name', :doc => doc, :meta => true
46
+ data[:drillDown] = x('DrillDown', :doc => doc, :meta => true).split(",") rescue nil
47
+ data[:usages] = [(x 'Usages/Usage/Name', :doc => doc, :meta => true)].flatten.delete_if{|x| x.nil?}
48
+ # Create object
49
+ ItemDefinition.new(data)
50
+ rescue
51
+ raise AMEE::BadData.new("Couldn't load ItemDefinition from XML. Check that your URL is correct.\n#{$!}\n#{xml}")
52
+ end
53
+ class << self
54
+ alias_method_chain :from_xml, :v3
55
+ end
56
+
57
+ def save!
58
+ save_options = {
59
+ :usages => @usages.join(','),
60
+ :name => @name
61
+ }
62
+ @connection.v3_put("/#{AMEE_API_VERSION}/definitions/#{@uid}",save_options)
63
+ end
64
+
65
+ def expire_cache_with_v3
66
+ @connection.expire_matching("/#{AMEE_API_VERSION}/definitions/#{@uid}.*")
67
+ expire_cache_without_v3
68
+ end
69
+ alias_method_chain :expire_cache, :v3
70
+
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,99 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ module AMEE
5
+ module Admin
6
+ class ItemValueDefinition
7
+ include MetaHelper
8
+
9
+ def initialize_with_v3(data = {})
10
+ storemeta(data[:meta]) if data[:meta]
11
+ initialize_without_v3(data)
12
+ end
13
+ alias_method_chain :initialize, :v3
14
+
15
+ def metapath
16
+ "/#{AMEE_API_VERSION}/definitions/#{itemdefuid}/values/#{uid};wikiDoc;usages"
17
+ end
18
+ def metaxmlpathpreamble
19
+ '/Representation/ItemValueDefinition/'
20
+ end
21
+ def storemeta(options)
22
+ @meta=OpenStruct.new
23
+ @meta.wikidoc= options[:wikidoc]
24
+ @usages = options[:usages] || []
25
+ end
26
+ def parsemeta
27
+ data = {}
28
+ data[:wikidoc]=x 'WikiDoc', :meta => true
29
+ names = x('Usages/Usage/Name', :meta => true)
30
+ types = x('Usages/Usage/Type', :meta => true)
31
+ data[:usages] = names && types ? Hash[*(names.zip(types.map{|x| x.downcase.to_sym})).flatten] : {}
32
+ storemeta(data)
33
+ end
34
+ def putmeta_args
35
+ str = <<EOF
36
+ <?xml version="1.0" encoding="UTF-8"?>
37
+ <ItemValueDefinition>
38
+ <WikiDoc>#{meta.wikidoc}</WikiDoc>
39
+ <Usages>
40
+ EOF
41
+ @usages.each_pair do |name, type|
42
+ str += <<EOF
43
+ <Usage>
44
+ <Name>#{name}</Name>
45
+ <Type>#{type.to_s.upcase}</Type>
46
+ </Usage>
47
+ EOF
48
+ end
49
+ str += <<EOF
50
+ </Usages>
51
+ </ItemValueDefinition>
52
+ EOF
53
+ {:body => str}
54
+ end
55
+ def usages
56
+ @usages.keys
57
+ end
58
+ def clear_usages!
59
+ @usages = {}
60
+ end
61
+ def set_usage_type(usage, type)
62
+ loadmeta if @usages.nil?
63
+ @usages[usage] = type
64
+ end
65
+ def usage_type(usage)
66
+ loadmeta if @usages.nil?
67
+ @usages[usage] || :optional
68
+ end
69
+ def optional?(usage)
70
+ usage_type(usage) == :optional
71
+ end
72
+ def compulsory?(usage)
73
+ usage_type(usage) == :compulsory
74
+ end
75
+ def forbidden?(usage)
76
+ usage_type(usage) == :forbidden
77
+ end
78
+ def ignored?(usage)
79
+ usage_type(usage) == :ignored
80
+ end
81
+ def default
82
+ return nil if @default.nil?
83
+ case valuetype
84
+ when "DECIMAL", "DOUBLE"
85
+ @default.to_f rescue nil
86
+ else
87
+ @default
88
+ end
89
+ end
90
+
91
+ def expire_cache_with_v3
92
+ @connection.expire_matching("/#{AMEE_API_VERSION}/definitions/#{itemdefuid}/values/#{uid}.*")
93
+ expire_cache_without_v3
94
+ end
95
+ alias_method_chain :expire_cache, :v3
96
+
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,53 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ module AMEE
5
+ module Admin
6
+
7
+ class ItemValueDefinitionList < AMEE::Collection
8
+
9
+ def initialize_with_v3(connection,uid,options={}, &block)
10
+ @use_v3_connection = true
11
+ initialize_without_v3(connection, uid, options, &block)
12
+ end
13
+ alias_method_chain :initialize, :v3
14
+
15
+ def collectionpath
16
+ "/#{AMEE_API_VERSION}/definitions/#{@uid}/values;full"
17
+ end
18
+
19
+ def xmlcollectorpath
20
+ '/Representation/ItemValueDefinitions/ItemValueDefinition'
21
+ end
22
+
23
+ def parse_json(p)
24
+ raise AMEE::NotSupported
25
+ end
26
+
27
+ def parse_xml(p)
28
+ # This should really be handed off to ItemValueDefinition fully
29
+ data = {}
30
+ data[:itemdefuid] = @uid
31
+ data[:uid] = x '@uid',:doc => p
32
+ data[:name] = x 'Name',:doc => p || data[:uid]
33
+ data[:path] = x 'Path',:doc => p
34
+ data[:default] = x 'Value',:doc => p
35
+ data[:unit] = x 'Unit',:doc => p
36
+ data[:perunit] = x 'PerUnit',:doc => p
37
+ data[:valuetype] =x 'ValueDefinition/ValueType',:doc => p
38
+ data[:choices] =(x('Choices',:doc => p)||'').split(',')
39
+ data[:versions] =[(x('Versions/Version/Version',:doc => p))].flatten
40
+ data[:meta] = {}
41
+ data[:meta][:wikidoc]=x 'WikiDoc', :doc => p
42
+ names = x('Usages/Usage/Name', :doc => p)
43
+ types = x('Usages/Usage/Type', :doc => p)
44
+ data[:meta][:usages] = names && types ? Hash[*(names.zip(types.map{|x| x.downcase.to_sym})).flatten] : {}
45
+ data[:drill]=(x('DrillDown',:doc => p)=='true')
46
+ data[:from_profile]=(x('FromProfile',:doc => p)=='true')
47
+ data[:from_data]=(x('FromData',:doc => p)=='true')
48
+ data
49
+ end
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,28 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ require 'ostruct'
5
+
6
+ module MetaHelper
7
+ def putmeta(args = {})
8
+ tags=args.delete(:tags)
9
+ args.merge! putmeta_args # Added in order to abstract PUTs away from providing arguments in the call. Eventually args param will be deprecated.
10
+ @connection.v3_put(metapath,args)
11
+ puttags(tags) if tags
12
+ loadmeta
13
+ end
14
+ def puttags(tags)
15
+ existing_tags=AMEE::Tags.new(@connection,:category=>uid)
16
+ existing_tags.reset_to(tags)
17
+ end
18
+ def loadmeta
19
+ resp=@connection.v3_get(metapath)
20
+ @doc=load_xml_doc(resp)
21
+ parsemeta
22
+ @meta
23
+ end
24
+ private :loadmeta
25
+ def meta
26
+ @meta||=loadmeta
27
+ end
28
+ end
@@ -0,0 +1,202 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ module AMEE
5
+ module Admin
6
+
7
+ class ReturnValueDefinitionList < AMEE::Collection
8
+ # TODO this class does not yet page through multiple pages
9
+ def initialize(connection,uid,options={})
10
+ @uid=uid
11
+ @use_v3_connection=true
12
+ super(connection,options)
13
+ end
14
+ def klass
15
+ ReturnValueDefinition
16
+ end
17
+ def collectionpath
18
+ "/#{AMEE_API_VERSION}/definitions/#{@uid}/returnvalues;full"
19
+ end
20
+
21
+ def jsoncollector
22
+ @doc['returnValueDefinitions']
23
+ end
24
+ def xmlcollectorpath
25
+ '/Representation/ReturnValueDefinitions/ReturnValueDefinition'
26
+ end
27
+
28
+ def parse_json(p)
29
+ data = {}
30
+ data[:itemdefuid] = @uid
31
+ data[:uid] = p['uid']
32
+ data[:name] = p['type']
33
+ data[:unit] = p['unit']
34
+ data[:perunit] = p['perunit']
35
+ data[:valuetype] = p['valueDefinition']['valueType']
36
+ data
37
+ end
38
+ def parse_xml(p)
39
+ data = {}
40
+ data[:itemdefuid] = @uid
41
+ data[:uid] = x '@uid',:doc => p
42
+ data[:name] = x 'Type',:doc => p || data[:uid]
43
+ data[:unit] = x 'Unit',:doc => p
44
+ data[:perunit] = x 'PerUnit',:doc => p
45
+ data
46
+ end
47
+ end
48
+
49
+ class ReturnValueDefinition < AMEE::Object
50
+
51
+ def initialize(data = {})
52
+ @itemdefuid=data[:itemdefuid]
53
+ @name = data[:name]
54
+ @uid = data[:uid]
55
+ @type = data[:type]
56
+ @unit = data[:unit]
57
+ @perunit = data[:perunit]
58
+ @valuetype = data[:valuetype]
59
+
60
+ super
61
+ end
62
+
63
+ attr_reader :name,:uid,:itemdefuid, :type, :valuetype, :unit, :perunit
64
+
65
+ def self.list(connection)
66
+ ReturnValueDefinitionList.new(connection)
67
+ end
68
+
69
+ def self.parse(connection, response)
70
+ # Parse data from response
71
+ if response.is_json?
72
+ item_definition = ReturnValueDefinition.from_json(response)
73
+ else
74
+ item_definition = ReturnValueDefinition.from_xml(response)
75
+ end
76
+ # Store connection in object for future use
77
+ item_definition.connection = connection
78
+ # Done
79
+ return item_definition
80
+ end
81
+
82
+ def self.from_json(json)
83
+ # Read JSON
84
+ doc = JSON.parse(json)
85
+ data = {}
86
+ p=doc['returnValueDefinition']
87
+ data[:uid] = p['uid']
88
+ data[:itemdefuid] = p['itemDefinition']['uid']
89
+ data[:type] = p['type']
90
+ data[:path] = p['path']
91
+ data[:unit] = p['unit']
92
+ data[:perunit] = p['perUnit']
93
+ data[:valuetype] = p['valueDefinition']['valueType']
94
+ data[:default] = p['value']
95
+
96
+ # Create object
97
+ ReturnValueDefinition.new(data)
98
+ rescue
99
+ raise AMEE::BadData.new("Couldn't load ReturnValueDefinition from JSON. Check that your URL is correct.\n#{json}")
100
+ end
101
+
102
+ def self.xmlpathpreamble
103
+ "/Representation/ReturnValueDefinition/"
104
+ end
105
+
106
+ def self.from_xml(xml)
107
+
108
+
109
+ # Parse data from response into hash
110
+ doc = load_xml_doc(xml)
111
+ data = {}
112
+ data[:uid] = x "@uid",:doc=>doc
113
+ data[:itemdefuid] = x "ItemDefinition/@uid",:doc=>doc
114
+ data[:type] = x "Type",:doc=>doc
115
+ data[:unit] = x "Unit",:doc=>doc
116
+ data[:perunit] = x "PerUnit",:doc=>doc
117
+ data[:valuetype] = x "ValueDefinition/ValueType",:doc=>doc
118
+ data[:default] = x "ReturnValueDefinition/Default",:doc=>doc
119
+
120
+
121
+ # Create object
122
+ ReturnValueDefinition.new(data)
123
+ rescue => err
124
+ raise AMEE::BadData.new("Couldn't load ReturnValueDefinition from XML. Check that your URL is correct.\n#{xml}\n#{err}")
125
+ end
126
+
127
+ def self.get(connection, path, options = {})
128
+ # Load data from path
129
+ response = connection.v3_get(path, options)
130
+ # Parse response
131
+ item_definition = ReturnValueDefinition.parse(connection, response)
132
+ # Done
133
+ return item_definition
134
+ rescue => err
135
+ raise AMEE::BadData.new("Couldn't load ReturnValueDefinition. Check that your URL is correct.\n#{response}\n#{err}")
136
+ end
137
+
138
+
139
+
140
+ def self.load(connection,itemdefuid,ivduid,options={})
141
+ ReturnValueDefinition.get(connection,"/#{AMEE_API_VERSION}/definitions/#{itemdefuid}/returnvalues/#{ivduid};full",options)
142
+ end
143
+
144
+ def reload(connection)
145
+ ReturnValueDefinition.load(connection,itemdefuid,uid)
146
+ end
147
+
148
+ def self.update(connection, path, options = {})
149
+
150
+ # Do we want to automatically fetch the item afterwards?
151
+ get_item = options.delete(:get_item)
152
+ get_item = true if get_item.nil?
153
+ # Go
154
+ response = connection.v3_put(path, options)
155
+ if get_item
156
+ if response.empty?
157
+ return ReturnValueDefinition.get(connection, path)
158
+ else
159
+ return ReturnValueDefinition.parse(connection, response)
160
+ end
161
+ end
162
+ rescue
163
+ raise AMEE::BadData.new("Couldn't update ReturnValueDefinition. Check that your information is correct.\n#{response}")
164
+ end
165
+
166
+ def self.create(connection,itemdefuid, options = {})
167
+
168
+ unless options.is_a?(Hash)
169
+ raise AMEE::ArgumentError.new("Second argument must be a hash of options!")
170
+ end
171
+ # Send data
172
+ vt=options.delete(:valuetype)
173
+ case vt
174
+ when 'text'
175
+ options.merge!( :valueDefinition=>"CCEB59CACE1B")
176
+ else
177
+ options.merge!( :valueDefinition=>"45433E48B39F")
178
+ end
179
+
180
+ options.merge!(:returnobj=>true)
181
+ response = connection.v3_post("/#{AMEE_API_VERSION}/definitions/#{itemdefuid}/returnvalues", options)
182
+ return ReturnValueDefinition.load(connection,itemdefuid , response['Location'].split('/')[7])
183
+ rescue
184
+ raise AMEE::BadData.new("Couldn't create ReturnValueDefinition. Check that your information is correct.\n#{response}")
185
+ end
186
+
187
+ def self.delete(connection, itemdefuid,return_value_definition)
188
+
189
+ # Deleting takes a while... up the timeout to 120 seconds temporarily
190
+ t = connection.timeout
191
+ connection.timeout = 120
192
+ connection.v3_delete("/#{AMEE_API_VERSION}/definitions/#{itemdefuid}/returnvalues/" + return_value_definition.uid)
193
+ connection.timeout = t
194
+ rescue
195
+ raise AMEE::BadData.new("Couldn't delete ReturnValueDefinition. Check that your information is correct.")
196
+ end
197
+
198
+ end
199
+
200
+ end
201
+
202
+ end
data/lib/amee/v3.rb ADDED
@@ -0,0 +1,12 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ AMEE_API_VERSION = '3.3'
5
+
6
+ require 'amee/v3/meta_helper'
7
+ require 'amee/v3/collection'
8
+ require 'amee/v3/connection'
9
+ require 'amee/v3/item_definition'
10
+ require 'amee/v3/item_value_definition'
11
+ require 'amee/v3/item_value_definition_list'
12
+ require 'amee/v3/return_value_definition'
data/lib/amee.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
1
4
  require 'rexml/document'
2
5
  require 'nokogiri'
3
6
  require 'active_support'
@@ -49,6 +52,7 @@ require 'amee/pager'
49
52
  require 'amee/item_definition'
50
53
  require 'amee/item_value_definition'
51
54
  require 'amee/user'
55
+ require 'amee/v3'
52
56
 
53
57
  class Date
54
58
  def amee1_date
data/rails/init.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
1
4
  require 'amee'
2
5
  require 'amee/rails'
3
6
 
data/spec/amee_spec.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
1
4
  require File.dirname(__FILE__) + '/spec_helper.rb'
2
5
 
3
6
  describe "AMEE module" do
data/spec/cache_spec.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
1
4
  require File.dirname(__FILE__) + '/spec_helper.rb'
2
5
  require 'ostruct'
3
6
 
@@ -1,3 +1,6 @@
1
+ # Copyright (C) 2008-2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
1
4
  require File.dirname(__FILE__) + '/spec_helper.rb'
2
5
 
3
6
  describe AMEE::Connection do