eeml 0.0.36 → 0.0.37

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/Rakefile CHANGED
@@ -13,7 +13,7 @@ begin
13
13
  gem.authors = ["Neill Bogie", "Sam Mulube", "Levent Ali", "Paul Bellamy"]
14
14
  gem.version = Eeml::VERSION
15
15
  gem.add_dependency("libxml-ruby", ">=1.1.3")
16
- gem.add_dependency("yajl-ruby", ">=0.7.8")
16
+ gem.add_dependency("yajl-ruby", ">=0.8.1")
17
17
  gem.add_dependency("lightcsv", ">=0.2.2")
18
18
  gem.files.exclude("test/data/real_xmls/*")
19
19
  end
data/lib/eeml.rb CHANGED
@@ -6,7 +6,6 @@ require 'blank'
6
6
  require 'libxml'
7
7
  require 'yajl/json_gem'
8
8
  require 'lightcsv'
9
- require 'eeml/attr_alias'
10
9
  require 'eeml/constants'
11
10
  require 'eeml/exceptions'
12
11
  require 'eeml/helpers'
@@ -17,6 +16,6 @@ require 'time'
17
16
  module Eeml
18
17
 
19
18
  # library version number
20
- VERSION = '0.0.36'
19
+ VERSION = '0.0.37'
21
20
 
22
21
  end #module
@@ -21,14 +21,6 @@ module Eeml
21
21
  :schema_location => 'http://www.eeml.org/xsd/0.5.1 http://www.eeml.org/xsd/0.5.1/0.5.1.xsd'
22
22
  }
23
23
 
24
- # This is NEWER than version 5
25
- EEML["0.5.2"] =
26
- {
27
- :href => 'http://www.eeml.org/xsd/0.5.2',
28
- :versions => '0.5.2',
29
- :schema_location => 'http://www.eeml.org/xsd/0.5.2 http://www.eeml.org/xsd/0.5.2/0.5.2.xsd'
30
- }
31
-
32
24
  JSON_API["0.6-alpha"] =
33
25
  {
34
26
  :versions => ['0.6', '0.6-alpha']
@@ -93,27 +93,25 @@ module Eeml
93
93
  end
94
94
  end
95
95
 
96
- # This class represents the main point of entry to this library. In general we will be creating instances of this class, either
97
- # by manually specifying the parameters, or probably more commonly, by passing in either an EEML or JSON formatted string which
98
- # will be parsed to initialize the object.
96
+ # This class represents the main point of entry to this library. In general
97
+ # we will be creating instances of this class, either by manually specifying
98
+ # the parameters, or probably more commonly, by passing in either an EEML or
99
+ # JSON formatted string which will be parsed to initialize the object.
99
100
  class Environment
100
- attr_accessor :identifier, :updated, :publisher
101
+ attr_accessor :identifier, :updated, :creator, :publisher
101
102
  attr_accessor :title, :description, :feed_url, :website, :email, :icon, :status
102
- attr_accessor :owner
103
103
  attr_accessor :location
104
104
  attr_accessor :csv_version
105
105
  attr_accessor :datastreams
106
106
  attr_accessor :tags
107
107
  attr_writer :private
108
- attr_accessor :owner
109
108
 
110
- attr_alias :creator, :publisher
111
-
112
- # Create a new Environment object by passing parameters in a hash (just like creating an ActiveRecord object)
109
+ # Create a new Environment object by passing parameters in a hash (just
110
+ # like creating an ActiveRecord object)
113
111
  def initialize(options = {})
114
112
  @datastreams = []
115
113
  @identifier = options[:identifier]
116
- @publisher = options[:publisher] || options[:creator]
114
+ @creator = options[:creator]
117
115
  @title = options[:title]
118
116
  @status = options[:status]
119
117
  @feed_url = options[:feed_url]
@@ -123,7 +121,7 @@ module Eeml
123
121
  @icon = options[:icon]
124
122
  @private = options[:private]
125
123
  @csv_version = options[:csv_version]
126
- @owner = options[:owner]
124
+ @publisher = options[:publisher]
127
125
  @tags = []
128
126
  end
129
127
 
@@ -2,7 +2,6 @@ require 'eeml/csv_parser_v1'
2
2
  require 'eeml/csv_parser_v2'
3
3
  require 'eeml/libxml_eeml_parser_v005'
4
4
  require 'eeml/libxml_eeml_parser_v051'
5
- require 'eeml/libxml_eeml_parser_v052'
6
5
  require 'eeml/json_environment_parser_v005'
7
6
  require 'eeml/json_environment_parser_v006'
8
7
  require 'eeml/json_environment_parser_v100'
@@ -17,8 +16,6 @@ module Eeml
17
16
  xml = XML::Parser.string(xml_str).parse
18
17
  if xml.root.namespaces.default.to_s == Constants::EEML['0.5.1'][:href]
19
18
  parser = LibXMLEemlParserV051.new
20
- elsif xml.root.namespaces.default.to_s == Constants::EEML['0.5.2'][:href]
21
- parser = LibXMLEemlParserV052.new
22
19
  else
23
20
  parser = LibXMLEemlParserV005.new
24
21
  end
@@ -14,7 +14,7 @@ module Eeml
14
14
  :identifier => env_hash["id"],
15
15
  :private => env_hash["private"].to_s == "true",
16
16
  :publisher => env_hash["publisher"],
17
- :owner => env_hash["owner"])
17
+ :creator => env_hash["creator"])
18
18
 
