mac-wifi 1.1.0 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a58d1685f69fd21d35c2e06e323a7d932e5c82f
4
- data.tar.gz: 9b129f36832db299389950a7fb9d8561dedb1a07
3
+ metadata.gz: 75c730b3171f9dba37b683b40cde3c4d40765001
4
+ data.tar.gz: 5660a6f765152ad8ac23a09f5f88084a4ec83d3b
5
5
  SHA512:
6
- metadata.gz: 0a34b48bf98052309743cd068ebe3b32612ace5577fd6b00449e0c55a0bf9f5037c6a8c16483a667887b89692160e021a22cdaa5f2ef229b1a84faeee2d51204
7
- data.tar.gz: 82ad9b39c6c17632bcea897b4b9f7592dbe0e063ef5c0294ba4b043122ea1c788609248de690495e1ffc914ce7940e3ce33439eb8135049d70338e904e4393a3
6
+ metadata.gz: 237050e6744bb80ae8c2f36053731db4a03c78cc1402b82a12479848ac6d20b16a032a48d8944e038fe026799f5c28b0991523108958182c083bde7c9e65bb4a
7
+ data.tar.gz: 57d380bc2392e40e2b78bc856b22be6c83ec388e70a365cc098b0b76084f1e5427dcd6fac64172dad7d300cf11b39f9883f4e67c894ad1430ca851ffaca926ba
data/README.md CHANGED
@@ -19,7 +19,7 @@ output at the time of this writing:
19
19
  ```
20
20
  ➜ mac-wifi git:(master) ✗  ./mac-wifi h
21
21
 
22
- Available commands are:
22
+ mac-wifi version 1.1.0 -- Available commands are:
23
23
 
24
24
  ci - connected to Internet (not just wifi on)?
25
25
  co[nnect] network-name - turns wifi on, connects to network-name
@@ -36,7 +36,7 @@ pa[ssword] network-name - shows password for preferred network-name
36
36
  q[uit] - exits this program (interactive shell mode only)
37
37
  r[m] network-name - removes network-name from the preferred networks list
38
38
  s[hell] - opens an interactive pry shell (command line only)
39
- t[ill] - (experimental!) returns when the desired Internet connection state is true. Options:
39
+ t[ill] - returns when the desired Internet connection state is true. Options:
40
40
  'on'/:on or 'off'/:off
41
41
  wait interval, in seconds (optional, defaults to 0.5 seconds)
42
42
  w[ifion] - is the wifi on?
@@ -67,13 +67,15 @@ This is accomplished by the following command:
67
67
 
68
68
  If you would like to see the Mac OS commands and their output, you can do so by setting the
69
69
  environment variable MAC_WIFI_OPTS to include `-v` (for _verbose_).
70
- This can be done in the following ways:
70
+ This can be done in the following ways (using the `info` command as an example):
71
71
 
72
72
  ```
73
73
  export MAC_WIFI_OPTS=-v
74
74
  ./mac-wifi i
75
75
  ```
76
76
 
77
+ ...or...
78
+
77
79
  ```
78
80
  MAC_WIFI_OPTS=-v ./mac-wifi i
