obix 0.0.1

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.
Files changed (104) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/Guardfile +5 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +128 -0
  7. data/Rakefile +7 -0
  8. data/lib/obix.rb +55 -0
  9. data/lib/obix/alarms.rb +48 -0
  10. data/lib/obix/builder.rb +45 -0
  11. data/lib/obix/configuration.rb +79 -0
  12. data/lib/obix/errors.rb +6 -0
  13. data/lib/obix/history.rb +65 -0
  14. data/lib/obix/network.rb +76 -0
  15. data/lib/obix/objects.rb +46 -0
  16. data/lib/obix/objects/base.rb +97 -0
  17. data/lib/obix/objects/boolean.rb +13 -0
  18. data/lib/obix/objects/date.rb +15 -0
  19. data/lib/obix/objects/duration.rb +14 -0
  20. data/lib/obix/objects/enumerable.rb +13 -0
  21. data/lib/obix/objects/error.rb +26 -0
  22. data/lib/obix/objects/feed.rb +14 -0
  23. data/lib/obix/objects/float.rb +16 -0
  24. data/lib/obix/objects/integer.rb +15 -0
  25. data/lib/obix/objects/list.rb +14 -0
  26. data/lib/obix/objects/object.rb +20 -0
  27. data/lib/obix/objects/operation.rb +28 -0
  28. data/lib/obix/objects/reference.rb +10 -0
  29. data/lib/obix/objects/string.rb +14 -0
  30. data/lib/obix/objects/time.rb +15 -0
  31. data/lib/obix/objects/uri.rb +13 -0
  32. data/lib/obix/tag.rb +43 -0
  33. data/lib/obix/types.rb +15 -0
  34. data/lib/obix/types/boolean.rb +25 -0
  35. data/lib/obix/types/date.rb +20 -0
  36. data/lib/obix/types/duration.rb +21 -0
  37. data/lib/obix/types/float.rb +18 -0
  38. data/lib/obix/types/integer.rb +18 -0
  39. data/lib/obix/types/string.rb +18 -0
  40. data/lib/obix/types/time.rb +20 -0
  41. data/lib/obix/types/type.rb +17 -0
  42. data/lib/obix/types/uri.rb +28 -0
  43. data/lib/obix/version.rb +3 -0
  44. data/lib/obix/watch.rb +119 -0
  45. data/obix.gemspec +31 -0
  46. data/test/fixtures/alarmqueryout.xml +19 -0
  47. data/test/fixtures/alarmsubject.xml +5 -0
  48. data/test/fixtures/history.xml +9 -0
  49. data/test/fixtures/historyqueryout.xml +15 -0
  50. data/test/fixtures/invalid.xml +1 -0
  51. data/test/fixtures/objects/boolean.xml +1 -0
  52. data/test/fixtures/objects/date.xml +1 -0
  53. data/test/fixtures/objects/duration.xml +1 -0
  54. data/test/fixtures/objects/enumerable.xml +1 -0
  55. data/test/fixtures/objects/error.xml +1 -0
  56. data/test/fixtures/objects/feed.xml +4 -0
  57. data/test/fixtures/objects/float.xml +1 -0
  58. data/test/fixtures/objects/integer.xml +1 -0
  59. data/test/fixtures/objects/list.xml +4 -0
  60. data/test/fixtures/objects/object.xml +1 -0
  61. data/test/fixtures/objects/operation.xml +1 -0
  62. data/test/fixtures/objects/reference.xml +1 -0
  63. data/test/fixtures/objects/string.xml +1 -0
  64. data/test/fixtures/objects/time.xml +1 -0
  65. data/test/fixtures/objects/uri.xml +1 -0
  66. data/test/fixtures/valid.xml +11 -0
  67. data/test/fixtures/watch.xml +8 -0
  68. data/test/fixtures/watchout.xml +5 -0
  69. data/test/fixtures/watchservice.xml +3 -0
  70. data/test/obix/alarms_test.rb +36 -0
  71. data/test/obix/builder_test.rb +32 -0
  72. data/test/obix/configuration_test.rb +32 -0
  73. data/test/obix/history_test.rb +54 -0
  74. data/test/obix/network_test.rb +134 -0
  75. data/test/obix/objects/base_test.rb +54 -0
  76. data/test/obix/objects/boolean_test.rb +17 -0
  77. data/test/obix/objects/date_test.rb +16 -0
  78. data/test/obix/objects/duration_test.rb +16 -0
  79. data/test/obix/objects/enumerable_test.rb +17 -0
  80. data/test/obix/objects/error_test.rb +47 -0
  81. data/test/obix/objects/feed_test.rb +16 -0
  82. data/test/obix/objects/float_test.rb +16 -0
  83. data/test/obix/objects/integer_test.rb +16 -0
  84. data/test/obix/objects/list_test.rb +17 -0
  85. data/test/obix/objects/object_test.rb +17 -0
  86. data/test/obix/objects/operation_test.rb +37 -0
  87. data/test/obix/objects/reference_test.rb +16 -0
  88. data/test/obix/objects/string_test.rb +16 -0
  89. data/test/obix/objects/time_test.rb +16 -0
  90. data/test/obix/objects/uri_test.rb +16 -0
  91. data/test/obix/objects_test.rb +13 -0
  92. data/test/obix/tag_test.rb +42 -0
  93. data/test/obix/types/boolean_test.rb +18 -0
  94. data/test/obix/types/date_test.rb +20 -0
  95. data/test/obix/types/duration_test.rb +18 -0
  96. data/test/obix/types/float_test.rb +18 -0
  97. data/test/obix/types/integer_test.rb +18 -0
  98. data/test/obix/types/string_test.rb +18 -0
  99. data/test/obix/types/time_test.rb +20 -0
  100. data/test/obix/types/uri_test.rb +48 -0
  101. data/test/obix/watch_test.rb +169 -0
  102. data/test/obix_test.rb +42 -0
  103. data/test/test_helper.rb +18 -0
  104. metadata +357 -0
