bmw-connected-drive 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8b4448fb7c3ae0cfead75b9dca4784e36214cf4a
4
+ data.tar.gz: 73c99e9ad01c61030aa2c9cfdbb82693bf493577
5
+ SHA512:
6
+ metadata.gz: 26bfba31514d8a140c05673f2316e9ef523c3dda9f10a9846a2afecb7acc1b9f57c3bdae9b1fcc39d77408d30776ac4e51145c13bbbda6969f193f8c55458a91
7
+ data.tar.gz: f1d83a4a247f5e64c07c6f465846670336beb478789120308f416bbef53ae13eb0f4765f23659dcc0b3fb734544c259f6ae00be08033b61b5f2bc833330c7d41
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ Gemfile.lock
2
+ *.gem
3
+ settings.yml
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ ## BMW Connected Drive
2
+
3
+ BMW Connected Drive JSON API
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'bmw-connected-drive'
10
+
11
+ And then execute:
12
+
13
+ $ bundler
14
+
15
+ Or install it yourself:
16
+
17
+ $ gem install bmw-connected-drive
18
+
19
+ ## Usage
20
+
21
+ ```ruby
22
+ require 'bmw-connected-drive'
23
+
24
+ client = BMWConnectedDrive::Client.new({
25
+ :auth_basic => "auth_basic",
26
+ :username => "username",
27
+ :password => "password",
28
+ })
29
+
30
+ client.login
31
+
32
+ vehicle = client.vehicles.first
33
+ vehicle.status
34
+ vehicle.last_trip
35
+ vehicle.all_trips
36
+ vehicle.destinations
37
+ vehicle.charging_profile
38
+ vehicle.range_map
39
+ ```
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'bundler/gem_tasks'
3
+
4
+ # Default directory to look in is `/specs`
5
+ # Run with `rake spec`
6
+ RSpec::Core::RakeTask.new(:spec) do |task|
7
+ end
8
+
9
+ task :default => :spec
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bmw-connected-drive'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.add_development_dependency "rake"
8
+ s.add_development_dependency "rspec"
9
+ s.add_development_dependency "rspec-nc"
10
+ s.add_development_dependency "guard"
11
+ s.add_development_dependency "guard-rspec"
12
+ s.add_development_dependency "pry"
13
+ s.add_development_dependency "pry-remote"
14
+ s.add_development_dependency "pry-nav"
15
+ s.add_runtime_dependency('httparty', '~> 0.14.0', '>= 0.14.0')
16
+ s.description = "A ruby BMW connected drive API implementation"
17
+ s.date = Time.now.utc.strftime("%Y-%m-%d")
18
+ s.name = 'bmw-connected-drive'
19
+ s.version = BMWConnectedDrive::VERSION
20
+ s.summary = "A ruby BMW connected drive API implementation"
21
+ s.authors = ["Ed Richards"]
22
+ s.email = 'er@advect.us'
23
+ s.require_paths = ["lib"]
24
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
25
+ s.files = `git ls-files`.split("\n")
26
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
27
+ s.homepage = 'http://www.github.com/advectus/bmw-connected-drive'
28
+ s.license = 'MIT'
29
+ end
@@ -0,0 +1,7 @@
1
+ require 'httparty'
2
+ require 'bmw-connected-drive/client'
3
+ require 'bmw-connected-drive/vehicle'
4
+
5
+ module BMWConnectedDrive
6
+ VERSION = '0.1.0'
7
+ end
@@ -0,0 +1,80 @@
1
+ module BMWConnectedDrive
2
+ class Client
3
+ include HTTParty
4
+ base_uri "https://b2vapi.bmwgroup.us/webapi"
5
+
6
+ USER_AGENT = "MCVApp/1.5.2 (iPhone; iOS 9.1; Scale/2.00)"
7
+
8
+ attr_reader :username, :password, :auth_basic, :expires_in, :access_token
9
+
10
+ def initialize(params={username:nil, password:nil, auth_basic:nil})
11
+ @username = params[:username]
12
+ @password = params[:password]
13
+ @auth_basic = params[:auth_basic]
14
+ puts @username
15
+ puts @password
16
+ puts @auth_basic
17
+ end
18
+
19
+ def access_token=(access_token)
20
+ @access_token = access_token
21
+ self.class.headers "User-Agent" => USER_AGENT
22
+ self.class.headers "Authorization" => "Bearer #{access_token}"
23
+ #self.class.headers "User-Agent" => USER_AGENT
24
+ #self.class.headers "Authorization" => "Bearer Zig2rc5cw98vwBNJhLZ3AZ4Fx6L9Qecp"
25
+ end
26
+
27
+ def expires_in=(seconds)
28
+ @expires_in = seconds.to_f
29
+ end
30
+
31
+ def created_at=(timestamp)
32
+ @created_at = Time.at(timestamp.to_f).to_datetime
33
+ end
34
+
35
+ def expired_at
36
+ return nil unless defined?(@created_at)
37
+ (@created_at.to_time + @expires_in.to_f).to_datetime
38
+ end
39
+
40
+ def expired?
41
+ return true unless defined?(@created_at)
42
+ expired_at <= DateTime.now
43
+ end
44
+
45
+ def login
46
+ response = self.class.post(
47
+ "/oauth/token",
48
+ body: {
49
+ "grant_type" => "password",
50
+ "username" => self.username,
51
+ "password" => self.password,
52
+ "scope" => "remote_services vehicle_data"
53
+ },
54
+ headers: {
55
+ "Authorization" => "Basic " + self.auth_basic,
56
+ "Content-Type" => "application/x-www-form-urlencoded",
57
+ "User-Agent" => USER_AGENT
58
+ }
59
+ )
60
+
61
+ puts response
62
+
63
+ self.expires_in = response["expires_in"]
64
+ #self.created_at = response["created_at"]
65
+ self.access_token = response["access_token"]
66
+ end
67
+
68
+ def call(path)
69
+ self.class.headers "User-Agent" => USER_AGENT
70
+ self.class.headers "Authorization" => "Bearer Zig2rc5cw98vwBNJhLZ3AZ4Fx6L9Qecp"
71
+ self.class.get(path)
72
+ end
73
+
74
+ def vehicles
75
+ #self.class.headers "User-Agent" => USER_AGENT
76
+ #self.class.headers "Authorization" => "Bearer Zig2rc5cw98vwBNJhLZ3AZ4Fx6L9Qecp"
77
+ self.class.get("/v1/user/vehicles/")["vehicles"].map { |vehicle| Vehicle.new(self.class, vehicle) }
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,35 @@
1
+ module BMWConnectedDrive
2
+ class Vehicle
3
+ attr_reader :api, :vehicle
4
+
5
+ def initialize(api, vehicle)
6
+ @api = api
7
+ @vehicle = vehicle
8
+ end
9
+
10
+ def status
11
+ api.get("/v1/user/vehicles/#{vehicle['vin']}/status")["vehicleStatus"]
12
+ end
13
+
14
+ def last_trip
15
+ api.get("/v1/user/vehicles/#{vehicle['vin']}/statistics/lastTrip")["lastTrip"]
16
+ end
17
+
18
+ def all_trips
19
+ api.get("/v1/user/vehicles/#{vehicle['vin']}/statistics/allTrips")["allTrips"]
20
+ end
21
+
22
+ def charging_profile
23
+ api.get("/v1/user/vehicles/#{vehicle['vin']}/chargingprofile")["weeklyPlanner"]
24
+ end
25
+
26
+ def destinations
27
+ api.get("/v1/user/vehicles/#{vehicle['vin']}/destinations")["destinations"]
28
+ end
29
+
30
+ def range_map
31
+ api.get("/v1/user/vehicles/#{vehicle['vin']}/rangemap")["rangemap"]
32
+ end
33
+
34
+ end
35
+ end
metadata ADDED
@@ -0,0 +1,183 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bmw-connected-drive
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ed Richards
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-nc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: guard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-remote
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-nav
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: httparty
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 0.14.0
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: 0.14.0
135
+ type: :runtime
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: 0.14.0
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 0.14.0
145
+ description: A ruby BMW connected drive API implementation
146
+ email: er@advect.us
147
+ executables: []
148
+ extensions: []
149
+ extra_rdoc_files: []
150
+ files:
151
+ - ".gitignore"
152
+ - Gemfile
153
+ - README.md
154
+ - Rakefile
155
+ - bmw-connected-drive.gemspec
156
+ - lib/bmw-connected-drive.rb
157
+ - lib/bmw-connected-drive/client.rb
158
+ - lib/bmw-connected-drive/vehicle.rb
159
+ homepage: http://www.github.com/advectus/bmw-connected-drive
160
+ licenses:
161
+ - MIT
162
+ metadata: {}
163
+ post_install_message:
164
+ rdoc_options: []
165
+ require_paths:
166
+ - lib
167
+ required_ruby_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ required_rubygems_version: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ requirements: []
178
+ rubyforge_project:
179
+ rubygems_version: 2.5.1
180
+ signing_key:
181
+ specification_version: 4
182
+ summary: A ruby BMW connected drive API implementation
183
+ test_files: []