autoremote 0.1.0 → 0.2.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 +4 -4
- data/README.md +2 -1
- data/Rakefile +6 -1
- data/autoremote.gemspec +3 -2
- data/bin/autoremote +29 -35
- data/lib/autoremote.rb +33 -36
- data/lib/autoremote/exceptions.rb +23 -23
- data/lib/autoremote/version.rb +1 -1
- data/spec/autoremote_spec.rb +38 -0
- data/spec/spec_helper.rb +5 -0
- metadata +24 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 556baa7cab3df31f1515bb062d933440923499b0
|
4
|
+
data.tar.gz: 8d2c4700f0ea3c49502f4928c38e8e5ad6494ed5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a621b850030b061cea9be09cd2f2a09106dc6f07029856276dbe0929ff86c99250104758e679c22ec45b62f8666861a981818ce9cfeeef417c28e948a6a96e1b
|
7
|
+
data.tar.gz: d42f3720da620411a193ca9c3aa385b3a436579548ca11d0ac5d7ce523f7081a13e2cd6008038938cf40ae2e0202c0094adda76fc30fd1cf2617871e0e7ba067
|
data/README.md
CHANGED
@@ -4,12 +4,13 @@
|
|
4
4
|
[][gemnasium]
|
5
5
|
[][gem]
|
6
6
|
[][codeclimate]
|
7
|
+
[][inch-ci]
|
7
8
|
|
8
9
|
[licence]: http://choosealicense.com/licenses/mit/
|
9
10
|
[gem]: https://rubygems.org/gems/autoremote
|
10
11
|
[gemnasium]: https://gemnasium.com/AltonV/autoremote
|
11
|
-
[bitdeli]: https://bitdeli.com/free "Bitdeli Badge"
|
12
12
|
[codeclimate]: https://codeclimate.com/github/AltonV/autoremote
|
13
|
+
[inch-ci]: http://inch-ci.org/github/AltonV/autoremote
|
13
14
|
|
14
15
|
A library that makes it easier to interact with your other autoremote devices.
|
15
16
|
This project incudes both a library and an executable that uses the library.
|
data/Rakefile
CHANGED
data/autoremote.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = [ "Magnus Smedberg" ]
|
10
10
|
spec.email = [ "magnus.smedberg@yurijware.com" ]
|
11
11
|
spec.summary = %q{A library for interacting with autoremote devices http://joaoapps.com/autoremote/}
|
12
|
-
spec.homepage = "
|
12
|
+
spec.homepage = "http://altonv.github.io/autoremote/"
|
13
13
|
spec.license = "MIT"
|
14
14
|
|
15
15
|
spec.files = `git ls-files -z`.split("\x0")
|
@@ -18,7 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
20
|
spec.add_development_dependency "bundler", "~> 1.7"
|
21
|
-
spec.add_development_dependency "rake", "~> 10
|
21
|
+
spec.add_development_dependency "rake", "~> 10"
|
22
|
+
spec.add_development_dependency "rspec", "~> 3"
|
22
23
|
|
23
24
|
spec.add_runtime_dependency 'activerecord', '~> 4.2', '~> 4.2'
|
24
25
|
spec.add_runtime_dependency 'sqlite3', '~> 1.3', '~> 1.3'
|
data/bin/autoremote
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'autoremote'
|
3
3
|
require 'rbconfig'
|
4
4
|
|
5
|
-
def to_bool(
|
5
|
+
def to_bool(string)
|
6
6
|
return false if string.class == NilClass || string.empty? || string.downcase =~ (/^(false|f|no|n|nej|0)$/i)
|
7
7
|
return true if string.downcase =~ (/^(true|t|yes|y|ja|j|1)$/i)
|
8
8
|
raise ArgumentError, "Invalid value: #{string}"
|
@@ -10,75 +10,69 @@ end
|
|
10
10
|
|
11
11
|
## Prints help
|
12
12
|
def print_help
|
13
|
-
puts
|
13
|
+
puts 'AutoRemote v' + AutoRemote::VERSION
|
14
14
|
puts "\nArguments:"
|
15
|
-
puts
|
16
|
-
puts
|
17
|
-
puts
|
18
|
-
puts
|
19
|
-
puts
|
20
|
-
puts
|
15
|
+
puts ' add DEVICE KEY|URL Save device either with a \'goo.gl\' url or personal key'
|
16
|
+
puts ' remove DEVICE Removes device'
|
17
|
+
puts ' delete DEVICE Same as above'
|
18
|
+
puts ' list [WITHKEY] Lists all devices'
|
19
|
+
puts ' message DEVICE MESSAGE Send a message to a device'
|
20
|
+
puts ' register DEVICE HOST Register this computer to the device'
|
21
21
|
exit()
|
22
22
|
end
|
23
23
|
|
24
24
|
arg0 = ARGV[0].downcase if ARGV[0]
|
25
25
|
|
26
|
-
if arg0 ==
|
26
|
+
if arg0 == 'help' || arg0 == '-h' || arg0 == '--help'
|
27
27
|
print_help
|
28
|
-
|
29
|
-
|
30
|
-
puts "Adding device"
|
28
|
+
elsif arg0 == 'add' && ARGV[1] && ARGV[2]
|
29
|
+
puts 'Adding device'
|
31
30
|
begin
|
32
|
-
AutoRemote.addDevice(
|
33
|
-
puts
|
31
|
+
AutoRemote.addDevice(ARGV[1], ARGV[2])
|
32
|
+
puts 'Device added successfully'
|
34
33
|
rescue Exception => e
|
35
34
|
puts "Error: #{e.message}"
|
36
35
|
end
|
37
|
-
|
38
|
-
|
39
|
-
puts "Removing device"
|
36
|
+
elsif ( arg0 == 'remove' || arg0 == 'delete' ) && ARGV[1]
|
37
|
+
puts 'Removing device'
|
40
38
|
begin
|
41
|
-
AutoRemote.removeDevice(
|
42
|
-
puts
|
39
|
+
AutoRemote.removeDevice(ARGV[1])
|
40
|
+
puts 'Device removed successfully'
|
43
41
|
rescue Exception => e
|
44
42
|
puts "Error: #{e.message}"
|
45
43
|
end
|
46
|
-
|
47
|
-
elsif arg0 == "list"
|
44
|
+
elsif arg0 == 'list'
|
48
45
|
withkey = to_bool(ARGV[1])
|
49
|
-
puts
|
46
|
+
puts 'Listing devices'
|
50
47
|
|
51
48
|
AutoRemote.listDevices.each do|device|
|
52
49
|
print "Name: #{device.name}"
|
53
50
|
print " Key: #{device.key}" if withkey
|
54
51
|
puts
|
55
52
|
end
|
56
|
-
|
57
|
-
elsif arg0 == "message" && ARGV[1] && ARGV[2]
|
53
|
+
elsif arg0 == 'message' && ARGV[1] && ARGV[2]
|
58
54
|
begin
|
59
|
-
AutoRemote
|
60
|
-
puts
|
55
|
+
AutoRemote.sendMessage(ARGV[1], ARGV[2])
|
56
|
+
puts 'Message sent successfully'
|
61
57
|
rescue Exception => e
|
62
58
|
puts "Error: #{e.message}"
|
63
59
|
end
|
64
|
-
|
65
|
-
elsif arg0 == "register" && ARGV[1] && ARGV[2]
|
60
|
+
elsif arg0 == 'register' && ARGV[1] && ARGV[2]
|
66
61
|
if RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw|cygwin|bccwin|wince|emc/i
|
67
|
-
puts
|
68
|
-
print
|
69
|
-
|
70
|
-
puts
|
62
|
+
puts 'Are you sure you want to register a windows computer?'
|
63
|
+
print 'You will need an SSH server on the computer. (y/n)'
|
64
|
+
unless to_bool($stdin.gets.chomp)
|
65
|
+
puts 'Registering interrupted'
|
71
66
|
exit
|
72
67
|
end
|
73
68
|
end
|
74
69
|
|
75
70
|
begin
|
76
|
-
AutoRemote
|
77
|
-
puts
|
71
|
+
AutoRemote.registerOnDevice(ARGV[1], ARGV[2])
|
72
|
+
puts 'Device registered successfully'
|
78
73
|
rescue Exception => e
|
79
74
|
puts "Error: #{e.message}"
|
80
75
|
end
|
81
|
-
|
82
76
|
else
|
83
77
|
print_help
|
84
78
|
end
|
data/lib/autoremote.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'autoremote/version'
|
2
|
+
require 'autoremote/exceptions'
|
3
3
|
require 'sqlite3'
|
4
4
|
require 'active_record'
|
5
5
|
require 'net/http'
|
@@ -25,9 +25,9 @@ ActiveRecord::Schema.define do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
module AutoRemote
|
28
|
-
REGURL =
|
29
|
-
MSGURL =
|
30
|
-
VALIDATIONURL =
|
28
|
+
REGURL = 'http://autoremotejoaomgcd.appspot.com/registerpc?key=%YOUR_KEY%&name=%DISPLAY_NAME%&id=%UNIQUE_ID%&type=linux&publicip=%PUBLIC_HOST%&localip=%IP_ADDRESS%'
|
29
|
+
MSGURL = 'http://autoremotejoaomgcd.appspot.com/sendmessage?key=%YOUR_KEY%&message=%MESSAGE%&sender=%SENDER_ID%'
|
30
|
+
VALIDATIONURL = 'http://autoremotejoaomgcd.appspot.com/sendmessage?key=%YOUR_KEY%'
|
31
31
|
|
32
32
|
# Add a device
|
33
33
|
# @param name [String] The name of the device
|
@@ -35,15 +35,15 @@ module AutoRemote
|
|
35
35
|
# @raise [AutoRemote::DeviceAlreadyExist] if the device already exits
|
36
36
|
# @raise [AutoRemote::InvalidKey] if the key or url is invalid
|
37
37
|
# @return [void]
|
38
|
-
def AutoRemote::addDevice(
|
38
|
+
def AutoRemote::addDevice(name, input)
|
39
39
|
|
40
40
|
## Validation if input is a 'goo.gl' url
|
41
|
-
if input.match(
|
42
|
-
result = self.urlRequest(
|
41
|
+
if input.match(/^(https?:\/{2})?(goo.gl\/[\S]*)$/i)
|
42
|
+
result = self.urlRequest(input)
|
43
43
|
|
44
44
|
## Get the key from the resulting url
|
45
45
|
begin
|
46
|
-
input = CGI.parse(
|
46
|
+
input = CGI.parse(result.request.last_uri.query)['key'][0]
|
47
47
|
rescue
|
48
48
|
raise self::InvalidKey
|
49
49
|
end
|
@@ -51,16 +51,16 @@ module AutoRemote
|
|
51
51
|
## If not a 'goo.gl' url, check if it is a valid key
|
52
52
|
else
|
53
53
|
## Validate key
|
54
|
-
result = self.urlRequest(
|
54
|
+
result = self.urlRequest(VALIDATIONURL.sub(/%YOUR_KEY%/, input))
|
55
55
|
|
56
56
|
## Check result
|
57
|
-
if result.body !=
|
57
|
+
if result.body != 'OK'
|
58
58
|
raise self::InvalidKey
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
62
|
## Check if the device already exist
|
63
|
-
if Device.find_by_name(
|
63
|
+
if Device.find_by_name(name) || Device.find_by_key(input)
|
64
64
|
raise self::DeviceAlreadyExist
|
65
65
|
end
|
66
66
|
|
@@ -72,9 +72,8 @@ module AutoRemote
|
|
72
72
|
# @param name [String] The name of the device
|
73
73
|
# @raise [AutoRemote::DeviceNotFound] if the device didn't exist
|
74
74
|
# @return [void]
|
75
|
-
def AutoRemote::removeDevice(
|
75
|
+
def AutoRemote::removeDevice(name)
|
76
76
|
if device = Device.find_by_name(name)
|
77
|
-
|
78
77
|
## Remove the device
|
79
78
|
Device.delete(device.id)
|
80
79
|
else
|
@@ -85,13 +84,13 @@ module AutoRemote
|
|
85
84
|
# Returns a list with all devices
|
86
85
|
# @return [Device::ActiveRecord_Relation]
|
87
86
|
def AutoRemote::listDevices
|
88
|
-
return Device.order(
|
87
|
+
return Device.order('name').all
|
89
88
|
end
|
90
89
|
|
91
90
|
# Returns one specific device
|
92
91
|
# @return [Device]
|
93
|
-
def AutoRemote::getDevice(
|
94
|
-
return Device.find_by_name(
|
92
|
+
def AutoRemote::getDevice(name)
|
93
|
+
return Device.find_by_name(name)
|
95
94
|
end
|
96
95
|
|
97
96
|
# Sends a message to a device
|
@@ -100,20 +99,20 @@ module AutoRemote
|
|
100
99
|
# @raise [AutoRemote::DeviceNotFound] if the device didn't exits
|
101
100
|
# @raise [TypeError] if message isn't a string
|
102
101
|
# @return [void]
|
103
|
-
def AutoRemote::sendMessage(
|
104
|
-
if ! device.kind_of?(
|
102
|
+
def AutoRemote::sendMessage(device, message)
|
103
|
+
if ! device.kind_of?(Device) && ! (device = Device.find_by_name(device))
|
105
104
|
raise self::DeviceNotFound
|
106
|
-
elsif ! message.kind_of?(
|
107
|
-
raise TypeError,
|
105
|
+
elsif ! message.kind_of?(String)
|
106
|
+
raise TypeError, 'Message must be a string'
|
108
107
|
end
|
109
108
|
|
110
109
|
hostname = `hostname`.strip
|
111
110
|
|
112
111
|
## Send the message
|
113
|
-
result = self.urlRequest(
|
112
|
+
result = self.urlRequest(MSGURL.sub(/%YOUR_KEY%/, device.key).sub(/%MESSAGE%/, CGI.escape(message)).sub(/%SENDER_ID%/, hostname))
|
114
113
|
|
115
114
|
## Check result
|
116
|
-
if result.body !=
|
115
|
+
if result.body != 'OK'
|
117
116
|
raise self::InvalidKey
|
118
117
|
end
|
119
118
|
end
|
@@ -125,22 +124,22 @@ module AutoRemote
|
|
125
124
|
# @raise [AutoRemote::UnsupportedAction] if running from windows
|
126
125
|
# @raise [TypeError] if message isn't a string or less than 5 characters
|
127
126
|
# @return [void]
|
128
|
-
def AutoRemote::registerOnDevice(
|
129
|
-
if ! device.kind_of?(
|
127
|
+
def AutoRemote::registerOnDevice(device, remotehost)
|
128
|
+
if ! device.kind_of?(Device) && ! (device = Device.find_by_name(device))
|
130
129
|
raise self::DeviceNotFound
|
131
|
-
elsif ! remotehost.kind_of?(
|
132
|
-
raise ArgumentError,
|
130
|
+
elsif ! remotehost.kind_of?(String) || remotehost.length < 5
|
131
|
+
raise ArgumentError, 'remotehost must be a string of 5 chars or more'
|
133
132
|
end
|
134
133
|
|
135
134
|
hostname = `hostname`.strip
|
136
135
|
ipAddress = AutoRemote::getIpAddress.ip_address
|
137
136
|
|
138
137
|
## Perform the registration
|
139
|
-
result = self.urlRequest(
|
138
|
+
result = self.urlRequest(REGURL.sub(/%YOUR_KEY%/, device.key).sub(/%DISPLAY_NAME%/, hostname).sub(/%UNIQUE_ID%/, hostname).sub(/%PUBLIC_HOST%/, remotehost).sub(/%IP_ADDRESS%/, ipAddress))
|
140
139
|
|
141
140
|
## Check result
|
142
|
-
if result.body !=
|
143
|
-
raise self::AutoRemoteException,
|
141
|
+
if result.body != 'OK'
|
142
|
+
raise self::AutoRemoteException, 'Something went wrong when registering on the device'
|
144
143
|
end
|
145
144
|
end
|
146
145
|
|
@@ -156,17 +155,15 @@ module AutoRemote
|
|
156
155
|
# Gets the ip address of the system
|
157
156
|
# @return [String]
|
158
157
|
def AutoRemote::getIpAddress
|
159
|
-
return Socket.ip_address_list.detect{|ipInfo| ipInfo.ipv4_private?}
|
158
|
+
return Socket.ip_address_list.detect { |ipInfo| ipInfo.ipv4_private? }
|
160
159
|
end
|
161
160
|
|
162
161
|
# Performs a http request
|
163
162
|
# @param url [String]
|
164
|
-
def AutoRemote::urlRequest(
|
163
|
+
def AutoRemote::urlRequest(url)
|
165
164
|
## Add http:// to the url if not present
|
166
|
-
|
167
|
-
url = "http://" + url
|
168
|
-
end
|
165
|
+
url = 'http://' + url unless url.match(/^https?:\/{2}/i)
|
169
166
|
|
170
|
-
return HTTParty.get(
|
167
|
+
return HTTParty.get(url)
|
171
168
|
end
|
172
169
|
end
|
@@ -1,23 +1,23 @@
|
|
1
|
-
module AutoRemote
|
2
|
-
class AutoRemoteException < StandardError
|
3
|
-
end
|
4
|
-
|
5
|
-
class DeviceNotFound < AutoRemoteException
|
6
|
-
def message
|
7
|
-
"Device doesn't exist"
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class DeviceAlreadyExist < AutoRemoteException
|
12
|
-
def message
|
13
|
-
"Device already exist"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class InvalidKey < AutoRemoteException
|
18
|
-
def message
|
19
|
-
"The key is invalid"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
1
|
+
module AutoRemote
|
2
|
+
class AutoRemoteException < StandardError
|
3
|
+
end
|
4
|
+
|
5
|
+
class DeviceNotFound < AutoRemoteException
|
6
|
+
def message
|
7
|
+
"Device doesn't exist"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class DeviceAlreadyExist < AutoRemoteException
|
12
|
+
def message
|
13
|
+
"Device already exist"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class InvalidKey < AutoRemoteException
|
18
|
+
def message
|
19
|
+
"The key is invalid"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/lib/autoremote/version.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
require 'autoremote'
|
3
|
+
|
4
|
+
TEST_NAME = 'TestDevice'
|
5
|
+
TEST_URL = 'http://goo.gl/CyA66h'
|
6
|
+
TEST_KEY = 'APA91bFKEjtBfVU5WoJJ8KyfmR3LfmUpcVrePdQQ_T5oN1h8KcLptzhCvDE-FP1IQPimb9bk4Osm2FzTUvUT5YRylgjTMTHbS7HqbveHE-ZhgwtJEsfoKvo_JAN8Oh5NLpk-mvWEMBaZtpZVXqb3oP-G_7iKmY4UrNhXhrx9CNKOEWjhuluM0Js'
|
7
|
+
TEST_MSG = 'This is a test message'
|
8
|
+
|
9
|
+
describe AutoRemote do
|
10
|
+
describe '#addDevice' do
|
11
|
+
it 'adds a device' do
|
12
|
+
AutoRemote.addDevice(TEST_NAME, TEST_URL)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#listDevices' do
|
17
|
+
it 'returns a list of devices' do
|
18
|
+
list = AutoRemote.listDevices
|
19
|
+
expect(list).not_to eq(nil)
|
20
|
+
expect(list.count).to be > 0
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#getDevice' do
|
25
|
+
it 'returns a device' do
|
26
|
+
device = AutoRemote.getDevice(TEST_NAME)
|
27
|
+
expect(device).to be_instance_of(Device)
|
28
|
+
expect(device.name).to eq(TEST_NAME)
|
29
|
+
expect(device.key).to eq(TEST_KEY)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'sends a message' do
|
34
|
+
it do
|
35
|
+
AutoRemote.sendMessage(TEST_NAME, TEST_MSG)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autoremote
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Magnus Smedberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,14 +30,28 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '10
|
33
|
+
version: '10'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '10
|
40
|
+
version: '10'
|
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'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: activerecord
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,7 +112,9 @@ files:
|
|
98
112
|
- lib/autoremote.rb
|
99
113
|
- lib/autoremote/exceptions.rb
|
100
114
|
- lib/autoremote/version.rb
|
101
|
-
|
115
|
+
- spec/autoremote_spec.rb
|
116
|
+
- spec/spec_helper.rb
|
117
|
+
homepage: http://altonv.github.io/autoremote/
|
102
118
|
licenses:
|
103
119
|
- MIT
|
104
120
|
metadata: {}
|
@@ -122,5 +138,7 @@ rubygems_version: 2.4.5
|
|
122
138
|
signing_key:
|
123
139
|
specification_version: 4
|
124
140
|
summary: A library for interacting with autoremote devices http://joaoapps.com/autoremote/
|
125
|
-
test_files:
|
141
|
+
test_files:
|
142
|
+
- spec/autoremote_spec.rb
|
143
|
+
- spec/spec_helper.rb
|
126
144
|
has_rdoc:
|