19
19
  env.updated = Time.gm(*ParseDate.parsedate(env_hash['updated'])) unless env_hash['updated'].nil?
20
20
 
@@ -39,5 +39,5 @@
39
39
  "title":"title here",
40
40
  "private":"false",
41
41
  "publisher":"http://www.pachube.com",
42
- "owner":"http://www.pachube.com/users/joe",
42
+ "creator":"http://www.pachube.com/users/joe",
43
43
  "version":"1.0.0"}
@@ -36,24 +36,6 @@ class TestEnvironment < Test::Unit::TestCase
36
36
  assert_equal('http://example.com/creator/', env.creator)
37
37
  end
38
38
 
39
- test "creating minimal Env object from some 0.5.2 eeml" do
40
- env = create_env_from_eeml_052
41
-
42
- # simple text nodes available
43
- assert_equal("Pachube Office environment", env.title)
44
- end
45
-
46
- test "creating complete Env object from some 0.5.2 eeml" do
47
- env = create_complete_env_from_eeml_052
48
-
49
- # simple text nodes available
50
- assert_equal("title here", env.title)
51
-
52
- # new attributes
53
- assert_equal("http://www.pachube.com", env.publisher)
54
- assert_equal("http://www.pachube.com/users/joe", env.owner)
55
- end
56
-
57
39
  test 'location parses ok' do
58
40
  env = create_env_from_xml_file_one
59
41
 
@@ -442,7 +424,7 @@ class TestEnvironment < Test::Unit::TestCase
442
424
 
443
425
  # new stuff
444
426
  assert_equal("http://www.pachube.com", env.publisher)
445
- assert_equal("http://www.pachube.com/users/joe", env.owner)
427
+ assert_equal("http://www.pachube.com/users/joe", env.creator)
446
428
  end
447
429
 
448
430
  test "location parses ok from json when parsing a v1.0.0 file" do
@@ -787,12 +769,4 @@ CSV
787
769
  return nil if json.nil?
788
770
  json.gsub(/","/, '"' + "\n" + '"').sort
789
771
  end
790
-
791
- def create_env_from_eeml_052
792
- return create_env_from_xml_file("environment_minimal_052.xml")
793
- end
794
-
795
- def create_complete_env_from_eeml_052
796
- return create_env_from_xml_file("eeml_datastream_052.xml")
797
- end
798
772
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eeml
3
3
  version: !ruby/object:Gem::Version
