green-button-data 0.2.1 → 0.3.0

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 (54) hide show
  1. checksums.yaml +13 -5
  2. data/README.md +116 -8
  3. data/green-button-data.gemspec +6 -1
  4. data/lib/green-button-data.rb +26 -1
  5. data/lib/green-button-data/application_information.rb +112 -0
  6. data/lib/green-button-data/authorization.rb +35 -0
  7. data/lib/green-button-data/configuration.rb +133 -0
  8. data/lib/green-button-data/core_ext.rb +1 -0
  9. data/lib/green-button-data/core_ext/string.rb +35 -0
  10. data/lib/green-button-data/dst.rb +57 -0
  11. data/lib/green-button-data/entry.rb +87 -0
  12. data/lib/green-button-data/feed.rb +5 -0
  13. data/lib/green-button-data/fetchable.rb +242 -0
  14. data/lib/green-button-data/interval_block.rb +38 -0
  15. data/lib/green-button-data/local_time_parameters.rb +31 -0
  16. data/lib/green-button-data/meter_reading.rb +4 -0
  17. data/lib/green-button-data/model_collection.rb +33 -0
  18. data/lib/green-button-data/parser/application_information.rb +2 -11
  19. data/lib/green-button-data/parser/authorization.rb +0 -4
  20. data/lib/green-button-data/parser/interval.rb +8 -4
  21. data/lib/green-button-data/parser/interval_reading.rb +4 -1
  22. data/lib/green-button-data/parser/local_time_parameters.rb +0 -57
  23. data/lib/green-button-data/parser/summary_measurement.rb +12 -0
  24. data/lib/green-button-data/reading_type.rb +82 -0
  25. data/lib/green-button-data/relations.rb +24 -0
  26. data/lib/green-button-data/usage_point.rb +27 -0
  27. data/lib/green-button-data/usage_summary.rb +36 -0
  28. data/lib/green-button-data/utilities.rb +27 -0
  29. data/lib/green-button-data/version.rb +1 -1
  30. data/spec/fixtures.rb +5 -0
  31. data/spec/fixtures/ESPIReadingType.xml +23 -535
  32. data/spec/fixtures/ESPIReadingTypes.xml +535 -0
  33. data/spec/fixtures/ESPIUsagePoint.xml +3 -3
  34. data/spec/fixtures/ESPIUsagePointMeterReading.xml +13 -0
  35. data/spec/fixtures/ESPIUsagePointMeterReadings.xml +21 -0
  36. data/spec/fixtures/ESPIUsagePoints.xml +822 -0
  37. data/spec/lib/green-button-data/application_information_spec.rb +389 -0
  38. data/spec/lib/green-button-data/authorization_spec.rb +91 -0
  39. data/spec/{green-button-data → lib/green-button-data}/core_ext/date_spec.rb +0 -0
  40. data/spec/{green-button-data → lib/green-button-data}/core_ext/fixnum_spec.rb +0 -0
  41. data/spec/lib/green-button-data/local_time_parameters_spec.rb +106 -0
  42. data/spec/{green-button-data → lib/green-button-data}/parser/application_information_spec.rb +4 -4
  43. data/spec/{green-button-data → lib/green-button-data}/parser/authorization_spec.rb +0 -12
  44. data/spec/{green-button-data → lib/green-button-data}/parser/entry_spec.rb +1 -1
  45. data/spec/{green-button-data → lib/green-button-data}/parser/interval_block_spec.rb +4 -4
  46. data/spec/{green-button-data → lib/green-button-data}/parser/local_time_parameter_spec.rb +0 -0
  47. data/spec/{green-button-data → lib/green-button-data}/parser/reading_type_spec.rb +0 -0
  48. data/spec/{green-button-data → lib/green-button-data}/parser/usage_point_spec.rb +0 -0
  49. data/spec/{green-button-data → lib/green-button-data}/parser/usage_summary_spec.rb +0 -0
  50. data/spec/lib/green-button-data/reading_type_spec.rb +127 -0
  51. data/spec/lib/green-button-data/usage_point_spec.rb +167 -0
  52. data/spec/{green-button-data → lib/green-button-data}/utilities_spec.rb +1 -1
  53. data/spec/spec_helper.rb +5 -0
  54. metadata +70 -17
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 943fa4496c7abd93c91c099eecc7f8da6f7b1183
4
- data.tar.gz: 686f00fc33360e511ec3db4a79f901397dcf39d1
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MGE1ZDYxMWY2OWQ5ZjdiZTk1OWM2ZmEzZTdhMzg5OGVhMzRkZDk5Mw==
5
+ data.tar.gz: !binary |-
6
+ M2I1ZjllMGUzOWEzMjk5MDgwODY0YjFiYTQxY2Y4M2Y2NTA0ZWNhZQ==
5
7
  SHA512:
