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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +128 -0
- data/Rakefile +7 -0
- data/lib/obix.rb +55 -0
- data/lib/obix/alarms.rb +48 -0
- data/lib/obix/builder.rb +45 -0
- data/lib/obix/configuration.rb +79 -0
- data/lib/obix/errors.rb +6 -0
- data/lib/obix/history.rb +65 -0
- data/lib/obix/network.rb +76 -0
- data/lib/obix/objects.rb +46 -0
- data/lib/obix/objects/base.rb +97 -0
- data/lib/obix/objects/boolean.rb +13 -0
- data/lib/obix/objects/date.rb +15 -0
- data/lib/obix/objects/duration.rb +14 -0
- data/lib/obix/objects/enumerable.rb +13 -0
- data/lib/obix/objects/error.rb +26 -0
- data/lib/obix/objects/feed.rb +14 -0
- data/lib/obix/objects/float.rb +16 -0
- data/lib/obix/objects/integer.rb +15 -0
- data/lib/obix/objects/list.rb +14 -0
- data/lib/obix/objects/object.rb +20 -0
- data/lib/obix/objects/operation.rb +28 -0
- data/lib/obix/objects/reference.rb +10 -0
- data/lib/obix/objects/string.rb +14 -0
- data/lib/obix/objects/time.rb +15 -0
- data/lib/obix/objects/uri.rb +13 -0
- data/lib/obix/tag.rb +43 -0
- data/lib/obix/types.rb +15 -0
- data/lib/obix/types/boolean.rb +25 -0
- data/lib/obix/types/date.rb +20 -0
- data/lib/obix/types/duration.rb +21 -0
- data/lib/obix/types/float.rb +18 -0
- data/lib/obix/types/integer.rb +18 -0
- data/lib/obix/types/string.rb +18 -0
- data/lib/obix/types/time.rb +20 -0
- data/lib/obix/types/type.rb +17 -0
- data/lib/obix/types/uri.rb +28 -0
- data/lib/obix/version.rb +3 -0
- data/lib/obix/watch.rb +119 -0
- data/obix.gemspec +31 -0
- data/test/fixtures/alarmqueryout.xml +19 -0
- data/test/fixtures/alarmsubject.xml +5 -0
- data/test/fixtures/history.xml +9 -0
- data/test/fixtures/historyqueryout.xml +15 -0
- data/test/fixtures/invalid.xml +1 -0
- data/test/fixtures/objects/boolean.xml +1 -0
- data/test/fixtures/objects/date.xml +1 -0
- data/test/fixtures/objects/duration.xml +1 -0
- data/test/fixtures/objects/enumerable.xml +1 -0
- data/test/fixtures/objects/error.xml +1 -0
- data/test/fixtures/objects/feed.xml +4 -0
- data/test/fixtures/objects/float.xml +1 -0
- data/test/fixtures/objects/integer.xml +1 -0
- data/test/fixtures/objects/list.xml +4 -0
- data/test/fixtures/objects/object.xml +1 -0
- data/test/fixtures/objects/operation.xml +1 -0
- data/test/fixtures/objects/reference.xml +1 -0
- data/test/fixtures/objects/string.xml +1 -0
- data/test/fixtures/objects/time.xml +1 -0
- data/test/fixtures/objects/uri.xml +1 -0
- data/test/fixtures/valid.xml +11 -0
- data/test/fixtures/watch.xml +8 -0
- data/test/fixtures/watchout.xml +5 -0
- data/test/fixtures/watchservice.xml +3 -0
- data/test/obix/alarms_test.rb +36 -0
- data/test/obix/builder_test.rb +32 -0
- data/test/obix/configuration_test.rb +32 -0
- data/test/obix/history_test.rb +54 -0
- data/test/obix/network_test.rb +134 -0
- data/test/obix/objects/base_test.rb +54 -0
- data/test/obix/objects/boolean_test.rb +17 -0
- data/test/obix/objects/date_test.rb +16 -0
- data/test/obix/objects/duration_test.rb +16 -0
- data/test/obix/objects/enumerable_test.rb +17 -0
- data/test/obix/objects/error_test.rb +47 -0
- data/test/obix/objects/feed_test.rb +16 -0
- data/test/obix/objects/float_test.rb +16 -0
- data/test/obix/objects/integer_test.rb +16 -0
- data/test/obix/objects/list_test.rb +17 -0
- data/test/obix/objects/object_test.rb +17 -0
- data/test/obix/objects/operation_test.rb +37 -0
- data/test/obix/objects/reference_test.rb +16 -0
- data/test/obix/objects/string_test.rb +16 -0
- data/test/obix/objects/time_test.rb +16 -0
- data/test/obix/objects/uri_test.rb +16 -0
- data/test/obix/objects_test.rb +13 -0
- data/test/obix/tag_test.rb +42 -0
- data/test/obix/types/boolean_test.rb +18 -0
- data/test/obix/types/date_test.rb +20 -0
- data/test/obix/types/duration_test.rb +18 -0
- data/test/obix/types/float_test.rb +18 -0
- data/test/obix/types/integer_test.rb +18 -0
- data/test/obix/types/string_test.rb +18 -0
- data/test/obix/types/time_test.rb +20 -0
- data/test/obix/types/uri_test.rb +48 -0
- data/test/obix/watch_test.rb +169 -0
- data/test/obix_test.rb +42 -0
- data/test/test_helper.rb +18 -0
- metadata +357 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c01e1acd9c0991b24c9c60188e66a864760e6497
|
4
|
+
data.tar.gz: 6ab23c6b03f95b153b17bd1546a4e1c4838f753d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 17c06e109456a511132d9add1fedb40fe580b7a72f689b9fad8d76a3d336d79e38d4cfac234956b58ca4bacc565258bf576078ce3900db5a9ac1baf2e8095403
|
7
|
+
data.tar.gz: 675c562b85336c9f3c53681cee97cd1da87d10322838777cf4036d85ceb015b69d447edc61b93cc78974d18c8daca76d58c5eeb97de8f4ed14f18ba655978223
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Johannes Gorset
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
# OBIX
|
2
|
+
|
3
|
+
[](https://codeclimate.com/github/hyperoslo/obix)
|
4
|
+
|
5
|
+
Ruby OBIX parser.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'obix'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install obix
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
### Parse an object
|
24
|
+
|
25
|
+
```xml
|
26
|
+
<!-- thermostat.xml -->
|
27
|
+
<obj href="http://domain/thermostat">
|
28
|
+
<real name="spaceTemp" unit="obix:units/fahrenheit" val="67.2"/>
|
29
|
+
<real name="setpoint" unit="obix:units/fahrenheit" val="72.0"/>
|
30
|
+
<bool name="furnaceOn" val="true"/>
|
31
|
+
</obj>
|
32
|
+
```
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
# thermostat.rb
|
36
|
+
thermostat = OBIX.parse file: "thermostat.xml"
|
37
|
+
|
38
|
+
thermostat.href # => "http://domain/thermostat/"
|
39
|
+
|
40
|
+
temperature = thermostat.objects.find { |obj| obj.name == "spaceTemp" }
|
41
|
+
temperature.val # => 67.2
|
42
|
+
```
|
43
|
+
|
44
|
+
### Build an object
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
# thermostat.rb
|
48
|
+
object = OBIX::Builder.new
|
49
|
+
obj href: "http://domain/thermostat" do
|
50
|
+
real name: "spaceTemp", unit: "obix:units/fahrenheit" val: 67.2
|
51
|
+
real name: "setpoint", unit: "obix:units/fahrenheit" val: 72.0
|
52
|
+
bool name: "furnaceOn", val: true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
### Invoke an operation
|
58
|
+
|
59
|
+
```xml
|
60
|
+
<!-- furnace.xml -->
|
61
|
+
<obj href="http://domain/furnace">
|
62
|
+
<bool name="active" val="false"/>
|
63
|
+
<op name="activate" href="http://domain/furnace/activate" in="obix:Nil" out="obix:Nil"/>
|
64
|
+
<op name="deactivate" href="http://domain/furnace/deactivate" in="obix:Nil" out="obix:Nil"/>
|
65
|
+
</obj>
|
66
|
+
```
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
# furnace.rb
|
70
|
+
furnace = OBIX.parse file: "furnace.xml"
|
71
|
+
|
72
|
+
activate = furnace.objects.find { |obj| obj.name == "activate" }
|
73
|
+
activate.invoke
|
74
|
+
```
|
75
|
+
|
76
|
+
### Create a watch
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
# Create a new watch...
|
80
|
+
watch = OBIX::Watch.make url: "http://domain/watchservice"
|
81
|
+
|
82
|
+
# ... or connect to an existing watch
|
83
|
+
watch = OBIX::Watch.connect url: "http://domain/watchservice/watch1"
|
84
|
+
|
85
|
+
# Add objects to the watch
|
86
|
+
watch.add ["/thermostat", "/furnace"]
|
87
|
+
|
88
|
+
# Remove objects from the watch
|
89
|
+
watch.remove ["/furnace"]
|
90
|
+
|
91
|
+
# Poll everything
|
92
|
+
watch.all
|
93
|
+
|
94
|
+
# Poll changes
|
95
|
+
watch.changes
|
96
|
+
|
97
|
+
# Delete the watch
|
98
|
+
watch.delete
|
99
|
+
```
|
100
|
+
|
101
|
+
### Query an object's history
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
history = OBIX::History.new url: "http://domain/history"
|
105
|
+
|
106
|
+
history.query start: 2.year.ago, end: 1.year.ago
|
107
|
+
```
|
108
|
+
|
109
|
+
### Query alarms
|
110
|
+
|
111
|
+
```ruby
|
112
|
+
alarms = OBIX::Alarms.new url: "http://domain/alarmservice"
|
113
|
+
|
114
|
+
alarms.query start: 2.years.ago, end: 1.year.ago
|
115
|
+
```
|
116
|
+
|
117
|
+
## Contributing
|
118
|
+
|
119
|
+
1. Fork it
|
120
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
121
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
122
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
123
|
+
5. Create new Pull Request
|
124
|
+
|
125
|
+
## Credits
|
126
|
+
|
127
|
+
Hyper made this. We're a digital communications agency with a passion for good code,
|
128
|
+
and if you're using this library we probably want to hire you.
|
data/Rakefile
ADDED
data/lib/obix.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require "obix/version"
|
2
|
+
require "nokogiri"
|
3
|
+
require "net/http"
|
4
|
+
require "obix/errors"
|
5
|
+
|
6
|
+
module OBIX
|
7
|
+
autoload :Objects, "obix/objects"
|
8
|
+
autoload :Types, "obix/types"
|
9
|
+
autoload :Watch, "obix/watch"
|
10
|
+
autoload :Alarms, "obix/alarms"
|
11
|
+
autoload :History, "obix/history"
|
12
|
+
autoload :Tag, "obix/tag"
|
13
|
+
autoload :Builder, "obix/builder"
|
14
|
+
autoload :Configuration, "obix/configuration"
|
15
|
+
autoload :Network, "obix/network"
|
16
|
+
|
17
|
+
# Parse the given source as OBIX.
|
18
|
+
#
|
19
|
+
# source - A Hash describing the source.
|
20
|
+
# :string - A String describing oBIX data.
|
21
|
+
# :file - A String describing a file that contains oBIX data.
|
22
|
+
# :url - A String describing a URL that the oBIX data may be loaded from.
|
23
|
+
#
|
24
|
+
# Returns an OBIX::Object instance.
|
25
|
+
def self.parse source
|
26
|
+
string = source[:string]
|
27
|
+
url = source[:url]
|
28
|
+
file = source[:file]
|
29
|
+
|
30
|
+
if url
|
31
|
+
string = Network.get url
|
32
|
+
end
|
33
|
+
|
34
|
+
if file
|
35
|
+
string = File.read file
|
36
|
+
end
|
37
|
+
|
38
|
+
document = Nokogiri::XML.parse string do |config|
|
39
|
+
config.noblanks
|
40
|
+
config.strict
|
41
|
+
end
|
42
|
+
|
43
|
+
object = OBIX::Objects::Object.parse document.root
|
44
|
+
|
45
|
+
object
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.configuration
|
49
|
+
Configuration
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.configure &block
|
53
|
+
Configuration.configure &block
|
54
|
+
end
|
55
|
+
end
|
data/lib/obix/alarms.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
module OBIX
|
2
|
+
|
3
|
+
class Alarms
|
4
|
+
|
5
|
+
# Initialize an alarm service.
|
6
|
+
#
|
7
|
+
# source - A Hash of options (see OBIX#parse for details).
|
8
|
+
def initialize source
|
9
|
+
@alarms = OBIX.parse source
|
10
|
+
end
|
11
|
+
|
12
|
+
# The number of alarms.
|
13
|
+
#
|
14
|
+
# Returns an Integer.
|
15
|
+
def count
|
16
|
+
@alarms.objects.find { |o| o.name == "count" }.val
|
17
|
+
end
|
18
|
+
|
19
|
+
# Query alarms.
|
20
|
+
#
|
21
|
+
# options - A Hash of options:
|
22
|
+
# :start - A DateTime instance describing the earliest time to query history for.
|
23
|
+
# :end - A DateTime instance describing the latest time to query history for.
|
24
|
+
def query options
|
25
|
+
from = options.fetch :start
|
26
|
+
to = options.fetch :end
|
27
|
+
|
28
|
+
query = @alarms.objects.find { |o| o.name == "query" }
|
29
|
+
|
30
|
+
filter = OBIX::Builder.new do
|
31
|
+
obj do
|
32
|
+
abstime name: "start", val: from.iso8601
|
33
|
+
abstime name: "end", val: to.iso8601
|
34
|
+
end
|
35
|
+
end.object
|
36
|
+
|
37
|
+
alarms = query.invoke filter
|
38
|
+
|
39
|
+
alarms.objects.find { |o| o.name == "data" }
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_s
|
43
|
+
@alarms.to_s
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
data/lib/obix/builder.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module OBIX
|
2
|
+
|
3
|
+
class Builder
|
4
|
+
attr_reader :objects
|
5
|
+
|
6
|
+
# Initialize a new builder.
|
7
|
+
#
|
8
|
+
# parent - An Objects::Object instance or derivative thereof describing the parent
|
9
|
+
# of the object that will be built.
|
10
|
+
def initialize parent = nil, &block
|
11
|
+
@parent = parent
|
12
|
+
@objects = []
|
13
|
+
|
14
|
+
instance_eval &block
|
15
|
+
end
|
16
|
+
|
17
|
+
def object
|
18
|
+
objects.first
|
19
|
+
end
|
20
|
+
|
21
|
+
# Respond to methods matching OBIX tags.
|
22
|
+
def method_missing method, attributes = {}, &block
|
23
|
+
klass = Objects.find method
|
24
|
+
|
25
|
+
object = klass.new &block
|
26
|
+
|
27
|
+
attributes.each do |key, value|
|
28
|
+
object.send "#{key}=", value
|
29
|
+
end
|
30
|
+
|
31
|
+
object.parent = @parent
|
32
|
+
|
33
|
+
if @parent
|
34
|
+
@objects.push object
|
35
|
+
else
|
36
|
+
if @objects.empty?
|
37
|
+
@objects.push object
|
38
|
+
else
|
39
|
+
raise ArgumentError, "Object already has a root"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module OBIX
|
2
|
+
|
3
|
+
module Configuration
|
4
|
+
|
5
|
+
def self.configure &block
|
6
|
+
instance_eval &block
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.definitions
|
10
|
+
@definitions ||= {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.definitions= hash
|
14
|
+
@definitions = hash
|
15
|
+
end
|
16
|
+
|
17
|
+
# The username to use when communicating with the server.
|
18
|
+
#
|
19
|
+
# username - A String describing the username.
|
20
|
+
def self.username= username
|
21
|
+
definitions[:username] = username
|
22
|
+
end
|
23
|
+
|
24
|
+
# The username to use when communicating with the server.
|
25
|
+
def self.username
|
26
|
+
definitions[:username]
|
27
|
+
end
|
28
|
+
|
29
|
+
# The password to use when communicating with the server.
|
30
|
+
#
|
31
|
+
# password - A String describing the password.
|
32
|
+
def self.password= password
|
33
|
+
definitions[:password] = password
|
34
|
+
end
|
35
|
+
|
36
|
+
# The password to use when communicating with the server.
|
37
|
+
def self.password
|
38
|
+
definitions[:password]
|
39
|
+
end
|
40
|
+
|
41
|
+
# The scheme of the server.
|
42
|
+
#
|
43
|
+
# host - A String describing the host.
|
44
|
+
def self.scheme= scheme
|
45
|
+
definitions[:scheme] = scheme
|
46
|
+
end
|
47
|
+
|
48
|
+
# The scheme of the server.
|
49
|
+
def self.scheme
|
50
|
+
definitions[:scheme] || "http"
|
51
|
+
end
|
52
|
+
|
53
|
+
# The host of the server.
|
54
|
+
#
|
55
|
+
# host - A String describing the host.
|
56
|
+
def self.host= host
|
57
|
+
definitions[:host] = host
|
58
|
+
end
|
59
|
+
|
60
|
+
# The host of the server.
|
61
|
+
def self.host
|
62
|
+
definitions[:host]
|
63
|
+
end
|
64
|
+
|
65
|
+
# Timeout.
|
66
|
+
#
|
67
|
+
# seconds - An Integer describing timeout in seconds.
|
68
|
+
def self.timeout= seconds
|
69
|
+
definitions[:timeout] = seconds
|
70
|
+
end
|
71
|
+
|
72
|
+
# Timeout.
|
73
|
+
def self.timeout
|
74
|
+
definitions[:timeout] || 30
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/lib/obix/errors.rb
ADDED
data/lib/obix/history.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
module OBIX
|
2
|
+
|
3
|
+
class History
|
4
|
+
|
5
|
+
# Initialize a history.
|
6
|
+
#
|
7
|
+
# source - A Hash of options (see OBIX#parse for details).
|
8
|
+
def initialize source
|
9
|
+
@history = OBIX.parse source
|
10
|
+
end
|
11
|
+
|
12
|
+
# The number of history records contained by the history.
|
13
|
+
#
|
14
|
+
# Returns an Integer.
|
15
|
+
def count
|
16
|
+
@history.objects.find { |o| o.name == "count" }.val
|
17
|
+
end
|
18
|
+
|
19
|
+
# The timestamp of the oldest record contained by the history.
|
20
|
+
#
|
21
|
+
# Returns a DateTime instance.
|
22
|
+
def start
|
23
|
+
@history.objects.find { |o| o.name == "start" }.val
|
24
|
+
end
|
25
|
+
|
26
|
+
# The timestamp of the newest record contained by the history.
|
27
|
+
def end
|
28
|
+
@history.objects.find { |o| o.name == "end" }.val
|
29
|
+
end
|
30
|
+
|
31
|
+
# The timezone of the history data.
|
32
|
+
def timezone
|
33
|
+
@history.objects.find { |o| o.name == "tz" }.val
|
34
|
+
end
|
35
|
+
|
36
|
+
# Query the history records contained by the history.
|
37
|
+
#
|
38
|
+
# options - A Hash of options:
|
39
|
+
# :start - A DateTime instance describing the earliest time to query history for.
|
40
|
+
# :end - A DateTime instance describing the latest time to query history for.
|
41
|
+
def query options
|
42
|
+
from = options.fetch :start
|
43
|
+
to = options.fetch :end
|
44
|
+
|
45
|
+
query = @history.objects.find { |o| o.name == "query" }
|
46
|
+
|
47
|
+
filter = OBIX::Builder.new do
|
48
|
+
obj do
|
49
|
+
abstime name: "start", val: from.iso8601
|
50
|
+
abstime name: "end", val: to.iso8601
|
51
|
+
end
|
52
|
+
end.object
|
53
|
+
|
54
|
+
history = query.invoke filter
|
55
|
+
|
56
|
+
history.objects.find { |o| o.name == "data" }
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_s
|
60
|
+
@history.to_s
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|