4
- hash: 87
4
+ hash: 85
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 36
10
- version: 0.0.36
9
+ - 37
10
+ version: 0.0.37
11
11
  platform: ruby
12
12
  authors:
13
13
  - Neill Bogie
@@ -45,12 +45,12 @@ dependencies:
45
45
  requirements:
46
46
  - - ">="
47
47
  - !ruby/object:Gem::Version
48
- hash: 19
48
+ hash: 61
49
49
  segments:
50
50
  - 0
51
- - 7
52
51
  - 8
53
- version: 0.7.8
52
+ - 1
53
+ version: 0.8.1
54
54
  type: :runtime
55
55
  version_requirements: *id002
56
56
  - !ruby/object:Gem::Dependency
@@ -89,7 +89,6 @@ files:
89
89
  - example.rb
90
90
  - lib/blank.rb
91
91
  - lib/eeml.rb
92
- - lib/eeml/attr_alias.rb
93
92
  - lib/eeml/constants.rb
94
93
  - lib/eeml/csv_parser_v1.rb
95
94
  - lib/eeml/csv_parser_v2.rb
@@ -102,9 +101,7 @@ files:
102
101
  - lib/eeml/json_environment_parser_v100.rb
103
102
  - lib/eeml/libxml_eeml_parser_v005.rb
104
103
  - lib/eeml/libxml_eeml_parser_v051.rb
105
- - lib/eeml/libxml_eeml_parser_v052.rb
106
104
  - schemas/eeml/0.5.1.xsd
107
- - schemas/eeml/0.5.2.xsd
108
105
  - schemas/eeml/005.xsd
109
106
  - test/data/.gitignore
110
107
  - test/data/complete_namespaced.xml
@@ -122,9 +119,7 @@ files:
122
119
  - test/data/doc_2.xml
123
120
  - test/data/doc_2_expected.json
124
121
  - test/data/eeml_datastream_051.xml
125
- - test/data/eeml_datastream_052.xml
126
122
  - test/data/environment_minimal_051.xml
127
- - test/data/environment_minimal_052.xml
128
123
  - test/data/environment_tags.json
129
124
  - test/data/environment_tags.xml
130
125
  - test/data/list.xml
