eeml 0.0.14 → 0.0.17

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,21 @@
1
+ commit 245dae9ae8e246d3f933106e70df4eadb33823fe
2
+ Author: Levent Ali <lebreeze@gmail.com>
3
+ Date: Fri Jul 2 16:03:27 2010 +0100
4
+
5
+ Version 0.0.17
6
+
7
+ JSON version 0.6rc1 bumped to 1.0.0 (as not tied to eeml directly)
8
+ JSON 1.0.0 takes at instead of recorded_at
9
+
10
+ commit b2829c7df6eea4fb5be3c6834d56d70f472aba9b
11
+ Author: Levent Ali <lebreeze@gmail.com>
12
+ Date: Thu Jul 1 17:41:23 2010 +0100
13
+
14
+ Version 0.0.15
15
+
16
+ Added functionality to parse json v0.6-rc1
17
+ Updating readme on building gem / gemspec
18
+
1
19
  commit 926ef3400b50ee441f2c48951ad1e5d1fd4f0549
2
20
  Author: Sam Mulube <sam.mulube@gmail.com>
3
21
  Date: Wed Jun 24 23:47:25 2009 +0100
data/README CHANGED
@@ -8,3 +8,5 @@ Library for simplifying the creation and manipulation of EEML documents, primari
8
8
  ruby objects that can be used programmatically. Also provides parsing and output of the JSON format used by pachube.com.
9
9
 
10
10
  == USAGE
11
+
12
+ rake build - will create gemspec and gem file in pkg/
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ begin
10
10
  gem.summary = "Simple little library for programmatically manipulating EEML documents."
11
11
  gem.description = "Simple little library for programmatically manipulating EEML documents, in particular this library is designed to work with the Pachube web service."
12
12
  gem.email = "sam.mulube@gmail.com"
13
- gem.authors = ["Neill Bogie", "Sam Mulube"]
13
+ gem.authors = ["Neill Bogie", "Sam Mulube", "Levent Ali"]
14
14
  gem.version = Eeml::VERSION
15
15
  gem.add_dependency("libxml-ruby", ">=1.1.3")
16
16
  gem.add_dependency("json", ">=1.4.3")
@@ -9,6 +9,10 @@ module Eeml
9
9
  XSI_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance"
10
10
 
11
11
  EEML6_VERSION = "0.6-alpha1"
12
+
13
+ # Not calling this EEML as json is not part of the eeml spec
14
+ JSON_1_0_0_VERSION = "1.0.0"
15
+ # EEML6_RC1_VERSION = "0.6-rc1"
12
16
  end
13
17
  end
14
18
 
@@ -1,6 +1,7 @@
1
1
  require 'eeml/libxml_eeml_parser_v005'
2
2
  require 'eeml/json_environment_parser_v005'
3
3
  require 'eeml/json_environment_parser_v006'
4
+ require 'eeml/json_environment_parser_v100'
4
5
 
5
6
  module Eeml
6
7
  class EnvironmentBuilder # :nodoc:
@@ -19,10 +20,12 @@ module Eeml
19
20
  json = JSON.parse(json_str)
20
21
  if json["version"].to_i == Constants::EEML5_VERSION.to_i
21
22
  parser = JsonEnvironmentParserV005.new
23
+ elsif json["version"] == Constants::JSON_1_0_0_VERSION
24
+ parser = JsonEnvironmentParserV100.new
22
25
  elsif json["version"].to_f == Constants::EEML6_VERSION.to_f
23
26
  parser = JsonEnvironmentParserV006.new
24
27
  else
25
- raise "Invalid version specification. Permitted versions are #{Constants::EEML5_VERSION} and #{Constants::EEML6_VERSION}"
28
+ raise "Invalid version specification. Permitted versions are #{Constants::EEML5_VERSION}, #{Constants::EEML6_VERSION} and #{Constants::JSON_1_0_0_VERSION}"
26
29
  end
27
30
  return parser.make_environment_from_hash(json)
28
31
  end
