check_everything 0.3.1 → 0.3.3

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -3
  3. data/lib/check_everything.rb +196 -136
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8bfae1799343f128c618b226f00b9f4009112e19
4
- data.tar.gz: 27a40cd1d9fd13f11f5a428c00c6bfda5ac9e239
3
+ metadata.gz: d5e756b99eed4f3831d529030106fc413e7cef22
4
+ data.tar.gz: 46794552d76c567c334bda168e5b1d7bd8063a23
5
5
  SHA512:
6
- metadata.gz: bae0d73b76dc55968a2efdc877a960ea37205f7f50eae48043bd431db2863a329e5a653b0883c45b2d08405c37e2d5dc900c408db15ac7342ec2d07c0f393c79
7
- data.tar.gz: b2f311014e19ecfc8fa12e5c5b783937b30f825cef7a12dcdea328d3ff80ecdfb1336b52fd50e40bd08a5fd62569d8fa915229ade25af263b61a00f74cf69be4
6
+ metadata.gz: 6f161be0d9ef1283f5602d8cd41f5fd79a4d8eaf3c54fa95c7e847be15f469a2811ae43abc0f1fe8cf14f8768f5c669f083015667e73181c9af8b974d0d03749
7
+ data.tar.gz: c0b6444386aab67e1ac4f8579ba0a2e73e92ef4de9f9b177a08f4ff85298f9c2c6a05592da26c67ebe6377d0567d9bf1a50015727ab3dc367273f55e60dfd0c7
data/README.md CHANGED
@@ -26,12 +26,14 @@ will be evaluated):
26
26
  | <category> | open a specific site group |
27
27
  | <Ruby class> | open Ruby documentation (if feature is installed) |
28
28
 
29
- NOTE: in versions 0.3.0 and higher, you can check Ruby documentation in one of
30
- two ways:
29
+ NOTE: in versions 0.3.2 and higher, you can check Ruby documentation in one of three ways:
30
+
31
31
  ----