79
81
  ```
@@ -99,6 +101,9 @@ sudo gem install pry-coolline
99
101
 
100
102
  ### Using the Shell
101
103
 
104
+ **If the program immediately exits when you try to run the shell, try upgrading `pry` and `pry-byebug`.
105
+ This can be done by running `gem install pry; gem install pry-byebug`.**
106
+
102
107
  The shell, invoked with the `s` command on the command line, provides an interactive
103
108
  session. It can be useful when:
104
109
 
data/RELEASE_NOTES.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## v1.2.0
2
+
3
+ * Fix: protect against using command strings shorter than minimum length
4
+ (e.g. 'c', when more chars are necessary to disambiguate multiple commands).
5
+ * Improvements in help text and readme.
6
+
1
7
  ## v1.1.0
2
8
 
3
9
  * Sort available networks alphabetically, left justify ssid's.
data/bin/mac-wifi CHANGED
@@ -26,11 +26,22 @@ require 'tempfile'
26
26
  module MacWifi
27
27
 
28
28
  # This version must be kept in sync with the version in the gemspec file.
29
- VERSION = '1.1.0'
29
+ VERSION = '1.2.0'
30
30
 
31
31
 
32
32
  class BaseModel
33
33
 
34
+ class OsCommandError < RuntimeError
35
+ attr_reader :exitstatus, :command, :text
36
+
37
+ def initialize(exitstatus, command, text)
38
+ @exitstatus = exitstatus
39
+ @command = command
40
+ @text = text
41
+ end
42
+ end
43
+
44
+
34
45
  def initialize(verbose = false)
35
46
  @verbose_mode = verbose
36
47
  end
@@ -158,11 +169,7 @@ class BaseModel
158
169
  # @return names of the networks that were removed (excludes non-preexisting networks)
159
170
  def remove_preferred_networks(*network_names)
160
171
  networks_to_remove = network_names & preferred_networks # exclude any nonexistent networks
161
- networks_to_remove.each do |name|
162
- run_os_command("sudo networksetup -removepreferredwirelessnetwork " +
163
- "#{wifi_hardware_port} #{Shellwords.shellescape(name)}")
164
- end
165
- networks_to_remove
172
+ networks_to_remove.each { |name| remove_preferred_network(name) }
166
173
  end
167
174
 
168
175
 
@@ -184,21 +191,21 @@ class BaseModel
184
191
 
185
192
  wait_interval_in_secs ||= 0.5
186
193
 
187
- actions = {
194
+ finished_predicates = {
188
195
  conn: -> { connected_to_internet? },
189
196
  disc: -> { ! connected_to_internet? },
190
197
  on: -> { wifi_on? },
191
198
  off: -> { ! wifi_on? }
192
199
  }
193
200
 
194
- exit_when = actions[status]
201
+ finished_predicate = finished_predicates[status]
195
202
 
196
- if exit_when.nil?
197
- raise ArgumentError.new("Option must be one of [#{actions.keys.map(&:inspect).join(', ')}]. Was: #{status.inspect}")
203
+ if finished_predicate.nil?
204
+ raise ArgumentError.new("Option must be one of #{finished_predicates.keys.inspect}. Was: #{status.inspect}")
198
205
  end
199
206
 
200
207
  loop do
201
- return if exit_when.()
208
+ return if finished_predicate.()
202
209
  sleep(wait_interval_in_secs)
203
210
  end
204
211
  end
@@ -209,7 +216,7 @@ class MacOsModel < BaseModel
209
216
 
210
217
  AIRPORT_CMD = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport'
211
218
 
212
- def initialize(verbose)
219
+ def initialize(verbose = false)
213
220
  super
214
221
  end
215
222
 
@@ -295,7 +302,7 @@ class MacOsModel < BaseModel
295
302
  # Returns true if wifi is on, else false.
296
303
  def wifi_on?
297
304
  lines = run_os_command("#{AIRPORT_CMD} -I").split("\n")
298
- ! lines.grep("AirPort: Off").any?
305
+ lines.grep("AirPort: Off").none?
299
306
  end
300
307
 
301
308
 
@@ -406,17 +413,6 @@ class MacOsModel < BaseModel
406
413
  end
407
414
 
408
415
 
409
- class OsCommandError < RuntimeError
410
- attr_reader :exitstatus, :command, :text
411
-
412
- def initialize(exitstatus, command, text)
413
- @exitstatus = exitstatus
414
- @command = command
415
- @text = text
416
- end
417
- end
418
-
419
-
420
416
  def run_os_command(command)
421
417
  output = `#{command} 2>&1` # join stderr with stdout
422
418
  if $?.exitstatus != 0
@@ -451,6 +447,16 @@ class CommandLineInterface
451
447
 
452
448
  attr_reader :model
453
449
 
450
+ class Command < Struct.new(:min_string, :max_string, :action); end
451
+
452
+
453
+ class BadCommandError < RuntimeError
454
+ def initialize(error_message)
455
+ super
456
+ end
457
+ end
458
+
459
+
454
460
  # Help text to be used when requested by 'h' command, in case of unrecognized or nonexistent command, etc.
455
461
  HELP_TEXT = "
456
462
  mac-wifi version #{VERSION} -- Available commands are:
@@ -471,8 +477,8 @@ q[uit] - exits this program (interactive shell mode only)
471
477
  r[m] network-name - removes network-name from the preferred networks list
472
478
  s[hell] - opens an interactive pry shell (command line only)
473
479
  t[ill] - returns when the desired Internet connection state is true. Options:
474
- 'on'/:on or 'off'/:off
475
- wait interval, in seconds (optional, defaults to 0.5 seconds)
480
+ 1) 'on'/:on, 'off'/:off, 'conn'/:conn, or 'disc'/:disc
481
+ 2) wait interval, in seconds (optional, defaults to 0.5 seconds)
476
482
  w[ifion] - is the wifi on?
477
483
  x[it] - exits this program (interactive shell mode only)
478
484
 
@@ -485,17 +491,7 @@ When in interactive shell mode:
485
491
 
486
492
  def initialize
487
493
  @model = MacOsModel.new(verbose_mode)
488
- @interactive_mode = false # will be true if/when user selects shell option on command line
489
- end
490
-
491
-
492
- class Command < Struct.new(:min_string, :max_string, :action); end
493
-
494
-
495
- class BadCommandError < RuntimeError
496
- def initialize(error_message)
497
- super
498
- end
494
+ @interactive_mode = false # will be changed to true if/when user selects shell option on command line
499
495
  end
500
496
 
501
497
 
@@ -563,7 +559,8 @@ When in interactive shell mode:
563
559
  begin
564
560
  require 'pry'
565
561
  rescue LoadError
566
- puts "The 'pry' gem, required for running the shell, was not found. Please `gem install pry`."
562
+ puts "The 'pry' gem and/or one of its prerequisites, required for running the shell, was not found." +
563
+ " Please `gem install pry`."
567
564
  exit(-1)