@@ -0,0 +1,82 @@
1
+ module Eeml
2
+ # A parser for json environments based on the EEML 5 specification.
3
+ class JsonEnvironmentParserV100 # :nodoc:
4
+ include Exceptions
5
+
6
+ def make_environment_from_hash(env_hash)
7
+ env = Environment.new(:title => env_hash["title"],
8
+ :description => env_hash["description"],
9
+ :feed_url => env_hash["feed"],
10
+ :website => env_hash["website"],
11
+ :email => env_hash["email"],
12
+ :icon => env_hash["icon"],
13
+ :status => env_hash["status"],
14
+ :identifier => env_hash["id"],
15
+ :private => env_hash["private"])
16
+
17
+ env.updated = Time.gm(*ParseDate.parsedate(env_hash['updated'])) unless env_hash['updated'].nil?
18
+
19
+ env.location = buildLocation(env_hash)
20
+
21
+ env.datastreams = buildDatastreams(env_hash)
22
+
23
+ return env
24
+ end
25
+
26
+ def make_environment_from_json(json_str)
27
+ env_hash = JSON.parse(json_str)
28
+ return make_environment_from_hash(env_hash)
29
+ end
30
+
31
+ private
32
+
33
+ def buildLocation(env_hash)
34
+ location_hash = env_hash["location"]
35
+ return if location_hash.nil?
36
+ Location.new(:name => location_hash["name"],
37
+ :latitude => location_hash["lat"],
38
+ :longitude => location_hash["lon"],
39
+ :elevation => location_hash["ele"],
40
+ :domain => location_hash["domain"],
41
+ :disposition => location_hash["disposition"],
42
+ :exposure => location_hash["exposure"])
43
+ end
44
+
45
+ def buildDatastreams(env_hash)
46
+ datastreams_hash = env_hash["datastreams"]
47
+ return if datastreams_hash.nil?
48
+ datastreams = []
49
+ datastreams_hash.each do |datastream_hash|
50
+ datastream = DataStream.new
51
+ raise MissingAttribute.new('id', "data") if datastream_hash['id'].nil?
52
+ datastream.identifier = datastream_hash['id']
53
+ datastream.tags = datastream_hash['tags'] unless datastream_hash['tags'].nil?
54
+
55
+ values_arr = datastream_hash["values"]
56
+
57
+ raise DataMissingValue if values_arr.nil?
58
+
59
+ values_arr.each do |v|
60
+ value = Value.new(:value => v["value"],
61
+ :min_value => datastream_hash["min_value"],
62
+ :max_value => datastream_hash["max_value"],
63
+ :recorded_at => v["at"])
64
+
65
+ datastream.add_value(value)
66
+ end
67
+
68
+ unit_hash = datastream_hash["unit"]
69
+ unless unit_hash.nil?
70
+ datastream.unit_symbol = unit_hash["symbol"]
71
+ datastream.unit_type = unit_hash["type"]
72
+ datastream.unit_value = unit_hash["label"]
73
+ end
74
+
75
+ datastreams << datastream
76
+ end
77
+ return datastreams
78
+ end
79
+ end
80
+ end
81
+
82
+
data/lib/eeml.rb CHANGED
@@ -15,7 +15,7 @@ require 'time'
15
15
  module Eeml
16
16
 
17
17
  # library version number
18
- VERSION = '0.0.14'
18
+ VERSION = '0.0.17'
19
19
 
20
20
  # TODO: put in some configuration file, not here
21
21
  LOCAL_EEML_SCHEMA_LOCATION = 'schemas/eeml/005.xsd'
@@ -0,0 +1,34 @@
1
+ {"datastreams":[
2
+ {"tags":["tagD0"],
3
+ "values":[{"value":"0","at":"2009-02-11T10:56:56Z"}],
4
+ "min_value":"-9999.0",
5
+ "max_value":"1022.0",
6
+ "unit":{"type":"basicSI","label":"Celsius","symbol":"C"},
7
+ "id":"0"},
8
+ {"values":[{"value":"33","at":"2009-02-11T10:56:55Z"}],
9
+ "min_value":"0.0","max_value":"1023.0",
10
+ "id":"1"},
11
+ {"tags":["tagD2a","tagD2b","tagD2c"],
12
+ "values":[{"value":"42.1","at":"2009-02-11T10:55:10Z"}],
13
+ "min_value":"23.4","max_value":"1021.0",
14
+ "id":"2"}
15
+ ],
16
+ "description":"description here",
17
+ "updated":"2010-02-11T10:56:56Z",
18
+ "status":"frozen",
19
+ "website":"http:\/\/example.com\/studio\/",
20
+ "email":"someone@example.com",
21
+ "feed":"http:\/\/example.com\/api\/1247.xml",
22
+ "location":{
23
+ "lat":"50.1",
24
+ "lon":"48.7",
25
+ "ele":"1.34",
26
+ "name":"Up on the roof (somewhere)",
27
+ "domain":"physical",
28
+ "exposure":"outdoor",
29
+ "disposition":"mobile"
30
+ },
31
+ "icon":"http:\/\/example.com\/some\/icon.gif",
32
+ "id":"1247",
33
+ "title":"title here",
34
+ "version":"1.0.0"}
@@ -365,6 +365,70 @@ class TestEnvironment < Test::Unit::TestCase
365
365
  end
366
366
  end
367
367
 