6
- metadata.gz: c7f6738ec44e9a2a3d2fcff1abfb89e87f814782675fc4d734a8bc9fc99c8177aec1b7f906931a07b5e44bf73dc483b68a9973d4850417ce0863a8d3a7e85465
7
- data.tar.gz: e1113a4af39451f38be1eeacfc7841772302d141159b10bc4f91cc00129971e4b81b10243c022f0d1f66303b0e80b8afa1843e1810ec7000208660d71c829f80
8
+ metadata.gz: !binary |-
9
+ YmVkYzZjMzFmNDYwMzY4NTE5MzM0ZGU3MTkzODI4ZjdjMDUwMGUzYjRiZjQ0
10
+ ZjcwYzY3ZjYzOTJlNzE2YTYwYmY1OTVjMWQ2NTdmODQ1MTA1ZDg0MDhjM2Ni
11
+ MjhjNTJiYzhlYzVmYTY4ZTFlZWM4YmUxZWE2ODA4ZTU5MjJmMjQ=
12
+ data.tar.gz: !binary |-
13
+ YmM1OTAzZjE4OTIzMzg4ZDQ5YWIxMWViY2ZjOGQ1M2RkMDc3ODY5ZTRlNDg0
14
+ OWU5YzQwNzUwMjQ0OWEwNzZlMjJmMzJmY2RhNDNkODllNTI3Y2NjZDE1NTQ1
15
+ NmZiMWJjMWI1YmE4YTc1MzNkZTgwNjUyNTJlYmVmOWJjNzZjZTc=
data/README.md CHANGED
@@ -1,15 +1,15 @@
1
1
  # Green Button Data
2
2
 