568
565
  end
569
566
 
@@ -615,7 +612,7 @@ When in interactive shell mode:
615
612
  else
616
613
  print_help
617
614
  raise BadCommandError.new(
618
- "Unrecognized command. Command was #{action} and options were #{options.inspect}.")
615
+ %Q{Unrecognized command. Command was "#{command}" and options were #{options.inspect}.})
619
616
  end
620
617
  end
621
618
 
@@ -727,7 +724,7 @@ When in interactive shell mode:
727
724
 
728
725
  def cmd_w
729
726
  on = model.wifi_on?
730
- puts "Wifi on?: #{on}" unless @interactive_mode
727
+ puts "Wifi on: #{on}" unless @interactive_mode
731
728
  on
732
729
  end
733
730
 
@@ -762,7 +759,12 @@ When in interactive shell mode:
762
759
 
763
760
 
764
761
  def find_command_action(command_string)
765
- result = commands.detect { |cmd| cmd.max_string.start_with?(command_string) }
762
+ result = commands.detect do |cmd|
763
+ cmd.max_string.start_with?(command_string) \
764
+ && \
765
+ command_string.length >= cmd.min_string.length # e.g. 'c' by itself should not work
766
+ end
767
+
766
768
  result ? result.action : nil
767
769
  end
768
770
 
@@ -773,7 +775,7 @@ When in interactive shell mode:
773
775
  process_command_line(ARGV[0], ARGV[1..-1])
774
776
  rescue BadCommandError => error
775
777
  separator_line = "#{'!' * 79}\n"
776
- puts separator_line + "Bad command: #{ARGV[0]}\n" + separator_line + "\n"
778
+ puts '' << separator_line << error.to_s << "\n" << separator_line
777
779
  exit(-1)
778
780
  end
779
781
  end
@@ -796,29 +798,33 @@ end
796
798
 
797
799
  def running_as_script?
798
800
 
801
+ this_file = File.expand_path(__FILE__)
802
+ main_file = File.expand_path($0)
803
+
804
+ this_file_basename = File.basename(this_file)
805
+ main_file_basename = File.basename(main_file)
806
+
799
807
  # Please enable this code and report its output if you report any issues with this method:
800
- # puts "__FILE__ = #{__FILE__}"
801
- # puts "$0 = #{$0}"
808
+ # puts "__FILE__ = #{this_file}"
809
+ # puts "$0 = #{main_file}"
802
810
  # puts "GEM_PATH = #{ENV['GEM_PATH']}"
803
811
 
804
- return true if __FILE__ == $0
805
- return false if File.basename(__FILE__) != File.basename($0)
812
+ return true if main_file == this_file
813
+ return false if main_file_basename != this_file_basename
806
814
 
807
815
  # If here, then filespecs are different but have the same basename.
808
816
  gem_paths = ENV['GEM_PATH'].split(File::PATH_SEPARATOR)
809
- basename = File.basename($0)
810
817
  gem_paths.any? do |path|
811
- path_plus_bin_basename = File.join(path, 'bin', basename)
812
- __file__up_4 = File.expand_path(File.join(__FILE__, '..', '..', '..', '..'))
813
- ($0 == path_plus_bin_basename) && (path == __file__up_4)
818
+ path_plus_basename = File.join(path, 'bin', main_file_basename)
819
+ __file__up_4 = File.expand_path(File.join(this_file, '..', '..', '..', '..'))
820
+ ($0 == path_plus_basename) && (path == __file__up_4)
814
821
  end
815
822
  end
816
823
 
817
824
 
818
825
  def assert_os_is_mac_os
819
- uname = `uname`.chomp
820
- unless uname == 'Darwin'
821
- raise "This program currently works only on Mac OS. Platform is '#{uname}'."
826
+ unless /darwin/ === RbConfig::CONFIG["host_os"] # e.g. "darwin16.4.0"
827
+ raise "This program currently works only on Mac OS. Platform is '#{RbConfig::CONFIG["host_os"]}'."
822
828
  end
823
829
  end
824
830
 
data/mac-wifi.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
- # This version must be kept in sync with the version in the mac-wifi file.
3
- VERSION = '1.1.0'
2
+ # When changing the version, also change the version and the help text in the README.
3
+ VERSION = '1.2.0'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "mac-wifi"
@@ -9,10 +9,10 @@ load File.join(File.dirname(__FILE__), '..', 'bin', 'mac-wifi')
9
9
 
10
10
  module MacWifi
11
11
 
12
- describe Model do
12
+ describe MacOsModel do
13
13
 
14
14
 
15
- subject { Model.new }
15
+ subject { MacOsModel.new }
16
16
 
17
17
  context 'turning wifi on and off' do
18
18
  it 'can turn wifi on' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mac-wifi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keith Bennett
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-01 00:00:00.000000000 Z
11
+ date: 2017-10-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A command line interface for managing wifi on a Mac.
14
14
  email: