chargepoint 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c3d860fa032968eb8be392dbae6dd41723dbe3be
4
+ data.tar.gz: f5a023b1277a7039890b411417773daa29260235
5
+ SHA512:
6
+ metadata.gz: 0ef914d7858e6e3b60f71738f8629959ce8f7639ccdf4627a8e97afbabd60011310cadf40572e262164ba7547e71779d3689d9328097b2483cdeb49a72274d3d
7
+ data.tar.gz: b0572f49a6f4396849c23957054f15aa5e5561e751d4f007ab1f6f12cd4d9eab0709d4a807348a74953c5a33e826ff2e15b58100ff2000c47c13e7aa9b8a7067
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1 @@
1
+ 2.2.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in chargepoint.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 TODO: Write your name
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.
@@ -0,0 +1,31 @@
1
+ # Chargepoint
2
+
3
+ A gem to wrap the ChargePoint network JSON APIs
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'chargepoint'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install chargepoint
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/purp/chargepoint/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'chargepoint/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "chargepoint"
8
+ spec.version = ChargePoint::VERSION
9
+ spec.authors = ["Jim Meyer"]
10
+ spec.email = ["jim@geekdaily.org"]
11
+ spec.summary = %q{A gem to wrap the ChargePoint network JSON APIs}
12
+ # spec.description = %q{TODO: Write a longer description. Optional.}
13
+ spec.homepage = "https://github.com/purp/chargepoint"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec", "~> 3.0"
24
+ spec.add_development_dependency "coderay", "~> 1.1" # Adds syntax highlighting in TextMate 2
25
+
26
+ spec.add_runtime_dependency "geocoder", "~> 1.2"
27
+ spec.add_runtime_dependency "mechanize", "~> 2.7"
28
+ spec.add_runtime_dependency "nokogiri", "~> 1.6"
29
+ end
@@ -0,0 +1,2 @@
1
+ require "chargepoint/version"
2
+ require "chargepoint/api"
@@ -0,0 +1,94 @@
1
+ require 'mechanize'
2
+ require 'uri'
3
+ require 'geocoder'
4
+
5
+ class ChargePoint
6
+ class API
7
+ @@authenticated = nil
8
+ @@agent = Mechanize.new { |agent|
9
+ agent.user_agent_alias = 'Mac Safari'
10
+ }
11
+
12
+ # TODO: automatically wrap these methods with authentication guard condition
13
+ AUTHENTICATED_METHODS = [:get_charge_spots]
14
+
15
+ def self.agent
16
+ @@agent
17
+ end
18
+
19
+ def self.authenticated?
20
+ !!@@authenticated
21
+ end
22
+
23
+ # TODO: automatically auth when needed and credentials available
24
+ # TODO: add method to see if authentication is still valid
25
+ def self.authenticate(params)
26
+ response = JSON[agent.post('https://na.chargepoint.com/users/validate', params).content]
27
+
28
+ @@authenticated = response['auth']
29
+ end
30
+
31
+ def self.get_charge_spots(latitude, longitude, search_radius=0.25, options={})
32
+ raise 'method requires authentication' unless authenticated?
33
+
34
+ params = params_with_filters(options)
35
+ params.merge!(search_box_for(latitude, longitude, search_radius))
36
+
37
+ uri = dashboard_uri_for_method
38
+ uri.query = URI.encode_www_form(params)
39
+
40
+ JSON[agent.get(uri.to_s).content]
41
+ end
42
+
43
+ private
44
+ def self.dashboard_uri_for_method
45
+ endpoint = caller(1)[0].scan(/\`([^']*)\'$/).flatten.first.gsub(/_([a-z])/) { $1.upcase }
46
+ URI.join('https://na.chargepoint.com/dashboard/', endpoint)
47
+ end
48
+
49
+ def self.search_box_for(latitude, longitude, search_radius)
50
+ search_box = {}
51
+
52
+ search_box[:lat], search_box[:lng] = latitude, longitude
53
+ search_box[:sw_lat], search_box[:sw_lng], search_box[:ne_lat], search_box[:ne_lng] = Geocoder::Calculations.bounding_box([latitude, longitude], search_radius)
54
+
55
+ search_box
56
+ end
57
+
58
+ def self.params_with_filters(options)
59
+ default_filters = {
60
+ :estimationfee => false,
61
+ :available => true,
62
+ :inuse => true,
63
+ :unknown => true,
64
+ :cp => true,
65
+ :other => true,
66
+ :l3 => true,
67
+ :l2 => true,
68
+ :l1 => false,
69
+ :estimate => false,
70
+ :fee => true,
71
+ :free => true,
72
+ :reservable => false,
73
+ :shared => true,
74
+ :chademo => true,
75
+ :saecombo => true,
76
+ :tesla => true,
77
+ }
78
+ default_options = {
79
+ :sort_by => 'distance',
80
+ :driver_connected_station_only => false,
81
+ :community_enabled_only => false
82
+ }
83
+
84
+ filters = default_filters.merge(options.delete(:filters) || {})
85
+
86
+ params = default_options.merge(options)
87
+ params.merge!(Hash[filters.map {|k,v| [('f_%s' % k.to_s).to_sym, v]}])
88
+
89
+ params[:_] = Time.now.to_i
90
+
91
+ params
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,3 @@
1
+ class ChargePoint
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,160 @@
1
+ def double_response(content)
2
+ double("Response", :content => content)
3
+ end
4
+
5
+ def allow_auth(auth_status=true)
6
+ response = double_response('{"auth":%s}' % auth_status)
7
+ allow(ChargePoint::API.agent).to receive(:post).with('https://na.chargepoint.com/users/validate', anything).and_return(response)
8
+ end
9
+
10
+ def expect_auth(auth_status=true)
11
+ response = double_response('{"auth":%s}' % auth_status)
12
+ expect(ChargePoint::API.agent).to receive(:post).with('https://na.chargepoint.com/users/validate', anything).and_return(response)
13
+ end
14
+
15
+ def expect_get
16
+ response = double_response('{}')
17
+ expect(ChargePoint::API.agent).to receive(:get).with(include('dashboard', 'getChargeSpots', 'f_reservable', 'community_enabled_only')).and_return(response)
18
+ end
19
+
20
+ def double_agent
21
+ @original_agent = ChargePoint::API.agent
22
+ ChargePoint::API.class_variable_set(:@@agent, double("Agent"))
23
+ end
24
+
25
+ def undouble_agent
26
+ ChargePoint::API.class_variable_set(:@@agent, @original_agent)
27
+ end
28
+
29
+ RSpec.describe ChargePoint::API do
30
+ subject {ChargePoint::API}
31
+
32
+ it {is_expected.to respond_to(:authenticate)}
33
+
34
+ it 'should have a list of methods requiring authentication' do
35
+ expect(subject::AUTHENTICATED_METHODS).to be_kind_of(Array)
36
+ end
37
+
38
+ it 'should have a Mechanize agent' do
39
+ expect(subject.agent.class).to be(Mechanize)
40
+ end
41
+
42
+ context '.dashboard_uri_for_method' do
43
+ def testing_dashboard_uri
44
+ ChargePoint::API.send(:dashboard_uri_for_method)
45
+ end
46
+
47
+ subject { @uri = testing_dashboard_uri }
48
+
49
+ it { is_expected.to be_a(URI) }
50
+
51
+ it 'should start with the dashboard URI' do
52
+ expect(subject.to_s).to start_with('https://na.chargepoint.com/dashboard/')
53
+ end
54
+
55
+ it 'should end with the calling method name camel-cased' do
56
+ expect(subject.to_s).to end_with('testingDashboardUri')
57
+ end
58
+ end
59
+
60
+ context '.search_box_for' do
61
+ it 'should have keys for center, southwest, and northeast corners' do
62
+ search_box = subject.send(:search_box_for, 0, 0, 1)
63
+ expect(search_box.keys).to contain_exactly(:lat, :lng, :sw_lat, :sw_lng, :ne_lat, :ne_lng)
64
+ end
65
+ end
66
+
67
+ context '.params_with_filters' do
68
+ before :each do |example|
69
+ options = example.metadata[:options] || {}
70
+ @params = ChargePoint::API.send(:params_with_filters, options)
71
+ end
72
+
73
+ it 'should prefix filters with f_', :options => {:filters => {:foo => true}} do
74
+ expect(@params).to include(:f_foo)
75
+ expect(@params).not_to include(:foo)
76
+ end
77
+
78
+ it 'should not prefix options', :options => {:foo => true} do
79
+ expect(@params).to include(:foo)
80
+ expect(@params).not_to include(:f_foo)
81
+ end
82
+
83
+ it 'should remove filters from options', :options => {:filters => {:foo => true}} do
84
+ expect(@params).not_to include(:filters)
85
+ end
86
+
87
+ it 'should allow override of default filters and options', :options => {:sort_by => 'awesomeness', :filters => {:l1 => true}} do
88
+ defaults = ChargePoint::API.send(:params_with_filters, {})
89
+
90
+ expect(defaults[:f_l1]).to eq(false)
91
+ expect(@params[:f_l1]).to eq(true)
92
+
93
+ expect(defaults[:sort_by]).to eq('distance')
94
+ expect(@params[:sort_by]).to eq('awesomeness')
95
+ end
96
+
97
+ it 'should add a fresh timestamp as _' do
98
+ expect(@params).to include(:_)
99
+ expect(@params[:_]).to be_within(2).of(Time.now.to_i)
100
+ end
101
+ end
102
+
103
+ context 'when not authenticated' do
104
+ before :all do
105
+ ChargePoint::API.class_variable_set(:@@authenticated, nil)
106
+ end
107
+
108
+ it {is_expected.not_to be_authenticated}
109
+
110
+ it 'should not allow authenticated methods to attempt to connect' do
111
+ expect {subject.get_charge_spots(1,2)}.to raise_error(RuntimeError, 'method requires authentication')
112
+ end
113
+ end
114
+
115
+ context 'while authenticating' do
116
+ before :each do |example|
117
+ double_agent
118
+ expect_auth(example.metadata[:auth_result])
119
+ end
120
+
121
+ after :each do
122
+ undouble_agent
123
+ end
124
+
125
+ it 'should succeed if ChargePoint says it did', :auth_result => true do
126
+ expect(subject.authenticate({})).to be_truthy
127
+ expect(subject).to be_authenticated
128
+ end
129
+
130
+ it 'should fail if ChargePoint says it did', :auth_result => false do
131
+ expect(subject.authenticate({})).to be_falsey
132
+ expect(subject).not_to be_authenticated
133
+ end
134
+ end
135
+
136
+ context 'when authenticated' do
137
+ before :all do
138
+ ChargePoint::API.class_variable_set(:@@authenticated, true)
139
+ end
140
+
141
+ subject {ChargePoint::API}
142
+
143
+ it {is_expected.to be_authenticated}
144
+
145
+ context '.get_charge_spots' do
146
+ before :each do
147
+ double_agent
148
+ expect_get
149
+ end
150
+
151
+ after :each do
152
+ undouble_agent
153
+ end
154
+
155
+ it 'should construct and call the right URL' do
156
+ expect {subject.get_charge_spots(0,0,1)}.not_to raise_error
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,5 @@
1
+ RSpec.describe ChargePoint do
2
+ it 'should have a version number' do
3
+ expect {ChargePoint::VERSION}.not_to raise_error
4
+ end
5
+ end
@@ -0,0 +1,93 @@
1
+ $:.unshift File.expand_path('./lib')
2
+
3
+ require 'chargepoint'
4
+
5
+ # This file was generated by the `rspec --init` command. Conventionally, all
6
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
7
+ # The generated `.rspec` file contains `--require spec_helper` which will cause this
8
+ # file to always be loaded, without a need to explicitly require it in any files.
9
+ #
10
+ # Given that it is always loaded, you are encouraged to keep this file as
11
+ # light-weight as possible. Requiring heavyweight dependencies from this file
12
+ # will add to the boot time of your test suite on EVERY test run, even for an
13
+ # individual file that may not need all of that loaded. Instead, consider making
14
+ # a separate helper file that requires the additional dependencies and performs
15
+ # the additional setup, and require it from the spec files that actually need it.
16
+ #
17
+ # The `.rspec` file also contains a few flags that are not defaults but that
18
+ # users commonly want.
19
+ #
20
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
21
+ RSpec.configure do |config|
22
+ # rspec-expectations config goes here. You can use an alternate
23
+ # assertion/expectation library such as wrong or the stdlib/minitest
24
+ # assertions if you prefer.
25
+ config.expect_with :rspec do |expectations|
26
+ # This option will default to `true` in RSpec 4. It makes the `description`
27
+ # and `failure_message` of custom matchers include text for helper methods
28
+ # defined using `chain`, e.g.:
29
+ # be_bigger_than(2).and_smaller_than(4).description
30
+ # # => "be bigger than 2 and smaller than 4"
31
+ # ...rather than:
32
+ # # => "be bigger than 2"
33
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
34
+ end
35
+
36
+ # rspec-mocks config goes here. You can use an alternate test double
37
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
38
+ config.mock_with :rspec do |mocks|
39
+ # Prevents you from mocking or stubbing a method that does not exist on
40
+ # a real object. This is generally recommended, and will default to
41
+ # `true` in RSpec 4.
42
+ mocks.verify_partial_doubles = true
43
+ end
44
+
45
+ # The settings below are suggested to provide a good initial experience
46
+ # with RSpec, but feel free to customize to your heart's content.
47
+ begin
48
+ # These two settings work together to allow you to limit a spec run
49
+ # to individual examples or groups you care about by tagging them with
50
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
51
+ # get run.
52
+ config.filter_run :focus
53
+ config.run_all_when_everything_filtered = true
54
+
55
+ # Limits the available syntax to the non-monkey patched syntax that is recommended.
56
+ # For more details, see:
57
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
58
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
59
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
60
+ config.disable_monkey_patching!
61
+
62
+ # This setting enables warnings. It's recommended, but in some cases may
63
+ # be too noisy due to issues in dependencies.
64
+ config.warnings = true
65
+
66
+ # Many RSpec users commonly either run the entire suite or an individual
67
+ # file, and it's useful to allow more verbose output when running an
68
+ # individual spec file.
69
+ if config.files_to_run.one?
70
+ # Use the documentation formatter for detailed output,
71
+ # unless a formatter has already been configured
72
+ # (e.g. via a command-line flag).
73
+ config.default_formatter = 'doc'
74
+ end
75
+
76
+ # Print the 10 slowest examples and example groups at the
77
+ # end of the spec run, to help surface which specs are running
78
+ # particularly slow.
79
+ # config.profile_examples = 10
80
+
81
+ # Run specs in random order to surface order dependencies. If you find an
82
+ # order dependency and want to debug it, you can fix the order by providing
83
+ # the seed, which is printed after each run.
84
+ # --seed 1234
85
+ config.order = :random
86
+
87
+ # Seed global randomization in this process using the `--seed` CLI option.
88
+ # Setting this allows you to use `--seed` to deterministically reproduce
89
+ # test failures related to randomization by passing the same `--seed` value
90
+ # as the one that triggered the failure.
91
+ Kernel.srand config.seed
92
+ end
93
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chargepoint
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jim Meyer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: coderay
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: geocoder
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.2'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: mechanize
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.7'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.7'
97
+ - !ruby/object:Gem::Dependency
98
+ name: nokogiri
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.6'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.6'
111
+ description:
112
+ email:
113
+ - jim@geekdaily.org
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rspec"
120
+ - ".ruby-version"
121
+ - Gemfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - chargepoint.gemspec
126
+ - lib/chargepoint.rb
127
+ - lib/chargepoint/api.rb
128
+ - lib/chargepoint/version.rb
129
+ - spec/chargepoint/api_spec.rb
130
+ - spec/chargepoint_spec.rb
131
+ - spec/spec_helper.rb
132
+ homepage: https://github.com/purp/chargepoint
133
+ licenses:
134
+ - MIT
135
+ metadata: {}
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubyforge_project:
152
+ rubygems_version: 2.4.5
153
+ signing_key:
154
+ specification_version: 4
155
+ summary: A gem to wrap the ChargePoint network JSON APIs
156
+ test_files:
157
+ - spec/chargepoint/api_spec.rb
158
+ - spec/chargepoint_spec.rb
159
+ - spec/spec_helper.rb