eeml 0.0.36 → 0.0.37

Sign up to get free protection for your applications and to get access to all the features.
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
-