3
- [![CI Results](https://img.shields.io/circleci/project/VerdigrisTech/green-button-data.svg)](https://circleci.com/gh/VerdigrisTech/green-button-data)
4
3
  [![Gem Version](https://img.shields.io/gem/v/green-button-data.svg)](https://rubygems.org/gems/green-button-data)
4
+ [![CI Results](https://img.shields.io/circleci/project/VerdigrisTech/green-button-data.svg)](https://circleci.com/gh/VerdigrisTech/green-button-data)
5
5
  [![Dependencies](https://img.shields.io/gemnasium/VerdigrisTech/green-button-data.svg)](https://gemnasium.com/VerdigrisTech/green-button-data)
6
- [![Code Coverage](https://img.shields.io/codecov/c/github/VerdigrisTech/green-button-data.svg)](https://codecov.io/github/VerdigrisTech/green-button-data)
7
6
  [![Code Climate](https://img.shields.io/codeclimate/github/VerdigrisTech/green-button-data.svg)](https://codeclimate.com/github/VerdigrisTech/green-button-data)
7
+ [![Code Coverage](https://img.shields.io/codecov/c/github/VerdigrisTech/green-button-data.svg)](https://codecov.io/github/VerdigrisTech/green-button-data)
8
8
 
9
- Green Button Data is a Ruby gem that can quickly parse the Green Button data
10
- standard. It uses an event-driven <abbr title="Simple API for XML">SAX</abbr>
11
- parser which does not build the entire <abbr title="Document Object Model">DOM</abbr>
12
- in memory.
9
+ Green Button Data is a Ruby gem that can consume Green Button APIs and parse
10
+ the Green Button data XML schema very quickly. It uses an event-driven
11
+ <abbr title="Simple API for XML">SAX</abbr> parser which parses XML data without
12
+ building an entire <abbr title="Document Object Model">DOM</abbr> in memory.
13
13
 
14
14
  ## Getting Started
15
15
 
@@ -25,7 +25,100 @@ Then run Bundler:
25
25
  $ bundle
26
26
  ```
27
27
 
28
- ## Usage
28
+ Unless you have a project that auto loads all gems in the Gemfile (e.g. a Rails
29
+ project), you will need to require it:
30
+
31
+ ```ruby
32
+ require 'green-button-data'
33
+ ```
34
+
35
+ This will expose the GreenButtonData module namespace.
36
+
37
+ ## Integrating GreenButtonData Into Your Application
38
+
39
+ GreenButtonData gem provides a familiar interface to consuming API endpoints.
40
+ Method names are similar to Rails' ActiveRecord models and can be easily
41
+ integrated into existing applications.
42
+
43
+ ### Configuration
44
+
45
+ You can add configuration options like the following:
46
+
47
+ ```ruby
48
+ GreenButtonData.configure do |config|
49
+ config.base_url = "https://api.example.com/DataCustodian/espi/1_1/resource/"
50
+ config.application_information_path = "ApplicationInformation/"
51
+ config.authorization_path = "Authorization/"
52
+ config.subscription_path = "Subscription/"
53
+ config.usage_point_path = "UsagePoint/"
54
+ end
55
+ ```
56
+
57
+ Note that each path _must_ end with a trailing slash.
58
+
59
+ #### Rails Integration
60
+
61
+ If you are developing a Rails app, create a file at
62
+ `config/initializers/green_button_data.rb` from your Rails project root and
63
+ add the configuration there.
64
+
65
+ ## Green Button Data API Client
66
+
67
+ Green Button Data specification states that all API endpoints be secured with
68
+ OAuth2 which means most fetch operations will require auth tokens.
69
+
70
+ Some endpoints are secured further by utilizing client SSL certificates (e.g.
71
+ Pacific Gas & Electric). You may pass in `ssl` options in addition to
72
+ the `token` option in this case.
73
+
74
+ > **DISCLAIMER:** Green Button Data is **_NOT_** responsible for managing OAuth
75
+ tokens to make authenticated requests. There are other gems that provide mature,
76
+ production proven OAuth 2 functionalities such as [OmniAuth](https://github.com/intridea/omniauth).
77
+
78
+ ### List all entries
79
+
80
+ By default, the `.all` method attempts to use the URL path set by configuration:
81
+
82
+ ```ruby
83
+ require 'green-button-data'
84
+
85
+ # Ideally obtained from OmniAuth gem
86
+ access_token = "12345678-1024-2048-abcdef001234"
87
+
88
+ # Return all usage points; URL is specified in GreenButtonData.configuration.usage_point_url
89
+ usage_points = UsagePoint.all token: access_token
90
+ ```
91
+
92
+ You may override the global configuration by specifying the URL in the method:
93
+
94
+ ```ruby
95
+ usage_points = UsagePoint.all "https://someotherapi.org/espi/Authorization",
96
+ token: access_token
97
+ ```
98
+
99
+ ### Find an entry by ID
100
+
101
+ If you have URL defined in configuration, the `.find` method appends the ID to
102
+ the URL:
103
+
104
+ ```ruby
105
+ GreenButtonData.configure do |config|
106
+ config.base_url = "https://services.greenbuttondata.org/"
107
+ config.usage_point_path = "DataCustodian/espi/1_1/resource/UsagePoint/"
108
+ end
109
+
110
+ # GET request to https://services.greenbuttondata.org/DataCustodian/espi/1_1/resource/UsagePoint/2
111
+ usage_point = GreenButtonData::UsagePoint.find 2, token: access_token
112
+ ```
113
+
114
+ As with `.all` method, URL can be overridden per request in `.find`:
115
+
116
+ ```ruby
117
+ usage_point = GreenButtonData::UsagePoint.find "https://someotherapi.org/espi/UsagePoint/1",
118
+ token: access_token
119
+ ```
120
+
121
+ ## Parsing
29
122
 
30
123
  Almost all of the functionality for parsing data is wrapped in the
31
124
  `GreenButtonData::Feed` class.
@@ -61,6 +154,21 @@ end
61
154
  4. Push the branch: `git push origin my-awesome-feature`
62
155
  5. Submit a pull request
63
156
 
157
+ ## Versioning
158
+
159
+ Green Button Data gem follows [Semantic Versioning 2.0](http://semver.org/). As
160
+ such, you can specify a pessimistic version constraint on this gem with two
161
+ digits of precision and be guaranteed latest features and bug fixes without
162
+ backwards breaking changes:
163
+
164
+ ```ruby
165
+ gem 'green-button-data', '~> 0.1'
166
+ ```
167
+
168
+ Exception to this rule as per the SemVer specification is major version zero for
169
+ initial development. This gem's API should NOT be considered stable until 1.0
170
+ release.
171
+
64
172
  ## License
65
173
 
66
174
  This software is distributed AS IS WITHOUT WARRANTY under [Simplified BSD](https://raw.githubusercontent.com/VerdigrisTech/green-button-data/master/LICENSE.txt)
@@ -70,4 +178,4 @@ Verdigris Technologies Inc. assumes NO RESPONSIBILITY OR LIABILITY
70
178
  UNDER ANY CIRCUMSTANCES for usage of this software. See the [LICENSE.txt](https://raw.githubusercontent.com/VerdigrisTech/green-button-data/master/LICENSE.txt)
71
179
  file for detailed legal information.
72
180
 
73
- Copyright © 2015, Verdigris Technologies Inc. All rights reserved.
181
+ Copyright © 2015, [Verdigris Technologies Inc](http://verdigris.co). All rights reserved.
@@ -10,7 +10,10 @@ Gem::Specification.new do |s|
10
10
  s.licenses = ['BSD-2-Clause']
11
11
 
12
12
  s.summary = 'Parser for Green Button data format'
13
- s.description = 'A library to parse large Green Button feed quickly'
13
+ s.description = 'Green Button Data is a Ruby gem that can consume Green ' +
14
+ 'Button APIs and parse the Green Button data XML schema ' +
15
+ 'very quickly. It uses an event-driven SAX parser which ' +
16
+ 'parses XML data without building an entire DOM in memory.'
14
17
 
15
18
  s.files = `git ls-files`.split("\n")
16
19
  s.require_paths = ['lib']
@@ -20,7 +23,9 @@ Gem::Specification.new do |s|
20
23
 
21
24
  s.add_dependency 'nokogiri', '~> 1.6'
22
25
  s.add_dependency 'sax-machine', '~> 1.3'
26
+ s.add_dependency 'faraday', '~> 0.9'
23
27
 
24
28
  s.add_development_dependency 'rspec', '~> 3.0'
29
+ s.add_development_dependency 'webmock', '~> 1.21'
25
30
  s.add_development_dependency 'guard', '~>2.13'
26
31
  end
@@ -1,11 +1,36 @@
1
1
  require 'sax-machine'
2
+ require 'faraday'
2
3
 
3
4
  require 'green-button-data/core_ext'
5
+ require 'green-button-data/configuration'
6
+ require 'green-button-data/utilities'
4
7
  require 'green-button-data/dst'
5
8
  require 'green-button-data/enumerations'
6
- require 'green-button-data/utilities'
7
9
  require 'green-button-data/parser'
8
10
  require 'green-button-data/feed'
11
+ require 'green-button-data/relations'
12
+ require 'green-button-data/model_collection'
13
+ require 'green-button-data/fetchable'
14
+ require 'green-button-data/entry'
15
+ require 'green-button-data/application_information'
16
+ require 'green-button-data/authorization'
17
+ require 'green-button-data/interval_block'
18
+ require 'green-button-data/local_time_parameters'
19
+ require 'green-button-data/meter_reading'
20
+ require 'green-button-data/reading_type'
21
+ require 'green-button-data/usage_point'
22
+ require 'green-button-data/usage_summary'
9
23
 
10
24
  module GreenButtonData
25
+ class << self
26
+ attr_writer :configuration
27
+ end
28
+
29
+ def self.configuration
30
+ @configuration ||= Configuration.new
31
+ end
32
+
33
+ def self.configure
34
+ yield configuration
35
+ end
11
36
  end
@@ -0,0 +1,112 @@
1
+ module GreenButtonData
2
+ class ApplicationInformation < Entry
3
+ include Enumerations
4
+ include Utilities
5
+
6
+ attr_accessor :authorization_server_authorization_endpoint,
7
+ :authorization_server_registration_endpoint,
8
+ :authorization_server_token_endpoint,
9
+ :authorization_server_uri,
10
+ :contacts,
11
+ :client_id,
12
+ :client_name,
13
+ :client_secret,
14
+ :data_custodian_bulk_request_uri,
15
+ :data_custodian_id,
16
+ :data_custodian_resource_endpoint,
17
+ :data_custodian_scope_selection_screen_uri,
18
+ :grant_types,
19
+ :redirect_uri,
20
+ :registration_access_token,
21
+ :registration_client_uri,
22
+ :response_types,
23
+ :scopes,
24
+ :software_id,
25
+ :software_version,
26
+ :third_party_application_description,
27
+ :third_party_notify_uri,
28
+ :third_party_phone,
29
+ :third_party_scope_selection_screen_uri,
30
+ :third_party_user_portal_screen_uri,
31
+ :token_endpoint_auth_method
32
+
33
+ def client_id_issued_at(kwargs = {})
34
+ epoch_to_time @client_id_issued_at, kwargs
35
+ end
36
+
37
+ def client_secret_expires_at(kwargs = {})
38
+ if @client_secret_expires_at == 0
39
+ # Maximum Fixnum = 4611686018427387903
40
+ max_fixnum = 2 ** (@client_secret_expires_at.size * 8 - 2) - 1
41
+
42
+ # Roughly 146 billion years into the future; Sun would be long dead by
43
+ # this time; so for all intents and purposes, never expires
44
+ time = Time.at(max_fixnum)
45
+
46
+ if kwargs[:local] == true
47
+ return time.localtime
48
+ else
49
+ return time.utc
50
+ end
51
+ else
52
+ epoch_to_time(@client_secret_expires_at, kwargs)
53
+ end
54
+ end
55
+
56
+ def data_custodian_application_status
57
+ get_enum_symbol DATA_CUSTODIAN_APPLICATION_STATUS,
58
+ @data_custodian_application_status
59
+ end
60
+
61
+ def third_party_application_type
62
+ get_enum_symbol THIRD_PARTY_APPLICATION_TYPE,
63
+ @third_party_application_type
64
+ end
65
+
66
+ def third_party_application_use
67
+ get_enum_symbol THIRD_PARTY_APPLICATION_USE, @third_party_application_use
68
+ end
69
+
70
+ def to_h
71
+ {
72
+ authorization_server_authorization_endpoint:
73
+ authorization_server_authorization_endpoint,
74
+ authorization_server_registration_endpoint:
75
+ authorization_server_registration_endpoint,
76
+ authorization_server_token_endpoint:
77
+ authorization_server_token_endpoint,
78
+ authorization_server_uri: authorization_server_uri,
79
+ contacts: contacts,
80
+ client_id: client_id,
81
+ client_id_issued_at: client_id_issued_at,
82
+ client_name: client_name,
83
+ client_secret: client_secret,
84
+ client_secret_expires_at: client_secret_expires_at,
85
+ data_custodian_application_status: data_custodian_application_status,
86
+ data_custodian_bulk_request_uri: data_custodian_bulk_request_uri,
87
+ data_custodian_id: data_custodian_id,
88
+ data_custodian_resource_endpoint: data_custodian_resource_endpoint,
89
+ data_custodian_scope_selection_screen_uri:
90
+ data_custodian_scope_selection_screen_uri,
91
+ grant_types: grant_types,
92
+ redirect_uri: redirect_uri,
93
+ registration_access_token: registration_access_token,
94
+ registration_client_uri: registration_client_uri,
95
+ response_types: response_types,
96
+ scopes: scopes,
97
+ software_id: software_id,
98
+ software_version: software_version,
99
+ third_party_application_description:
100
+ third_party_application_description,
101
+ third_party_application_type: third_party_application_type,
102
+ third_party_application_use: third_party_application_use,
103
+ third_party_notify_uri: third_party_notify_uri,
104
+ third_party_phone: third_party_phone,
105
+ third_party_scope_selection_screen_uri:
106
+ third_party_scope_selection_screen_uri,
107
+ third_party_user_portal_screen_uri: third_party_user_portal_screen_uri,
108
+ token_endpoint_auth_method: token_endpoint_auth_method
109
+ }
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,35 @@
1
+ module GreenButtonData
2
+ class Authorization < Entry
3
+ include Enumerations
4
+ include Utilities
5
+
6
+ attr_reader :id
7
+
8
+ attr_accessor :authorized_period,
9
+ :published_period,
10
+ :expires_at,
11
+ :status,
12
+ :resource_uri,
13
+ :authorization_uri
14
+
15
+ def active?
16
+ @status > 0
17
+ end
18
+
19
+ def expires_at
20
+ if @expires_at.is_a? Numeric
21
+ epoch_to_time @expires_at
22
+ elsif @expires_at.is_a? String
23
+ parse_datetime(@expires_at).to_time
24
+ elsif @expires_at.respond_to? :to_time
25
+ @expires_at.to_time
26
+ else
27
+ raise "Invalid expires_at type"
28
+ end
29
+ end
30
+
31
+ def status
32
+ get_enum_symbol AUTHORIZATION_STATUS, @status
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,133 @@
1
+ require 'uri'
2
+
3
+ module GreenButtonData
4
+ class Configuration
5
+ attr_accessor :base_url,
6
+ :application_information_path,
7
+ :authorization_path,
8
+ :interval_block_path,
9
+ :local_time_parameters_path,
10
+ :meter_reading_path,
11
+ :reading_type_path,
12
+ :subscription_path,
13
+ :usage_point_path,
14
+ :usage_summary_path
15
+
16
+ def application_information_url
17
+ return URI.join(@base_url, @application_information_path).to_s
18
+ end
19
+
20
+ def application_information_url=(url)
21
+ uri = URI.parse url
22
+ @base_url = "#{uri.scheme}://#{uri.host}"
23
+ @application_information_path = uri.path
24
+ end
25
+
26
+ def authorization_url
27
+ return URI.join(@base_url, @authorization_path).to_s
28
+ end
29
+
30
+ def authorization_url=(url)
31
+ uri = URI.parse url
32
+ @base_url = "#{uri.scheme}://#{uri.host}"
33
+ @authorization_path = uri.path
34
+ end
35
+
36
+ def interval_block_url(kwargs = {})
37
+ subscription_id = kwargs[:subscription_id]
38
+ usage_point_id = kwargs[:usage_point_id]
39
+ meter_reading_id = kwargs[:meter_reading_id]
40
+ interval_block_id = kwargs[:interval_block_id]
41
+
42
+ uri = if subscription_id && usage_point_id && meter_reading_id
43
+ meter_reading_uri = meter_reading_url(
44
+ subscription_id: subscription_id,
45
+ usage_point_id: usage_point_id,
46
+ meter_reading_id: meter_reading_id
47
+ )
48
+
49
+ URI.join meter_reading_uri, @interval_block_path
50
+ else
51
+ URI.join @base_url, @interval_block_path
52
+ end
53
+
54
+ uri = URI.join uri, "#{interval_block_id}/" if interval_block_id
55
+
56
+ return uri.to_s
57
+ end
58
+
59
+ def local_time_parameters_url
60
+ return URI.join @base_url, @local_time_parameters_path
61
+ end
62
+
63
+ def meter_reading_url(kwargs = {})
64
+ subscription_id = kwargs[:subscription_id]
65
+ usage_point_id = kwargs[:usage_point_id]
66
+ meter_reading_id = kwargs[:meter_reading_id]
67
+
68
+ uri = if subscription_id && usage_point_id
69
+ usage_point_uri = usage_point_url(
70
+ subscription_id: subscription_id,
71
+ usage_point_id: usage_point_id
72
+ )
73
+
74
+ URI.join usage_point_uri, @meter_reading_path
75
+ else
76
+ URI.join @base_url, @meter_reading_path
77
+ end
78
+
79
+ uri = URI.join uri, "#{meter_reading_id}/" if meter_reading_id
80
+
81
+ return uri.to_s
82
+ end
83
+
84
+ def reading_type_url(id = nil)
85
+ uri = URI.join @base_url, @reading_type_path
86
+ uri = URI.join uri, "#{id}/" if id
87
+
88
+ return uri.to_s
89
+ end
90
+
91
+ def subscription_url(id)
92
+ uri = URI.join @base_url, @subscription_path
93
+ uri = URI.join uri, "#{id}/" if id
94
+ return uri.to_s
95
+ end
96
+
97
+ def usage_point_url(kwargs = {})
98
+ subscription_id = kwargs[:subscription_id]
99
+ usage_point_id = kwargs[:usage_point_id]
100
+
101
+ uri = if subscription_id
102
+ subscription_uri = subscription_url subscription_id
103
+
104
+ URI.join subscription_uri, @usage_point_path
105
+ else
106
+ URI.join @base_url, @usage_point_path
107
+ end
108
+
109
+ uri = URI.join uri, "#{usage_point_id}/" if usage_point_id
110
+
111
+ return uri.to_s
112
+ end
113
+
114
+ def usage_summary_url(kwargs = {})
115
+ subscription_id = kwargs[:subscription_id]
116
+ usage_point_id = kwargs[:usage_point_id]
117
+
118
+ if subscription_id && usage_point_id
119
+ usage_point_uri = usage_point_url subscription_id: subscription_id,
120
+ usage_point_id: usage_point_id
121
+
122
+ return URI.join(usage_point_uri, @usage_summary_path).to_s
123
+ elsif subscription_id
124
+ raise ArgumentError.new "Missing required argument: usage_point_id"
125
+ elsif usage_point_id
126
+ raise ArgumentError.new "Missing required argument: subscription_id"
127
+ else
128
+ raise ArgumentError.new "Missing required arguments: subscription_id," +
129
+ " usage_point_id"
130
+ end
131
+ end
132
+ end
133
+ end