deviceify 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 32856f6759a53de303923d2ec3de1949a343c103
4
+ data.tar.gz: 8a3419f0f21adc8afcf18db4a779758d42aeac07
5
+ SHA512:
6
+ metadata.gz: 9274ccb836a3a8ad9aad1ed3573308054988da358f1bddcd13d5ebed1ecf010dba1210eccd5a5afaf5ce7a3fb163022f74a0090aa428950b99e20c35de16d4ce
7
+ data.tar.gz: 7276daed6aa9438883242bd8001481f24d3d45a815bb4302947b60d5be65538b43f90cbb4e74c013d5c5c119a371e349d08363ce322463b07d0f62d1506d31fe
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in deviceify.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Skylar Schipper
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,29 @@
1
+ # Deviceify
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'deviceify'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install deviceify
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it ( http://github.com/<my-github-username>/deviceify/fork )
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :test
7
+
8
+ task :test do
9
+ Rake::Task['install'].invoke
10
+ Rake::Task['spec'].invoke
11
+ end
data/deviceify.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'deviceify/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "deviceify"
8
+ spec.version = Deviceify::VERSION
9
+ spec.authors = ["Skylar Schipper"]
10
+ spec.email = ["skylar@pco.bz"]
11
+ spec.summary = "Turns device model strings to their human names"
12
+ spec.description = ""
13
+ spec.homepage = ""
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.5"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+
25
+ end
@@ -0,0 +1,13 @@
1
+ module Deviceify
2
+ class Device
3
+ attr_accessor :name, :generation, :fcc_ids, :sizes, :models
4
+
5
+ def initialize(options={})
6
+ self.name = options[:name]
7
+ self.generation = options[:generation]
8
+ self.fcc_ids = options[:fcc_ids]
9
+ self.sizes = options[:sizes]
10
+ self.models = options[:models]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,301 @@
1
+ require_relative 'device'
2
+
3
+ module Deviceify
4
+ class Map
5
+ @@_devices = {}
6
+
7
+ def self.name(model_string)
8
+ dev = self.device(model_string)
9
+ return dev.name if dev
10
+ model_string
11
+ end
12
+ def self.device(model_string)
13
+ object = Deviceify::DEVICE_MAP[model_string]
14
+ if object
15
+ return Deviceify::Device.new(object)
16
+ end
17
+ nil
18
+ end
19
+ def self.devices
20
+ return @@_devices if @@_devices.count > 0
21
+ Deviceify::DEVICE_MAP.each do |key, val|
22
+ @@_devices[key] = Deviceify::Device.new(val)
23
+ end
24
+ @@_devices
25
+ end
26
+ end
27
+
28
+ DEVICE_MAP = {
29
+ # Apple TVs
30
+ "AppleTV3,1" => {
31
+ name: "Apple TV",
32
+ generation: "Apple TV 3G",
33
+ models: %w[A1427],
34
+ fcc_ids: %w[BCGA1427],
35
+ sizes: %w[8GB]
36
+ },
37
+ "AppleTV3,2" => {
38
+ name: "Apple TV",
39
+ generation: "Apple TV 3G",
40
+ models: %w[A2469],
41
+ fcc_ids: %w[BCGA1469],
42
+ sizes: %w[8GB]
43
+ },
44
+ # iPads
45
+ "iPad1,1" => {
46
+ name: "iPad",
47
+ generation: "iPad 1G",
48
+ models: %w[A1219 A1337],
49
+ fcc_ids: %w[BCG‑E2381A BCG‑E2328A],
50
+ sizes: %w[16GB 32GB 64GB]
51
+ },
52
+ "iPad2,1" => {
53
+ name: "iPad 2",
54
+ generation: "iPad 2",
55
+ models: %w[A1395],
56
+ fcc_ids: %w[BCGA1395],
57
+ sizes: %w[16GB 32GB 64GB]
58
+ },
59
+ "iPad2,2" => {
60
+ name: "iPad 2",
61
+ generation: "iPad 2",
62
+ models: %w[A1396],
63
+ fcc_ids: %w[BCGA1396],
64
+ sizes: %w[16GB 32GB 64GB]
65
+ },
66
+ "iPad2,3" => {
67
+ name: "iPad 2",
68
+ generation: "iPad 2",
69
+ models: %w[A1397],
70
+ fcc_ids: %w[BCGA1397],
71
+ sizes: %w[16GB 32GB 64GB]
72
+ },
73
+ "iPad2,4" => {
74
+ name: "iPad 2",
75
+ generation: "iPad 2",
76
+ models: %w[A1395],
77
+ fcc_ids: %w[BCGA1395],
78
+ sizes: %w[16GB]
79
+ },
80
+ "iPad3,1" => {
81
+ name: "iPad 3",
82
+ generation: "iPad 3",
83
+ models: %w[A1416],
84
+ fcc_ids: %w[BCGA1416],
85
+ sizes: %w[16GB 32GB 64GB]
86
+ },
87
+ "iPad3,2" => {
88
+ name: "iPad 3",
89
+ generation: "iPad 3",
90
+ models: %w[A1403],
91
+ fcc_ids: %w[BCGA1403],
92
+ sizes: %w[16GB 32GB 64GB]
93
+ },
94
+ "iPad3,3" => {
95
+ name: "iPad 3",
96
+ generation: "iPad 3",
97
+ models: %w[A1430],
98
+ fcc_ids: %w[BCGA1430],
99
+ sizes: %w[16GB 32GB 64GB]
100
+ },
101
+ "iPad3,4" => {
102
+ name: "iPad 4",
103
+ generation: "iPad 4",
104
+ models: %w[A1458],
105
+ fcc_ids: %w[BCGA1458],
106
+ sizes: %w[16GB 32GB 64GB 128GB]
107
+ },
108
+ "iPad3,5" => {
109
+ name: "iPad 4",
110
+ generation: "iPad 4",
111
+ models: %w[A1459],
112
+ fcc_ids: %w[BCGA1459],
113
+ sizes: %w[16GB 32GB 64GB 128GB]
114
+ },
115
+ "iPad3,6" => {
116
+ name: "iPad 4",
117
+ generation: "iPad 4",
118
+ models: %w[A1460],
119
+ fcc_ids: %w[BCGA1460],
120
+ sizes: %w[16GB 32GB 64GB 128GB]
121
+ },
122
+ "iPad4,1" => {
123
+ name: "iPad Air",
124
+ generation: "iPad Air",
125
+ models: %w[A1474],
126
+ fcc_ids: %w[BCGA1474],
127
+ sizes: %w[16GB 32GB 64GB 128GB]
128
+ },
129
+ "iPad4,2" => {
130
+ name: "iPad Air",
131
+ generation: "iPad Air",
132
+ models: %w[A1475],
133
+ fcc_ids: %w[BCGA1475],
134
+ sizes: %w[16GB 32GB 64GB 128GB]
135
+ },
136
+ # iPad Mini
137
+ "iPad2,5" => {
138
+ name: "iPad Mini",
139
+ generation: "iPad Mini 1G",
140
+ models: %w[A1432],
141
+ fcc_ids: %w[BCGA1432],
142
+ sizes: %w[16GB 32GB 64GB]
143
+ },
144
+ "iPad2,6" => {
145
+ name: "iPad Mini",
146
+ generation: "iPad Mini 1G",
147
+ models: %w[A1454],
148
+ fcc_ids: %w[BCGA1454],
149
+ sizes: %w[16GB 32GB 64GB]
150
+ },
151
+ "iPad2,7" => {
152
+ name: "iPad Mini",
153
+ generation: "iPad Mini 1G",
154
+ models: %w[A1455],
155
+ fcc_ids: %w[BCGA1455],
156
+ sizes: %w[16GB 32GB 64GB]
157
+ },
158
+ "iPad4,4" => {
159
+ name: "iPad Mini",
160
+ generation: "iPad Mini 2G",
161
+ models: %w[A1489],
162
+ fcc_ids: %w[BCGA1489],
163
+ sizes: %w[16GB 32GB 64GB 128GB]
164
+ },
165
+ "iPad4,5" => {
166
+ name: "iPad Mini",
167
+ generation: "iPad Mini 2G",
168
+ models: %w[A1517],
169
+ fcc_ids: %w[BCGA1490],
170
+ sizes: %w[16GB 32GB 64GB 128GB]
171
+ },
172
+ # iPhone
173
+ "iPhone1,1" => {
174
+ name: "iPhone",
175
+ generation: "iPhone 2G",
176
+ models: %w[A1203],
177
+ fcc_ids: %w[BCGA1203],
178
+ sizes: %w[4GB 8GB 16GB]
179
+ },
180
+ "iPhone1,2" => {
181
+ name: "iPhone 3G",
182
+ generation: "iPhone 3G",
183
+ models: %w[A1241 A1324],
184
+ fcc_ids: %w[BCGA1241],
185
+ sizes: %w[8GB 16GB]
186
+ },
187
+ "iPhone2,1" => {
188
+ name: "iPhone 3GS",
189
+ generation: "iPhone 3GS",
190
+ models: %w[A1303 A1325],
191
+ fcc_ids: %w[BCGA1303A BCGA1303B],
192
+ sizes: %w[8GB 16GB 32GB]
193
+ },
194
+ "iPhone3,1" => {
195
+ name: "iPhone 4",
196
+ generation: "iPhone 4",
197
+ models: %w[A1332],
198
+ fcc_ids: %w[BCG‑E2380A BCG‑E2380B],
199
+ sizes: %w[8GB 16GB 32GB]
200
+ },
201
+ "iPhone3,2" => {
202
+ name: "iPhone 4",
203
+ generation: "iPhone 4",
204
+ models: %w[A1332],
205
+ fcc_ids: %w[BCG‑E2380A BCG‑E2380B],
206
+ sizes: %w[8GB]
207
+ },
208
+ "iPhone3,3" => {
209
+ name: "iPhone 4",
210
+ generation: "iPhone 4",
211
+ models: %w[A1349],
212
+ fcc_ids: %w[BCG‑E2422A BCG‑E2422B],
213
+ sizes: %w[8GB 16GB 32GB]
214
+ },
215
+ "iPhone4,1" => {
216
+ name: "iPhone 4S",
217
+ generation: "iPhone 4S",
218
+ models: %w[A1387 A1431],
219
+ fcc_ids: %w[BCG‑E2430A],
220
+ sizes: %w[8GB 16GB 32GB 64GB]
221
+ },
222
+ "iPhone5,1" => {
223
+ name: "iPhone 5",
224
+ generation: "iPhone 5",
225
+ models: %w[A1428],
226
+ fcc_ids: %w[BCG‑E2599A],
227
+ sizes: %w[16GB 32GB 64GB]
228
+ },
229
+ "iPhone5,2" => {
230
+ name: "<#name#>",
231
+ generation: "<#gen#>",
232
+ models: %w[A1429 A1442],
233
+ fcc_ids: %w[BCG‑E2599A],
234
+ sizes: %w[16GB 32GB 64GB]
235
+ },
236
+ "iPhone5,3" => {
237
+ name: "iPhone 5c",
238
+ generation: "iPhone 5c",
239
+ models: %w[A1456 A1532],
240
+ fcc_ids: %w[BCG‑E2644A],
241
+ sizes: %w[16GB 32GB]
242
+ },
243
+ "iPhone5,4" => {
244
+ name: "iPhone 5c",
245
+ generation: "iPhone 5c",
246
+ models: %w[A1507 A1516 A1526 A1529],
247
+ fcc_ids: %w[BCG‑E2694A BCG‑E2694B],
248
+ sizes: %w[16GB 32GB]
249
+ },
250
+ "iPhone6,1" => {
251
+ name: "iPhone 5s",
252
+ generation: "iPhone 5s",
253
+ models: %w[A1433 A1533],
254
+ fcc_ids: %w[BCG‑E2642A],
255
+ sizes: %w[16GB 32GB 64GB]
256
+ },
257
+ "iPhone6,2" => {
258
+ name: "iPhone 5s",
259
+ generation: "iPhone 5s",
260
+ models: %w[A1457 A1518 A1528 A1530],
261
+ fcc_ids: %w[BCG‑E2643A BCG‑E2643B],
262
+ sizes: %w[16GB 32GB 64GB]
263
+ },
264
+ # iPod Touch
265
+ "iPod1,1" => {
266
+ name: "iPod Touch",
267
+ generation: "iPod Touch 1G",
268
+ models: %w[A1213],
269
+ fcc_ids: %w[BCGA1213],
270
+ sizes: %w[8GB 16GB 32GB]
271
+ },
272
+ "iPod2,1" => {
273
+ name: "iPod Touch",
274
+ generation: "iPod Touch 2G",
275
+ models: %w[A1288],
276
+ fcc_ids: %w[BCGA1288],
277
+ sizes: %w[8GB 16GB 32GB]
278
+ },
279
+ "iPod3,1" => {
280
+ name: "iPod Touch",
281
+ generation: "iPod Touch 3G",
282
+ models: %w[A1318],
283
+ fcc_ids: %w[BCG‑2310],
284
+ sizes: %w[32GB 64GB]
285
+ },
286
+ "iPod4,1" => {
287
+ name: "iPod Touch",
288
+ generation: "iPod Touch 4G",
289
+ models: %w[A1367],
290
+ fcc_ids: %w[BCG‑E2407],
291
+ sizes: %w[8GB 16GB 32GB 64GB]
292
+ },
293
+ "iPod5,1" => {
294
+ name: "iPod Touch",
295
+ generation: "iPod Touch 5G",
296
+ models: %w[A1421 A1509],
297
+ fcc_ids: %w[BCG‑A1421],
298
+ sizes: %w[16GB 32GB 64GB]
299
+ },
300
+ }
301
+ end
@@ -0,0 +1,3 @@
1
+ module Deviceify
2
+ VERSION = "0.0.2"
3
+ end
data/lib/deviceify.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "deviceify/version"
2
+ Dir.glob(File.dirname(File.absolute_path(__FILE__)) + '/deviceify/*', &method(:require))
3
+
4
+ module Deviceify
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'device' do
4
+ it 'sets values' do
5
+ device = Deviceify::Map.device("iPad3,5")
6
+ device.name.should_not be_nil
7
+ device.generation.should_not be_nil
8
+ device.fcc_ids.should_not be_nil
9
+ device.sizes.should_not be_nil
10
+ device.models.should_not be_nil
11
+
12
+ device.name.should == "iPad 4"
13
+ device.generation.should == "iPad 4"
14
+
15
+ device.models.count.should == 1
16
+ device.fcc_ids.count.should == 1
17
+ device.sizes.count.should == 4
18
+
19
+ device.models.first.should == "A1459"
20
+ device.fcc_ids.first.should == "BCGA1459"
21
+ device.sizes[0].should == "16GB"
22
+ device.sizes[1].should == "32GB"
23
+ device.sizes[2].should == "64GB"
24
+ device.sizes[3].should == "128GB"
25
+ end
26
+
27
+ it 'has all devices' do
28
+ devices = Deviceify::Map.devices
29
+ devices.count.should >= 38
30
+ devices.first[1].is_a?(Deviceify::Device).should be_true
31
+ end
32
+ end
data/spec/map_spec.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'map' do
4
+ it 'return passed string if no match' do
5
+ name = Deviceify::Map.name("iPhone1999,1")
6
+ name.should == "iPhone1999,1"
7
+ end
8
+
9
+ Deviceify::DEVICE_MAP.each do |key, val|
10
+ describe "has values for #{key}" do
11
+ %w[name fcc_ids sizes models generation].each do |attr|
12
+ it "value for #{attr}" do
13
+ value = val[attr.to_sym]
14
+ value.should_not be_nil
15
+ if value.is_a?(String)
16
+ value.empty?.should be_false
17
+ end
18
+ end
19
+ end
20
+ %w[models sizes fcc_ids].each do |attr|
21
+ it "has at least one #{attr}" do
22
+ value = val[attr.to_sym]
23
+ value.is_a?(Array).should be_true
24
+ value.count.should >= 1
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,20 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+
8
+ require 'deviceify'
9
+
10
+ RSpec.configure do |config|
11
+ config.treat_symbols_as_metadata_keys_with_true_values = true
12
+ config.run_all_when_everything_filtered = true
13
+ config.filter_run :focus
14
+
15
+ # Run specs in random order to surface order dependencies. If you find an
16
+ # order dependency and want to debug it, you can fix the order by providing
17
+ # the seed, which is printed after each run.
18
+ # --seed 1234
19
+ config.order = 'random'
20
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: deviceify
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Skylar Schipper
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-12 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.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
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
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
+ description: ''
56
+ email:
57
+ - skylar@pco.bz
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - .rspec
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - deviceify.gemspec
69
+ - lib/deviceify.rb
70
+ - lib/deviceify/device.rb
71
+ - lib/deviceify/map.rb
72
+ - lib/deviceify/version.rb
73
+ - spec/device_spec.rb
74
+ - spec/map_spec.rb
75
+ - spec/spec_helper.rb
76
+ homepage: ''
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.2.1
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Turns device model strings to their human names
100
+ test_files:
101
+ - spec/device_spec.rb
102
+ - spec/map_spec.rb
103
+ - spec/spec_helper.rb