mikamai / pachubero

This URL has Read+Write access

pachubero / pachubero.rb
100644 137 lines (108 sloc) 2.18 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
require 'open-uri'
require 'net/http'
require 'rubygems'
require 'cuneiform'
require 'mockdata'
 
class Pachube
  PACHUBE_SERVER = "www.pachube.com"
  PACHUBE_BASE_URL = "http://#{PACHUBE_SERVER}/api/"
 
  attr_accessor :key
 
  def initialize key
    @key=key
  end
 
  def feed feed_no
    PachubeFeed.new(self, feed_no).refresh
  end
 
  def download_page mode, feed_no
    return MOCK_DATA[feed_no] if :mock == @key
    open(pachube_url(mode, feed_no)).read
  end
 
  def server
    "www.pachube.com"
  end
 
  def uri mode, feed_no
    "/api/#{feed_no}.#{mode}?key=#{@key}"
  end
 
private
  def pachube_url mode, feed_no
    "#{PACHUBE_BASE_URL}#{feed_no}.#{mode}?key=#{@key}"
  end
end
 
class PachubeFeed
  attr_reader :text
  
  def initialize pachube, feed_no
    @pachube = pachube
    @feed_no = feed_no
  end
 
  def refresh
    @text = @pachube.download_page :xml, @feed_no
    @feed = xml(@text).environment
  self end
 
  def data
    for i in 0...size
      yield tag(i), value(i), min(i), max(i)
    end
  end
 
  def id
    @feed.id
  end
  
  def title
    @feed.title
  end
  
  def status
    @feed.status
  end
  
  def location
    @feed.location.name
  end
  
  def latitude
    @feed.location.lat.v
  end
 
  def longitude
    @feed.location.lon.v
  end
 
  def description
    @feed.description
  end
 
  def website
    @feed.website
  end
 
  def tag num=0
    @feed.data[num].tag.v
  rescue
    nil
  end
 
  def value num=0
    @feed.data[num].value.v
  rescue
    nil
  end
 
  def min num=0
    @feed.data[num].value.minValue.v
  rescue
    nil
  end
 
  def max num=0
    @feed.data[num].value.maxValue.v
  rescue
    nil
  end
  
  def size
    @feed.data.size
  end
 
  def put(id, value)
    xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<eeml xmlns=\"http://www.eeml.org/xsd/005\">
<environment>
<data id=\"#{id}\">
<value>#{value}</value>
</data>
</environment>
</eeml>"
    client = Net::HTTP.new(@pachube.server)
    client.send_request("PUT", @pachube.uri(:xml, @feed_no), xml,
                  { 'X-PachubeApiKey' => @pachube.key,
                    'Content-Length' => xml.length.to_s
                  })
  end
 
end