@@ -0,0 +1,76 @@
1
+ require "net/http"
2
+
3
+ module OBIX
4
+ module Network
5
+ include Net
6
+
7
+ extend self
8
+
9
+ # Make a get request.
10
+ #
11
+ # url - A String describing where the request should be sent.
12
+ # object - A Objects::Object or derivative thereof describing the OBIX element to send.
13
+ def get url
14
+ url = URI url
15
+ request = HTTP::Get.new url.path
16
+
17
+ dispatch request, to: url
18
+ end
19
+
20
+ # Make a post request.
21
+ #
22
+ # url - A String describing where the request should be sent.
23
+ # object - A Objects::Object or derivative thereof describing the OBIX element to send.
24
+ def post url, object = nil
25
+ url = URI url
26
+ request = HTTP::Post.new url.path
27
+
28
+ if object
29
+ request.body = object.to_xml
30
+ end
31
+
32
+ dispatch request, to: url
33
+ end
34
+
35
+ private
36
+
37
+ # Dispatch the given request.
38
+ #
39
+ # request - A derivative of Net::HTTPGenericRequest describing the request.
40
+ # options - A Hash with query options:
41
+ # :to - An URI instance describing where the request should be sent.
42
+ #
43
+ # Returns a Net::HTTPResponse instance.
44
+ def dispatch request, options
45
+ url = options.fetch :to
46
+
47
+ if url.relative?
48
+ url = URI.join "#{OBIX.configuration.scheme}://#{OBIX.configuration.host}", url
49
+ end
50
+
51
+ options = {
52
+ use_ssl: true,
53
+ verify_mode: OpenSSL::SSL::VERIFY_NONE,
54
+ open_timeout: 10,
55
+ read_timeout: OBIX.configuration.timeout
56
+ }
57
+
58
+ response = HTTP.start url.host, url.port, options do |http|
59
+ request.basic_auth OBIX.configuration.username, OBIX.configuration.password
60
+ http.request request
61
+ end
62
+
63
+ unless response.code == "200"
64
+ raise Error, "The server responded with an unexpected status code #{response.code} for #{url}."
65
+ end
66
+
67
+ response.body
68
+ rescue ::Timeout::Error
69
+ raise Timeout, "The remote server did not respond in a timely fashion"
70
+ end
71
+
72
+ class Error < ::OBIX::Error; end
73
+
74
+ class Timeout < Error; end
75
+ end
76
+ end
@@ -0,0 +1,46 @@
1
+ module OBIX
2
+ module Objects
3
+ autoload :Base, "obix/objects/base"
4
+ autoload :Object, "obix/objects/object"
5
+ autoload :Float, "obix/objects/float"
6
+ autoload :Integer, "obix/objects/integer"
7
+ autoload :Boolean, "obix/objects/boolean"
8
+ autoload :String, "obix/objects/string"
9
+ autoload :Enumerable, "obix/objects/enumerable"
10
+ autoload :Time, "obix/objects/time"
11
+ autoload :Date, "obix/objects/date"
12
+ autoload :List, "obix/objects/list"
13
+ autoload :Operation, "obix/objects/operation"
14
+ autoload :Duration, "obix/objects/duration"
15
+ autoload :URI, "obix/objects/uri"
16
+ autoload :Reference, "obix/objects/reference"
17
+ autoload :Error, "obix/objects/error"
18
+ autoload :Feed, "obix/objects/feed"
19
+
20
+ @objects = [
21
+ Object, Float, Integer, Boolean, String, Enumerable, Time,
22
+ Date, List, Operation, Duration, URI, Reference, Error, Feed
23
+ ]
24
+
25
+ # List objects.
26
+ #
27
+ # Returns an array of OBIX::Objects::Object instances or derivatives thereof.
28
+ def self.list
29
+ @objects
30
+ end
31
+
32
+ # Find an object by the given tag.
33
+ #
34
+ # tag - A String or Symbol describing a tag.
35
+ #
36
+ # Returns a derivative of OBIX::Objects::Base.
37
+ def self.find tag
38
+ object = @objects.find do |object|
39
+ object.new.tag.to_s == tag.to_s
40
+ end or raise OBIX::Objects::UnknownObjectError, "Unknown element '#{tag}'"
41
+ end
42
+
43
+ class UnknownObjectError < StandardError; end
44
+ end
45
+ end
46
+
@@ -0,0 +1,97 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ class Base
5
+ extend Tag
6
+
7
+ attr_accessor :objects, :parent
8
+
9
+ def initialize &block
10
+ @attributes = {}
11
+ @objects = []
12
+
13
+ if block_given?
14
+ builder = OBIX::Builder.new self, &block
15
+
16
+ @objects = builder.objects
17
+ end
18
+ end
19
+
20
+ # Find the object by the given name.
21
+ #
22
+ # name - A String or Symbol describing the "name" attribute of an object.
23
+ def find name
24
+ object = objects.find { |o| o.name == name.to_s }
25
+ end
26
+
27
+ # Serialize the object as a Nokogiri::XML::Node.
28
+ def to_node
29
+ Nokogiri::XML::Builder.new do |xml|
30
+ build xml
31
+ end.doc.root
32
+ end
33
+
34
+ # Serialize the object as an XML String.
35
+ def to_xml
36
+ to_node.document.to_xml
37
+ end
38
+
39
+ # Serialize the object as a human-readable String.
40
+ def to_s
41
+ attributes = @attributes.map do |key, value|
42
+ "#{key}: \"#{value}\""
43
+ end.join " "
44
+
45
+ "#<#{self.class} #{attributes}>"
46
+ end
47
+
48
+ class << self
49
+
50
+ # Parse an XML element as OBIX.
51
+ #
52
+ # element - A Nokogiri::XML::Node describing an element.
53
+ # parent - An Objects::Object instance or derivative thereof describing
54
+ # the object's parent.
55
+ #
56
+ # Returns an Object instance or derivative thereof.
57
+ def parse element, parent = nil
58
+ klass = Objects.find element.name
59
+
60
+ object = klass.new
61
+
62
+ element.attributes.each do |name, attribute|
63
+ object.send "#{name.underscore}=", attribute.value unless attribute.namespace
64
+ end
65
+
66
+ element.children.each do |child|
67
+ object.objects.push parse(child, object) unless child.is_a? Nokogiri::XML::Text
68
+ end
69
+
70
+ object.parent = parent
71
+
72
+ if object.is_a? Error
73
+ object.raise
74
+ end
75
+
76
+ object
77
+ end
78
+
79
+ end
80
+
81
+ protected
82
+
83
+ # Build the object as an element in a tree.
84
+ #
85
+ # xml - A Nokogiri::XML::Builder instance.
86
+ def build builder
87
+ builder.send tag, @attributes do |builder|
88
+ objects.each do |object|
89
+ object.build builder
90
+ end
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ end
97
+ end
@@ -0,0 +1,13 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # Booleans represent a boolean condition of either true or false.
5
+ class Boolean < Object
6
+ tag :bool
7
+
8
+ attribute :val, type: Types::Boolean, default: false
9
+ attribute :range, type: Types::URI
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # Dates represent a day in time.
5
+ class Date < Object
6
+ tag :date
7
+
8
+ attribute :val, type: Types::Date, default: nil
9
+ attribute :min, type: Types::Date
10
+ attribute :max, type: Types::Date
11
+ attribute :tz, type: Types::String
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # Durations represent a relative duration of time.
5
+ class Duration < Object
6
+ tag :reltime
7
+
8
+ attribute :val, type: Types::Duration, default: 0
9
+ attribute :min, type: Types::Duration
10
+ attribute :max, type: Types::Duration
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # Enumerables represent a value which must match a finite set of values.
5
+ class Enumerable < Object
6
+ tag :enum
7
+
8
+ attribute :val, type: Types::String, default: nil
9
+ attribute :range, type: Types::String
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,26 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # Errors represent errors.
5
+ class Error < Object
6
+ tag :err
7
+
8
+ # Raise an exception with this error.
9
+ def raise
10
+ klass = case is
11
+ when "obix:BadUriErr"
12
+ OBIX::BadURIError
13
+ when "obix:UnsupportedErr"
14
+ OBIX::UnsupportedError
15
+ when "obix:PermissionErr"
16
+ OBIX::PermissionError
17
+ else
18
+ OBIX::Error
19
+ end
20
+
21
+ super klass, self.to_xml
22
+ end
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,14 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # Lists represent a collection of other objects.
5
+ class Feed < Object
6
+ tag :feed
7
+
8
+ attribute :in, type: Types::String
9
+ attribute :of, type: Types::String
10
+ end
11
+
12
+ end
13
+ end
14
+
@@ -0,0 +1,16 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # Floats represent floating point numbers.
5
+ class Float < Object
6
+ tag :real
7
+
8
+ attribute :val, type: Types::Float, default: 0.0
9
+ attribute :min, type: Types::Float
10
+ attribute :max, type: Types::Float
11
+ attribute :unit, type: Types::String
12
+ attribute :precision, type: Types::Integer
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # Integers represent an integer number.
5
+ class Integer < Object
6
+ tag :int
7
+
8
+ attribute :val, type: Types::Integer, default: 0
9
+ attribute :min, type: Types::Integer
10
+ attribute :max, type: Types::Integer
11
+ attribute :unit, type: Types::String
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # Lists represent a collection of other objects.
5
+ class List < Object
6
+ tag :list
7
+
8
+ attribute :of, type: Types::String
9
+ attribute :min, type: Types::Integer
10
+ attribute :max, type: Types::Integer
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # Objects are the root abstraction in oBIX.
5
+ class Object < Base
6
+ tag :obj
7
+
8
+ attribute :name, type: Types::String
9
+ attribute :href, type: Types::URI, default: ""
10
+ attribute :is, type: Types::String
11
+ attribute :null, type: Types::Boolean
12
+ attribute :icon, type: Types::String
13
+ attribute :display_name, type: Types::String
14
+ attribute :display, type: Types::String
15
+ attribute :writable, type: Types::Boolean
16
+ attribute :status, type: Types::String
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ require "net/http"
2
+
3
+ module OBIX
4
+ module Objects
5
+
6
+ # Operations represent operations.
7
+ class Operation < Object
8
+ tag :op
9
+
10
+ attribute :in, type: Types::String
11
+ attribute :out, type: Types::String
12
+
13
+ # Invoke the operation.
14
+ #
15
+ # object - An OBIX::Objects::Object or derivative thereof. Defaults to an object
16
+ # that implements the "obix:Nil" contract.
17
+ #
18
+ # Returns an OBIX::Objects::Object or derivative thereof describing
19
+ # the result of the operation.
20
+ def invoke object = OBIX::Objects::Object.new
21
+ string = Network.post href, object
22
+
23
+ OBIX.parse string: string
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # References represent references to another oBIX document.
5
+ class Reference < Object
6
+ tag :ref
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ module OBIX
2
+ module Objects
3
+
4
+ # Strings represent strings of characters.
5
+ class String < Object
6
+ tag :str
7
+
8
+ attribute :val, type: Types::String, default: ""
9
+ attribute :min, type: Types::Integer
10
+ attribute :max, type: Types::Integer
11
+ end
12
+
13
+ end
14
+ end