@@ -1,8 +0,0 @@
1
- class Module
2
- def attr_alias(new_attr, original)
3
- alias_method(new_attr, original) if method_defined?(original)
4
- new_writer = "#{new_attr}="
5
- original_writer = "#{original}="
6
- alias_method(new_writer, original_writer) if method_defined?(original_writer)
7
- end
8
- end
@@ -1,217 +0,0 @@
1
- require "parsedate.rb"
2
- module Eeml
3
- #a parser for xml eeml v052, implemented with LibXML
4
- class LibXMLEemlParserV052 # :nodoc:
5
- include LibXML
6
- include Exceptions
7
-
8
- @@eeml_version = Constants::EEML['0.5.2']
9
- #main method
10
-
11
- #take an xml string, and create an Environment from it.
12
- #If an optional environment is given, that will be populated (overwritten) instead of a new environment.
13
- def make_environment_from_xml(xml_str, given_environment = nil)
14
- doc = parse_xml(xml_str)
15
- raise MissingNamespace if doc.root.namespaces.namespace.blank?
16
- env = given_environment || Environment.new
17
- #TODO: what has to be reset in a given environment before passing it for re-population?
18
- return extract_environment_from_doc(doc, env)
19
- end
20
-
21
- #take an xml string containing zero or more environment nodes, and create an array of Environment objects from it.
22
- def make_environments_from_xml(xml_str)
23
- doc = parse_xml(xml_str)
24
- raise MissingNamespace if doc.root.namespaces.namespace.blank?
25
- return extract_environments_from_doc(doc)
26
- end
27
-
28
- protected
29
-
30
- def parse_xml(xml_str)
31
- errors = []
32
- #http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Error.html
33
- #TODO: is the error handler set up per thread? (XML::Error.set_handler)
34
- XML::Error.set_handler { |error| errors << error }
35
-
36
- #TODO: performance - is this expensive?
37
- #TODO: are these configurations per-thread? If they're global (e.g. class variables) then we shouldn't be setting them here.
38
- XML.default_line_numbers=true
39
-
40
- parser = XML::Parser.string(strip_content(xml_str))
41
- begin
42
- doc = parser.parse
43
- rescue XML::Error => e
44
- #note: errors var available here, too.
45
- raise BadXML, "Malformed xml: #{e.class}: #{e}", e.backtrace
46
- end
47
- #validation?
48
- # seems we have to recreate our XML::Schema object on each invocation
49
- # else libxml segfaults very quickly
50
- return doc
51
- end
52
-
53
- #multiple (zero or more)
54
- def extract_environments_from_doc(doc)
55
- env_nodes = doc.find('x:environment', "x:#{@@eeml_version[:href]}")
56
- return env_nodes.map{|env_node| new_env = Environment.new; extract_environment_from_node(env_node, new_env)}
57
- end
58
-
59
- #single, mandatory
60
- def extract_environment_from_doc(doc, env_to_populate)
61
- env_node = find_first_node_or_fail(doc, 'x:environment', 'environment', "x:#{@@eeml_version[:href]}")
62
- return extract_environment_from_node(env_node, env_to_populate)
63
- end
64
-
65
- #single, from node (everyone uses this to get the work done)
66
- def extract_environment_from_node(env_node, env_to_populate)
67
- env = env_to_populate
68
- env.identifier = env_node['id']
69
- env.updated = Time.parse(env_node['updated']) if !env_node['updated'].nil?
70
-
71
- env.publisher = env_node['publisher']
72
-
73
- env.title = optional_content(env_node, 'x:title', 'title', "x:#{@@eeml_version[:href]}")
74
- env.feed_url = optional_content(env_node, 'x:feed', 'feed', "x:#{@@eeml_version[:href]}")
75
- env.description = optional_content(env_node, 'x:description', 'description', "x:#{@@eeml_version[:href]}")
76
- env.website = optional_content(env_node, 'x:website', 'website', "x:#{@@eeml_version[:href]}")
77
- env.status = optional_content(env_node, 'x:status', 'status', "x:#{@@eeml_version[:href]}")
78
- env.email = optional_content(env_node, 'x:email', 'email', "x:#{@@eeml_version[:href]}")
79
- env.icon = optional_content(env_node, 'x:icon', 'icon', "x:#{@@eeml_version[:href]}")
80
- env.private = (optional_content(env_node, 'x:private', 'private', "x:#{@@eeml_version[:href]}") == "true")
81
- env.owner = optional_content(env_node, 'x:owner', 'owner', "x:#{@@eeml_version[:href]}")
82
-
83
- #find_first_node_or_fail(env_node, 'x:location', 'location')
84
- loc_node = env_node.find_first('x:location', "x:#{@@eeml_version[:href]}")
85
- env.location = extractLocation(loc_node) if loc_node
86
-
87
- env_node.find('x:tag', "x:#{@@eeml_version[:href]}").each do |tag_node|
88
- env.tags << tag_node.content.strip
89
- end
90
-
91
- datastream_nodes = env_node.find('x:data', "x:#{@@eeml_version[:href]}")
92
- # raise NoDataStreams.new, "no datastreams found" if datastream_nodes.empty?
93
- env.add_datastreams(extractDataStreams(datastream_nodes)) unless datastream_nodes.empty?
94
-
95
- return env
96
- end
97
-
98
- def extractLocation(node)
99
- #<location domain="physical" exposure="outdoor" disposition="mobile">
100
- # <lat>50.1</lat>
101
- # <lon>48.7</lon>
102
- # <ele>1.34</ele>
103
- #</location>
104
- raise "given nil node" if node.nil?
105
- loc = Location.new
106
- loc.domain = node['domain']
107
- loc.disposition = node['disposition']
108
- loc.exposure = node['exposure']
109
- loc.name = optional_content(node, 'x:name', 'name', "x:#{@@eeml_version[:href]}")
110
- loc.latitude = optional_content(node, 'x:lat', 'lat', "x:#{@@eeml_version[:href]}")
111
- loc.longitude = optional_content(node, 'x:lon', 'lon', "x:#{@@eeml_version[:href]}")
112
- loc.elevation = optional_content(node, 'x:ele', 'ele', "x:#{@@eeml_version[:href]}")
113
- return loc
114
- end
115
-
116
- #return an array (TODO: or a hash?) of DataStream objects from the given list of data nodes
117
- def extractDataStreams(nodes)
118
- #<data id="blah1">...</data><data id="blah2">...</data>
119
- dataStreams = []
120
- nodes.each do |node|
121
- dataStreams << extractDataStream(node)
122
- end
123
- return dataStreams
124
- end
125
-
126
- #builds and returns a detailed exception of the given class, for problems concerning the given node (or its missing children)
127
- #details include node's name and line number (zero if not available)
128
- def exception_for_node(node, exception_class, message)
129
- ex = exception_class.new(message)
130
- ex.line_num = node.line_num
131
- ex.node_name = node_name_or_root(node)
132
- return ex
133
- end
134
-
135
-
136
- def extractDataStream(node)
137
- #<data id="0">
138
- #<tag>some_tag</tag>
139
- #<tag>another_tag</tag>
140
- #<current_value>0</current_value>
141
- #<min_value>0.0</min_value>
142
- #<max_value>1022.0</max_value>
143
- #<unit symbol="C" type="basicSI">Celsius</unit>
144
- #</data>
145
- data = DataStream.new
146
- raise MissingAttribute.new(node.name, 'id') if node['id'].nil?
147
- data.identifier = node['id']
148
- node.find('x:tag', "x:#{@@eeml_version[:href]}").each do |tag_node|
149
- data.tags << tag_node.content.strip
150
- end
151
-
152
- value_nodes = node.find('x:current_value', "x:#{@@eeml_version[:href]}")
153
- # raise exception_for_node(node, DataMissingValue, "Data node is missing current_value node.") if value_nodes.empty?
154
- raise exception_for_node(node, DataHasMultipleValues, "Data node has multiple 'value' nodes.") if value_nodes.size > 1
155
-
156
- value_node = value_nodes.first
157
-
158
- max_value_node = node.find_first('x:max_value', "x:#{@@eeml_version[:href]}")
159
- min_value_node = node.find_first('x:min_value', "x:#{@@eeml_version[:href]}")
160
-
161
- value = Value.new
162
- value.min_value = min_value_node.content if min_value_node
163
- value.max_value = max_value_node.content if max_value_node
164
- if value_node
165
- value.value = value_node.content.strip
166
- value.recorded_at = value_node['at'] unless value_node['at'].blank?
167
- end
168
-
169
- data.add_value(value)
170
-
171
- unit_nodes = node.find('x:unit', "x:#{@@eeml_version[:href]}")
172
- raise exception_for_node(node, DataHasMultipleUnits, "Data node has multiple 'unit' nodes.") if unit_nodes.size > 1
173
-
174
- unit_node = unit_nodes.first
175
- unless unit_node.nil?
176
- data.unit_symbol = unit_node['symbol']
177
- data.unit_type = unit_node['type']
178
- data.unit_value = unit_node.content.strip
179
- end
180
-
181
- return data
182
- end
183
-
184
- #Helpers ------------------------------------------------------------------
185
- #Consider mixing these in to the libxml parser for more readable code
186
-
187
- #raises MissingNode if the node isn't there
188
- def mandatory_content(base_node, xpath, description, nslist = nil)
189
- node = base_node.find_first(xpath, nslist)
190
- raise(MissingNode.new(node_name_or_root(base_node), description, xpath)) if node.nil?
191
- return node.content
192
- end
193
-
194
- #returns the node's content, or the given default if the node isn't there (default itself defaults to nil)
195
- #description isn't used, but keeps our signature same as mandatory_content(), up to that point.
196
- def optional_content(base_node, xpath, description, nslist = nil, default = nil)
197
- node = base_node.find_first(xpath, nslist)
198
- return node.nil? ? default : node.content
199
- end
200
-
201
-
202
- #get the name of the given node if it is a node, or 'root' if it is a doc.
203
- #for use only for error messages
204
- def node_name_or_root(node)
205
- node.respond_to?(:name) ? node.name : 'root'
206
- end
207
-
208
- def find_first_node_or_fail(base_node, xpath, description, nslist = nil)
209
- node = base_node.find_first(xpath, nslist)
210
- raise(MissingNode.new(node_name_or_root(base_node), description, xpath)) if node.nil?
211
- return node
212
- end
213
-
214
- end
215
-
216
- end
217
-
@@ -1,167 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <xsd:schema xmlns="http://www.eeml.org/xsd/0.5.2" elementFormDefault="qualified" targetNamespace="http://www.eeml.org/xsd/0.5.2" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3
- <xsd:element name="eeml">
4
- <xsd:complexType>
5
- <xsd:choice>
6
- <xsd:element maxOccurs="unbounded" name="environment">
7
- <xsd:complexType>
8
- <xsd:sequence>
9
- <xsd:element minOccurs="0" name="title" type="xsd:string" />
10
- <xsd:element minOccurs="0" name="feed" type="xsd:anyURI" />
11
- <xsd:element minOccurs="0" name="status">
12
- <xsd:simpleType>
13
- <xsd:restriction base="xsd:string">
14
- <xsd:enumeration value="frozen" />
15
- <xsd:enumeration value="live" />
16
- </xsd:restriction>
17
- </xsd:simpleType>
18
- </xsd:element>
19
- <xsd:element minOccurs="0" name="private">
20
- <xsd:simpleType>
21
- <xsd:restriction base="xsd:string">
22
- <xsd:enumeration value="true" />
23
- <xsd:enumeration value="false" />
24
- </xsd:restriction>
25
- </xsd:simpleType>
26
- </xsd:element>
27
- <xsd:element minOccurs="0" name="description" type="xsd:string" />
28
- <xsd:element minOccurs="0" name="icon" type="xsd:anyURI" />
29
- <xsd:element minOccurs="0" name="website" type="xsd:anyURI" />
30
- <xsd:element minOccurs="0" name="email" type="xsd:string" />
31
- <xsd:element minOccurs="0" maxOccurs="unbounded" name="tag" type="xsd:string" />
32
- <xsd:element minOccurs="0" name="owner">
33
- <xsd:complexType>
34
- <xsd:sequence>
35
- <xsd:element minOccurs="0" name="login" type="xsd:string" />
36
- <xsd:element minOccurs="0" name="url" type="xsd:anyURI" />
37
- </xsd:sequence>
38
- </xsd:complexType>
39
- </xsd:element>
40
- <xsd:element minOccurs="0" name="location">
41
- <xsd:complexType>
42
- <xsd:sequence>
43
- <xsd:element minOccurs="0" name="name" type="xsd:string" />
44
- <xsd:element name="lat">
45
- <xsd:simpleType>
46
- <xsd:restriction base="xsd:double">
47
- <xsd:minInclusive value="-90" />
48
- <xsd:maxInclusive value="90" />
49
- </xsd:restriction>
50
- </xsd:simpleType>
51
- </xsd:element>
52
- <xsd:element name="lon">
53
- <xsd:simpleType>
54
- <xsd:restriction base="xsd:double">
55
- <xsd:minInclusive value="-180" />
56
- <xsd:maxInclusive value="180" />
57
- </xsd:restriction>
58
- </xsd:simpleType>
59
- </xsd:element>
60
- <xsd:element minOccurs="0" maxOccurs="1" name="ele" type="xsd:double" />
61
- </xsd:sequence>
62
- <xsd:attribute name="exposure" use="optional">
63
- <xsd:simpleType>
64
- <xsd:restriction base="xsd:string">
65
- <xsd:enumeration value="indoor" />
66
- <xsd:enumeration value="outdoor" />
67
- </xsd:restriction>
68
- </xsd:simpleType>
69
- </xsd:attribute>
70
- <xsd:attribute name="domain" use="required">
71
- <xsd:simpleType>
72
- <xsd:restriction base="xsd:string">
73
- <xsd:enumeration value="physical" />
74
- <xsd:enumeration value="virtual" />
75
- </xsd:restriction>
76
- </xsd:simpleType>
77
- </xsd:attribute>
78
- <xsd:attribute name="disposition" use="optional">
79
- <xsd:simpleType>
80
- <xsd:restriction base="xsd:string">
81
- <xsd:enumeration value="fixed" />
82
- <xsd:enumeration value="mobile" />
83
- </xsd:restriction>
84
- </xsd:simpleType>
85
- </xsd:attribute>
86
- </xsd:complexType>
87
- </xsd:element>
88
- <xsd:element minOccurs="1" maxOccurs="unbounded" name="data">
89
- <xsd:complexType>
90
- <xsd:sequence>
91
- <xsd:element minOccurs="0" maxOccurs="unbounded" name="tag" type="xsd:string" />
92
- <xsd:element minOccurs="0" maxOccurs="1" name="current_value">
93
- <xsd:complexType>
94
- <xsd:simpleContent>
95
- <xsd:extension base="xsd:string">
96
- <xsd:attribute name="at" type="xsd:dateTime" use="optional" />
97
- </xsd:extension>
98
- </xsd:simpleContent>
99
- </xsd:complexType>
100
- </xsd:element>
101
- <xsd:element minOccurs="0" maxOccurs="1" name="max_value" type="xsd:string" />
102
- <xsd:element minOccurs="0" maxOccurs="1" name="min_value" type="xsd:string" />
103
- <xsd:element minOccurs="0" maxOccurs="1" name="datapoints">
104
- <xsd:complexType>
105
- <xsd:sequence>
106
- <xsd:element minOccurs="0" maxOccurs="unbounded" name="value">
107
- <xsd:complexType>
108
- <xsd:simpleContent>
109
- <xsd:extension base="xsd:string">
110
- <xsd:attribute name="at" type="xsd:dateTime" use="optional" />
111
- </xsd:extension>
112
- </xsd:simpleContent>
113
- </xsd:complexType>
114
- </xsd:element>
115
- </xsd:sequence>
116
- </xsd:complexType>
117
- </xsd:element>
118
- <xsd:element minOccurs="0" maxOccurs="1" name="unit">
119
- <xsd:complexType>
120
- <xsd:simpleContent>
121
- <xsd:extension base="xsd:string">
122
- <xsd:attribute name="symbol" type="xsd:string" use="optional">
123
- </xsd:attribute>
124
- <xsd:attribute name="type" use="optional">
125
- <xsd:simpleType>
126
- <xsd:restriction base="xsd:string">
127
- <xsd:enumeration value="basicSI" />
128
- <xsd:enumeration value="derivedSI" />
129
- <xsd:enumeration value="conversionBasedUnits" />
130
- <xsd:enumeration value="derivedUnits" />
131
- <xsd:enumeration value="contextDependentUnits" />
132
- </xsd:restriction>
133
- </xsd:simpleType>
134
- </xsd:attribute>
135
- </xsd:extension>
136
- </xsd:simpleContent>
137
- </xsd:complexType>
138
- </xsd:element>
139
- </xsd:sequence>
140
- <xsd:attribute name="id" type="xsd:nonNegativeInteger" use="required" />
141
- </xsd:complexType>
142
- </xsd:element>
143
- </xsd:sequence>
144
- <xsd:attribute name="updated" use="optional">
145
- <xsd:simpleType>
146
- <xsd:restriction base="xsd:dateTime" />
147
- </xsd:simpleType>
148
- </xsd:attribute>
149
- <xsd:attribute name="creator" use="optional">
150
- <xsd:simpleType>
151
- <xsd:restriction base="xsd:string" />
152
- </xsd:simpleType>
153
- </xsd:attribute>
154
- <xsd:attribute name="id" type="xsd:nonNegativeInteger" use="optional" />
155
- </xsd:complexType>
156
- </xsd:element>
157
- </xsd:choice>
158
- <xsd:attribute name="version" use="optional">
159
- <xsd:simpleType>
160
- <xsd:restriction base="xsd:string">
161
- <xsd:enumeration value="0.5.1" />
162
- </xsd:restriction>
163
- </xsd:simpleType>
164
- </xsd:attribute>
165
- </xsd:complexType>
166
- </xsd:element>
167
- </xsd:schema>
@@ -1,40 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <eeml xmlns="http://www.eeml.org/xsd/0.5.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="0.5.2" xsi:schemaLocation="http://www.eeml.org/xsd/0.5.2 http://www.eeml.org/xsd/0.5.2/0.5.2.xsd">
3
- <environment updated="2010-09-23T09:54:57.873029Z" publisher="http://www.pachube.com">
4
- <title>title here</title>
5
- <feed>http://appdev.loc:3000/api/feeds/.xml</feed>
6
- <status>live</status>
7
- <description>description here</description>
8
- <icon>http://example.com/some/icon.gif</icon>
9
- <website>http://example.com/studio/</website>
10
- <email>someone@example.com</email>
11
- <private>false</private>
12
- <owner>http://www.pachube.com/users/joe</owner>
13
- <location domain="physical" exposure="outdoor" disposition="mobile">
14
- <name>Up on the roof (somewhere)</name>
15
- <lat>50.1</lat>
16
- <lon>48.7</lon>
17
- <ele>1.34</ele>
18
- </location>
19
- <data id="0">
20
- <tag>tagD0</tag>
21
- <current_value at="2010-09-23T09:54:57.873029Z">0</current_value>
22
- <max_value>1022.0</max_value>
23
- <min_value>-9999.0</min_value>
24
- <unit type="basicSI" symbol="C">Celsius</unit>
25
- </data>
26
- <data id="1">
27
- <current_value at="2010-09-23T09:54:57.873029Z">33</current_value>
28
- <max_value>1023.0</max_value>
29
- <min_value>0.0</min_value>
30
- </data>
31
- <data id="2">
32
- <tag>tagD2a</tag>
33
- <tag>tagD2b</tag>
34
- <tag>tagD2c</tag>
35
- <current_value at="2010-09-23T09:54:57.873029Z">42.1</current_value>
36
- <max_value>1021.0</max_value>
37
- <min_value>23.4</min_value>
38
- </data>
39
- </environment>
40
- </eeml>
@@ -1,8 +0,0 @@
1
- <eeml xmlns="http://www.eeml.org/xsd/0.5.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="0.5.2" xsi:schemaLocation="http://www.eeml.org/xsd/0.5.2 http://www.eeml.org/xsd/0.5.2/0.5.2.xsd">
2
- <environment>
3
- <title>Pachube Office environment</title>
4
- <data id="0" />
5
- <data id="1" />
6
- </environment>
7
- </eeml>
8
-