368
+ test "parses a v1.0.0 input file ok" do
369
+ env = create_env_from_json_v100_file_one
370
+ assert_not_nil env
371
+ assert_instance_of Environment, env
372
+ assert_equal('title here', env.title)
373
+ assert_equal('description here', env.description)
374
+ assert_equal('http://example.com/api/1247.xml', env.feed_url)
375
+ assert_equal('http://example.com/studio/', env.website)
376
+ assert_equal('frozen', env.status)
377
+ assert_equal('someone@example.com', env.email)
378
+ assert_equal('http://example.com/some/icon.gif', env.icon)
379
+
380
+ #env attrs
381
+ assert_equal('1247', env.identifier)
382
+ assert_equal('2010-02-11T10:56:56Z', env.updated.utc.iso8601)
383
+ end
384
+
385
+ test "location parses ok from json when parsing a v1.0.0 file" do
386
+ env = create_env_from_json_v100_file_one
387
+ assert_not_nil env.location
388
+ location = env.location
389
+ assert_equal "Up on the roof (somewhere)", location.name
390
+ assert_equal "50.1", location.latitude
391
+ assert_equal "48.7", location.longitude
392
+ assert_equal "1.34", location.elevation
393
+ assert_equal "physical", location.domain
394
+ assert_equal "outdoor", location.exposure
395
+ assert_equal "mobile", location.disposition
396
+ end
397
+
398
+ test "datastreams parse ok from v1.0.0 json" do
399
+ env = create_env_from_json_v100_file_one
400
+ assert_equal 3, env.datastreams.size
401
+
402
+ #the expected values for the datastreams in the test doc
403
+ expectations_list = [
404
+ #id, tag array, min, max, value, unit_symbol, unit_type, unit_value
405
+ ['0', ['tagD0'], '-9999.0', '1022.0', '0', 'C', 'basicSI', 'Celsius', '2009-02-11T10:56:56Z'],
406
+ ['1', [], '0.0', '1023.0', '33', nil, nil, nil, '2009-02-11T10:56:55Z'],
407
+ ['2', ['tagD2a', 'tagD2b', 'tagD2c'], '23.4', '1021.0', '42.1', nil, nil, nil, '2009-02-11T10:55:10Z']
408
+ ]
409
+ env.datastreams.each_with_index do |ds, i|
410
+
411
+ e_identifier, e_tags, e_min_value, e_max_value, e_value, e_unit_symbol, e_unit_type, e_unit_value, e_value_recorded_at = expectations_list[i]
412
+
413
+ assert_equal e_identifier, ds.identifier
414
+
415
+ assert_equal e_tags.size, ds.tags.size, "should have right num of tags"
416
+
417
+ e_tags.each do |expected_tag|
418
+ ds.tags.member? expected_tag
419
+
420
+ end
421
+
422
+ assert_equal e_value_recorded_at, ds.values.last.recorded_at
423
+ assert_equal e_min_value, ds.min_value
424
+ assert_equal e_max_value, ds.max_value
425
+ assert_equal e_value, ds.value
426
+ assert_equal e_unit_symbol, ds.unit_symbol
427
+ assert_equal e_unit_type, ds.unit_type
428
+ assert_equal e_unit_value, ds.unit_value
429
+ end
430
+ end
431
+
368
432
  test "parses a v6 input file ok" do
369
433
  env = create_env_from_json_v6_file_one
370
434
  assert_not_nil env
@@ -599,6 +663,10 @@ class TestEnvironment < Test::Unit::TestCase
599
663
  return create_env_from_json_file('test/data/doc_1_v6.json')
600
664
  end
601
665
 
666
+ def create_env_from_json_v100_file_one
667
+ return create_env_from_json_file('test/data/doc_1_v1-0-0.json')
668
+ end
669
+
602
670
  def create_env_from_json_file(filename)
603
671
  json = File.read(filename)
604
672
  return Environment.new_from_json(json)
metadata CHANGED
@@ -5,17 +5,18 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 14
9
- version: 0.0.14
8
+ - 17
9
+ version: 0.0.17
10
10
  platform: ruby
11
11
  authors:
12
12
  - Neill Bogie
13
13
  - Sam Mulube
14
+ - Levent Ali
14
15
  autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2010-06-02 00:00:00 +01:00
19
+ date: 2010-07-02 00:00:00 +01:00
19
20
  default_executable:
20
21
  dependencies:
21
22
  - !ruby/object:Gem::Dependency
@@ -72,6 +73,7 @@ files:
72
73
  - lib/eeml/exceptions.rb
73
74
  - lib/eeml/json_environment_parser_v005.rb
74
75
  - lib/eeml/json_environment_parser_v006.rb
76
+ - lib/eeml/json_environment_parser_v100.rb
75
77
  - lib/eeml/json_output.rb
76
78
  - lib/eeml/libxml_eeml_output_v005.rb
77
79
  - lib/eeml/libxml_eeml_parser_v005.rb
@@ -84,6 +86,7 @@ files:
84
86
  - test/data/doc_1.xml
85
87
  - test/data/doc_1_private.json
86
88
  - test/data/doc_1_private.xml
89
+ - test/data/doc_1_v1-0-0.json
87
90
  - test/data/doc_1_v6.json
88
91
  - test/data/doc_1_v6_private.json
89
92
  - test/data/doc_2.xml
@@ -128,8 +131,8 @@ signing_key:
128
131
  specification_version: 3
129
132
  summary: Simple little library for programmatically manipulating EEML documents.
130
133
  test_files:
131
- - test/test_environment.rb
134
+ - test/test_helper.rb
135
+ - test/test_libxml_eeml_parser_v005.rb
132
136
  - test/test_libxml_test_helper.rb
137
+ - test/test_environment.rb
133
138
  - test/libxml_test_helper.rb
134
- - test/test_libxml_eeml_parser_v005.rb
135
- - test/test_helper.rb