32
32
  1. `check_everything array` (for the [class](http://www.ruby-doc.org/core-2.1.0/Array.html))
33
33
  2. `check_everything array#slice` (for the
34
- [method](http://www.ruby-doc.org/core-2.1.0/Array.html#method-i-slice))
34
+ [instance method](http://www.ruby-doc.org/core-2.1.0/Array.html#method-i-slice))
35
+ 3. `check_everything array::new` (for the [class method](http://www.ruby-doc.org/core-2.1.0/Array.html#method-c-new))
36
+
35
37
  ----
36
38
 
37
39
  ### Configure
@@ -2,12 +2,32 @@ require 'open-uri'
2
2
  require 'nokogiri'
3
3
 
4
4
  class CheckEverything
5
- KNOWN_TAGS = {
6
- :help => ['-h','--help'],
7
- :links => ['-l','--links'],
8
- :ruby => ['-r','--ruby'],
9
- :categories => ['-c', '--categories'],
10
- :all => ['-a', '--all']
5
+ KNOWN_FLAGS = {
6
+ :help => {
7
+ :position => 1,
8
+ :flags => ['-h','--help'],
9
+ :description => 'display the help message'
10
+ },
11
+ :links => {
12
+ :position => 2,
13
+ :flags => ['-l','--links'],
14
+ :description => 'view/edit links and categories'
15
+ },
16
+ :ruby => {
17
+ :position => 3,
18
+ :flags => ['-r','--ruby'],
19
+ :description => 'install/update Ruby Documentation functionality'
20
+ },
21
+ :categories => {
22
+ :position => 4,
23
+ :flags => ['-c', '--categories'],
24
+ :description => 'view the currently defined categories'
25
+ },
26
+ :all => {
27
+ :position => 5,
28
+ :flags => ['-a', '--all'],
29
+ :description => 'open all websites (will override documentation lookup)'
30
+ }
11
31
  }
12
32
  LINKPATH = "#{File.expand_path('~')}/.check_everything_links"
13
33
  LINKFILE = "#{LINKPATH}/links.txt"
@@ -33,100 +53,108 @@ class CheckEverything
33
53
 
34
54
  def self.run
35
55
  @argv = ARGV.map(&:downcase)
36
- until ARGV.empty?
37
- ARGV.pop
38
- end
39
- # Only assemble Ruby development library if requested to.
40
- @ruby_dev_assemble = false
41
- # Create a new link file if none has been created yet
42
- if !File.exists?(LINKFILE)
43
- # If a previous version created a file rather than a directory, move it into
44
- # the new directory.
45
- if File.exists?(LINKPATH)
46
- system("mv #{LINKPATH} #{LINKPATH}2")
47
- system("mkdir #{LINKPATH}")
48
- system("mv #{LINKPATH}2 #{LINKFILE}")
49
- else
50
- system("mkdir #{LINKPATH}")
51
- system("cp #{File.dirname(__FILE__)}/check_everything/links.txt #{LINKFILE}")
52
- end
53
- @argv = ["-l"]
54
- print "Are you a Ruby Dev who will want documentation-checking ",
55
- "functionality? [Y/n] "
56
- @ruby_dev_assemble = true unless gets.strip.downcase == 'n'
57
- puts "\nPlease customize your installation.",
58
- "This message will only be shown once.",
59
- "To open again and customize, just enter 'check_everything -l' to open",
60
- "the link file."
61
- end
62
- # Assume no problems with the link file.
63
- @category_space, @category_dash = false, false
56
+ ARGV.clear # prevent ARGV from interfering with "gets" input.
57
+
58
+ # Run first-time options if check_everything hasn't been run yet.
59
+ customize_installation if !File.exists?(LINKFILE)
64
60
 
65
61
  extract_links
66
62
 
67
63
  # First check for unknown arguments and print out a helpful message.
68
- known_tags = KNOWN_TAGS.values.flatten + @links.keys + @ruby_links
69
- unmatched_args = @argv.select do |arg|
70
- !known_tags.any? do |known_tag|
71
- known_tag.downcase == arg.split("#")[0]
72
- end
73
- end
64
+ unmatched_args = unknown_arguments
74
65
  if !unmatched_args.empty?
75
- puts "\nUnknown option#{@argv.size > 1 ? "s" : nil}: " +
76
- "#{unmatched_args.join(" ")}"
77
- print "usage: check_everything"
78
- KNOWN_TAGS.values.flatten.each {|tag| print " [#{tag}]"}
79
- puts "\n\nHint: Enter 'check_everything --help' to see the options!"
80
- puts "\n"
66
+ puts_unmatched_error_message(unmatched_args)
81
67
 
82
- # Print out a help message.
83
- elsif @argv.any? {|arg| KNOWN_TAGS[:help].include?(arg)}
68
+ # Respond to flags.
69
+ elsif argv_requests?(:help)
84
70
  help
85
-
86
- # Edit the tags and links.
87
- elsif @argv.any? {|arg| KNOWN_TAGS[:links].include?(arg)}
88
- # If asked to build the Ruby Dev file, build it!
89
- assemble_ruby_docs_file if @ruby_dev_assemble
90
-
71
+ elsif argv_requests?(:links)
91
72
  system("open #{LINKFILE}")
92
-
93
- elsif @argv.any? {|arg| KNOWN_TAGS[:ruby].include?(arg)}
73
+ elsif argv_requests?(:ruby)
94
74
  assemble_ruby_docs_file
95
-
96
- # Check for errors; don't allow the user to see bad categories or open up
97
- # websites if the categories are not formatted properly.
98
- elsif @category_space
99
- puts "Your link file includes a category with a space in it; " +
100
- "please fix by entering 'check_everything -l' into your command line."
101
- elsif @category_dash
102
- puts "Your link file includes a category with a dash, which is " +
103
- "not allowed; please fix by entering 'check_everything -l' into your command line."
104
-
105
- # View the categories the user has defined.
106
- elsif @argv.any? {|arg| KNOWN_TAGS[:categories].include?(arg)}
107
- view_categories
108
75
 
109
- # Open up the websites!
76
+ # Block execution of final options if an invalid character exists
77
+ # in the user's link file.
78
+ elsif @invalid_char_in_links
79
+ puts "Your link file includes a category with a " +
80
+ "\"#{@invalid_char_in_links}\" character in it; please fix by " +
81
+ "entering 'check_everything -l' into your command line."
82
+ elsif argv_requests?(:categories)
83
+ view_categories
84
+ # If there are no flags, open the websites!
110
85
  else
111
86
  open_links
112
87
  end
113
88
  end
114
89
 
115
90
  private
91
+
92
+ def self.known_flags
93
+ KNOWN_FLAGS.values.map{|command| command[:flags]}.flatten
94
+ end
95
+
96
+ def self.customize_installation
97
+ # If a previous version created a file rather than a directory, move it into
98
+ # the new directory.
99
+ if File.exists?(LINKPATH)
100
+ system("mv #{LINKPATH} #{LINKPATH}99999999")
101
+ system("mkdir #{LINKPATH}")
102
+ system("mv #{LINKPATH}99999999 #{LINKFILE}")
103
+ else
104
+ system("mkdir #{LINKPATH}")
105
+ system("cp #{File.dirname(__FILE__)}/check_everything/links.txt #{LINKFILE}")
106
+
107
+ # On first run, prompt to customize the installation.
108
+ @argv = ["-l"]
109
+ print "Greetings, new user! You're almost ready to use check_everything! "
110
+ print "Are you a Ruby Dev who will want documentation-checking ",
111
+ "functionality? [Y/n] "
112
+ assemble_ruby_docs_file unless gets.strip.downcase == 'n'
113
+ puts "\nPlease customize your installation.",
114
+ "This message will only be shown once.",
115
+ "To open again and customize, just enter 'check_everything -l' to open",
116
+ "the link file."
117
+ puts "You may now use check_everything normally."
118
+ end
119
+ end
120
+
121
+ def self.unknown_arguments
122
+ all_known_flags = known_flags + @links.keys + @ruby_links
123
+ @argv.select do |arg|
124
+ all_known_flags.none? do |known_flag|
125
+ known_flag.downcase == arg.split(/#|::/)[0]
126
+ end
127
+ end
128
+ end
129
+
130
+ def self.puts_unmatched_error_message(unmatched_args)
131
+ puts "\nUnknown option#{@argv.size > 1 ? "s" : nil}: " +
132
+ "#{unmatched_args.join(" ")}"
133
+ print "usage: check_everything"
134
+ known_flags.each {|flag| print " [#{flag}]"}
135
+ puts "\n\nHint: Enter 'check_everything --help' to see the options!"
136
+ puts "\n"
137
+ end
138
+
139
+ def self.argv_requests?(command)
140
+ @argv.any? {|arg| KNOWN_FLAGS[command][:flags].include?(arg)}
141
+ end
142
+
116
143
  def self.help
117
- puts "\n'check_everything' will open all sites labeled with the 'default' tag."
144
+ puts "\n'check_everything' without flags will open all sites labeled " +
145
+ "with the 'default' category."
118
146
  puts
119
- puts "Available tags:"
120
- puts " -h, --help display the help message"
121
- puts " -l, --links view/edit links and categories"
122
- puts " -r, --ruby install Ruby Documentation functionality"
123
- puts " -c, --categories view the currently defined categories"
124
- puts " -a, --all open all websites (will override documentation lookup)"
125
- puts " <categories> open a specific site group"
147
+ puts "Available flags:"
148
+ sorted_flags = KNOWN_FLAGS.sort_by{|command, details| details[:position]}
149
+ sorted_flags.each do |command, details|
150
+ puts " #{details[:flags].join(", ").ljust(21)}#{details[:description]}"
151
+ end
152
+ puts " #{"<categories>".ljust(21)}open a specific site group"
126
153
  puts " (multiple are allowed, separated by spaces)"
127
- puts
128
- puts "Note: The first tag in this list will be the only tag evaluated."
129
- puts
154
+ if ruby_doc_installed?
155
+ puts " #{"<Ruby classes>".ljust(21)}open specified Ruby documentation"
156
+ end
157
+ puts "\nNote: The first flag in this list will be the only flag evaluated."
130
158
  end
131
159
 
132
160
  def self.view_categories
@@ -135,6 +163,7 @@ class CheckEverything
135
163
  end
136
164
 
137
165
  def self.assemble_ruby_docs_file
166
+ added_or_installed = ruby_doc_installed? ? "updated" : "installed"
138
167
  ruby_doc = Nokogiri::HTML(open("http://ruby-doc.org/core/"))
139
168
  class_names = []
140
169
  ruby_doc.css("p.class a").each{|class_name| class_names << class_name.text}
@@ -146,14 +175,13 @@ class CheckEverything
146
175
  f.print class_names.join("\n")
147
176
  }
148
177
  system("cp #{File.dirname(__FILE__)}/ruby_doc #{RUBYFILE}")
178
+ puts "Ruby documentation feature #{added_or_installed}!"
149
179
  end
150
180
 
151
181
  def self.open_links
152
182
  @argv << "default" if @argv.empty?
153
183
 
154
- # If -a or --all is specified, select all links. Otherwise, select specified
155
- # links, or the default links if none are specified.
156
- if @argv.any?{|arg| KNOWN_TAGS[:all].include?(arg)}
184
+ if argv_requests?(:all)
157
185
  links = @links.values.flatten.uniq
158
186
  else
159
187
  # Get links for all recognized categories
@@ -162,94 +190,126 @@ class CheckEverything
162
190
  links.concat(add_documentation_to_links)
163
191
  end
164
192
 
165
- urls = links.map { |url|
166
- url.start_with?("http") ? url : url = "http://" << url
193
+ # Reject any empty strings ("-- " in the link file)
194
+ links.reject!{|link| link.strip.empty?}
195
+ links = add_http(links)
196
+ launch(links)
197
+ end
198
+
199
+ def self.add_http(links)
200
+ links.map { |url|
201
+ url.start_with?("http") ? "\"#{url}\"" : url = "\"#{"http://" << url}\""
167
202
  }.join(" ")
168
- system("open #{urls}")
203
+ end
169
204
 
170
- puts "\nIt's been a pleasure serving up your websites!"
171
- puts "Did you know you can use categories to open specific site groups? " +
205
+ def self.launch(urls)
206
+ if !urls.empty?
207
+ system("open #{urls}")
208
+
209
+ puts "\nIt's been a pleasure serving up your websites!"
210
+ puts "Did you know you can use categories to open specific site groups? " +
172
211
  "Enter 'check_everything --links' for details.\n" if ARGV.empty?
212
+ else
213
+ puts "You don't seem to have any links for \"#{@argv.join("\" or \"")}\" in " +
214
+ "your file. Enter `check_everything -l` into your command line to " +
215
+ "add some links!"
216
+ end
173
217
  end
174
218
 
175
219
  def self.add_documentation_to_links
176
- [].tap do |links|
177
- if File.exists?(RUBYFILE)
220
+ [].tap do |doc_links|
221
+ if ruby_doc_installed?
178
222
  classes = read_file(RUBYFILE).split
179
223
 
180
- # Allow arguments of the form "array" or "array#collect"
181
- class_argv = @argv.map {|arg| arg.split('#')}
224
+ # Allow arguments of the form "array" or "array#collect" or "array::new"
225
+ class_argv = @argv.map {|arg| arg.split(/#|:/)}
182
226
  class_matches = classes.map { |class_name|
183
227
  class_argv.map { |name|
184
- # If a match is found, return an array with either 1 element (class)
185
- # or 2 elements (class and method)
186
- if class_name.downcase == name[0]
187
- [class_name, name[1]].compact
188
- end
228
+ # If a match is found, return an array with either 1 element (class) or
229
+ # 2 elements (class, instance method) or 3 elements (class, "", class method)
230
+ [class_name, name[1], name[2]] if class_name.downcase == name[0]
189
231
  }.compact
190
232
  }.reject(&:empty?).flatten(1)
191
233
 
192
234
  # If matches were found, serve them up!
193
- if class_matches.size > 0
194
- class_matches.each do |klass|
195
- # Add a method name to the link only if one is specified.
196
- method = klass[1] ? "#method-i-#{klass[1]}" : ""
197
- method = method.gsub(/[#{SUB_CHARS.keys}\[\]]/,SUB_CHARS)
198
- method = method.gsub('--','-')
199
- method = method[0..-2] if method[-1] == '-'
200
- method = method[1..-1] if method[0] == '-'
201
- links << "ruby-doc.org/core-#{RUBY_VERSION}/#{klass[0]}.html#{method}"
202
- end
235
+ class_matches.each do |klass|
236
+ # Add a method name to the link only if one is specified.
237
+ method = if klass[2]
238
+ # For class methods, use the class method link format.
239
+ "#method-c-#{klass[2]}"
240
+ elsif klass[1]
241
+ # For instance methods, use the instance method link format.
242
+ "#method-i-#{klass[1]}"
243
+ else
244
+ ""
245
+ end
246
+ # Create link path and remove extra dashes added
247
+ # in the process of replacing special characters.
248
+ method = method.gsub(/[#{SUB_CHARS.keys}\[\]]/,SUB_CHARS).gsub('--','-')
249
+ method = method[0..-2] if method[-1] == '-'
250
+ doc_links << "ruby-doc.org/core-#{RUBY_VERSION}/#{klass[0]}.html#{method}"
203
251
  end
204
252
  end
205
253
  end
206
254
  end
207
255
 
208
- def self.read_file(file_name)
209
- file = File.open(file_name, "r")
210
- data = file.read
211
- file.close
212
- data
256
+ def self.extract_links
257
+ extract_links_from(read_file(LINKFILE).split("\n"))
258
+ extract_ruby_links
213
259
  end
214
260
 
215
- def self.extract_links
216
- link_file = read_file(LINKFILE).split("\n")
217
- cur_tags = []
218
-
261
+ def self.extract_links_from(link_file)
262
+ current_categories = []
219
263
  @links = {}
220
264
  link_file.each do |line|
221
- if line.start_with?("&&")
222
- # add tags as keys in @links, and assign to cur_tags
223
- cur_tags = add_category(line[2..-1].strip).flatten
224
- elsif line.start_with?("--")
225
- # add links to each relevant tag in @links
226
- cur_tags.each { |tag|
227
- @links[tag] << line[2..-1].strip
265
+ case line[0,2]
266
+ when "&&"
267
+ # add categories as keys in @links, and assign to current categories
268
+ current_categories = add_category(line[2..-1].strip)
269
+ when "--"
270
+ # add links to each relevant categories in @links
271
+ current_categories.each { |category|
272
+ @links[category] << line[2..-1].strip
228
273
  }
229
274
  end
230
275
  end
231
-
232
- @ruby_links = []
233
- if File.exists?(RUBYFILE)
234
- classes = read_file(RUBYFILE).split
235
- classes.each {|class_name| @ruby_links << class_name}
236
- end
237
276
  end
238
277
 
239
- # Recursive helper method for extract_links
240
278
  def self.add_category(line)
241
279
  line.downcase!
242
- # Add multiple tags, if separated by semicolons.
280
+ # Add multiple categories, if separated by semicolons.
243
281
  if line.include?(";")
244
- line.split(";").map(&:strip).each do |tag|
245
- add_category(tag.strip)
282
+ line.split(";").map(&:strip).each do |category|
283
+ add_category(category.strip)
246
284
  end
247
285
  else
248
286
  # Note to raise an error if there is an invalid category.
249
- @category_space = true if line.match(/ /)
250
- @category_dash = true if line.match(/-/)
287
+ invalid_char = line.match(/[ \-#:\/]/)
288
+ if invalid_char
289
+ @invalid_char_in_links = invalid_char.to_a[0] if invalid_char
290
+ end
291
+ # Optionally instantiate an array for the category if it doesn't exist yet.
251
292
  @links[line] ||= []
252
293
  [line]
253
294
  end
254
295
  end
296
+
297
+ def self.extract_ruby_links
298
+ @ruby_links = []
299
+ if ruby_doc_installed?
300
+ classes = read_file(RUBYFILE).split
301
+ classes.each {|class_name| @ruby_links << class_name}
302
+ end
303
+ end
304
+
305
+ def self.read_file(file_name)
306
+ file = File.open(file_name, "r")
307
+ data = file.read
308
+ file.close
309
+ data
310
+ end
311
+
312
+ def self.ruby_doc_installed?
313
+ File.exists?(RUBYFILE)
314
+ end
255
315
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: check_everything
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ariel Caplan