httpdisk 0.5.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
- require 'cgi'
2
- require 'digest/md5'
3
- require 'uri'
1
+ require "cgi"
2
+ require "digest/md5"
3
+ require "uri"
4
4
 
5
5
  module HTTPDisk
6
6
  class CacheKey
@@ -10,7 +10,7 @@ module HTTPDisk
10
10
  @env, @ignore_params = env, ignore_params
11
11
 
12
12
  # sanity checks
13
- raise InvalidUrl, "http/https required #{env.url.inspect}" if env.url.scheme !~ /^https?$/
13
+ raise InvalidUrl, "http/https required #{env.url.inspect}" if !/^https?$/.match?(env.url.scheme)
14
14
  raise InvalidUrl, "hostname required #{env.url.inspect}" if !env.url.host
15
15
  end
16
16
 
@@ -43,23 +43,23 @@ module HTTPDisk
43
43
  def calculate_key
44
44
  key = []
45
45
  key << env.method.upcase
46
- key << ' '
46
+ key << " "
47
47
  key << url.scheme
48
- key << '://'
48
+ key << "://"
49
49
  key << url.host.downcase
50
50
  if !default_port?
51
- key << ':'
51
+ key << ":"
52
52
  key << url.port
53
53
  end
54
- if url.path != '/'
54
+ if url.path != "/"
55
55
  key << url.path
56
56
  end
57
- if (q = url.query) && q != ''
58
- key << '?'
57
+ if (q = url.query) && q != ""
58
+ key << "?"
59
59
  key << querykey(q)
60
60
  end
61
61
  if env.request_body
62
- key << ' '
62
+ key << " "
63
63
  key << bodykey
64
64
  end
65
65
  key.join
@@ -68,7 +68,7 @@ module HTTPDisk
68
68
  # Calculate cache key segment for body
69
69
  def bodykey
70
70
  body = env.request_body.to_s
71
- if env.request_headers['Content-Type'] == 'application/x-www-form-urlencoded'
71
+ if env.request_headers["Content-Type"] == "application/x-www-form-urlencoded"
72
72
  querykey(body)
73
73
  elsif body.length < 50
74
74
  body
@@ -79,16 +79,16 @@ module HTTPDisk
79
79
 
80
80
  # Calculate canonical key for a query
81
81
  def querykey(q)
82
- parts = q.split('&').sort
82
+ parts = q.split("&").sort
83
83
  if !ignore_params.empty?
84
84
  parts = parts.map do |part|
85
- key, value = part.split('=', 2)
85
+ key, value = part.split("=", 2)
86
86
  next if ignore_params.include?(key)
87
87
 
88
88
  "#{key}=#{value}"
89
89
  end.compact
90
90
  end
91
- parts.join('&')
91
+ parts.join("&")
92
92
  end
93
93
 
94
94
  def default_port?
@@ -98,10 +98,10 @@ module HTTPDisk
98
98
  # Calculate nice directory name from url.host
99
99
  def hostdir
100
100
  hostdir = url.host.downcase
101
- hostdir = hostdir.gsub(/^www\./, '')
102
- hostdir = hostdir.gsub(/[^a-z0-9._-]/, '')
103
- hostdir = hostdir.squeeze('.')
104
- hostdir = 'any' if hostdir.empty?
101
+ hostdir = hostdir.gsub(/^www\./, "")
102
+ hostdir = hostdir.gsub(/[^a-z0-9._-]/, "")
103
+ hostdir = hostdir.squeeze(".")
104
+ hostdir = "any" if hostdir.empty?
105
105
  hostdir
106
106
  end
107
107
  end
@@ -1,8 +1,8 @@
1
1
  # manually load dependencies here since this is loaded standalone by bin
2
- require 'httpdisk/error'
3
- require 'httpdisk/slop_duration'
4
- require 'httpdisk/version'
5
- require 'slop'
2
+ require "httpdisk/error"
3
+ require "httpdisk/slop_duration"
4
+ require "httpdisk/version"
5
+ require "slop"
6
6
 
7
7
  module HTTPDisk
8
8
  module Cli
@@ -10,43 +10,43 @@ module HTTPDisk
10
10
  module Args
11
11
  def self.slop(args)
12
12
  slop = Slop.parse(args) do |o|
13
- o.banner = 'httpdisk [options] [url]'
13
+ o.banner = "httpdisk [options] [url]"
14
14
 
15
15
  # similar to curl
16
- o.separator 'Similar to curl:'
17
- o.string '-d', '--data', 'HTTP POST data'
18
- o.array '-H', '--header', 'pass custom header(s) to server', delimiter: nil
19
- o.boolean '-i', '--include', 'include response headers in the output'
20
- o.integer '-m', '--max-time', 'maximum time allowed for the transfer'
21
- o.string '-o', '--output', 'write to file instead of stdout'
22
- o.string '-x', '--proxy', 'use host[:port] as proxy'
23
- o.string '-X', '--request', 'HTTP method to use'
24
- o.integer '--retry', 'retry request if problems occur'
25
- o.boolean '-s', '--silent', "silent mode (don't print errors)"
26
- o.string '-A', '--user-agent', 'send User-Agent to server'
16
+ o.separator "Similar to curl:"
17
+ o.string "-d", "--data", "HTTP POST data"
18
+ o.array "-H", "--header", "pass custom header(s) to server", delimiter: nil
19
+ o.boolean "-i", "--include", "include response headers in the output"
20
+ o.integer "-m", "--max-time", "maximum time allowed for the transfer"
21
+ o.string "-o", "--output", "write to file instead of stdout"
22
+ o.string "-x", "--proxy", "use host[:port] as proxy"
23
+ o.string "-X", "--request", "HTTP method to use"
24
+ o.integer "--retry", "retry request if problems occur"
25
+ o.boolean "-s", "--silent", "silent mode (don't print errors)"
26
+ o.string "-A", "--user-agent", "send User-Agent to server"
27
27
 
28
28
  # from httpdisk
29
- o.separator 'Specific to httpdisk:'
30
- o.string '--dir', 'httpdisk cache directory (defaults to ~/httpdisk)'
31
- o.duration '--expires', 'when to expire cached requests (ex: 1h, 2d, 3w)'
32
- o.boolean '--force', "don't read anything from cache (but still write)"
33
- o.boolean '--force-errors', "don't read errors from cache (but still write)"
34
- o.boolean '--status', 'show status for a url in the cache'
29
+ o.separator "Specific to httpdisk:"
30
+ o.string "--dir", "httpdisk cache directory (defaults to ~/httpdisk)"
31
+ o.duration "--expires", "when to expire cached requests (ex: 1h, 2d, 3w)"
32
+ o.boolean "--force", "don't read anything from cache (but still write)"
33
+ o.boolean "--force-errors", "don't read errors from cache (but still write)"
34
+ o.boolean "--status", "show status for a url in the cache"
35
35
 
36
36
  # generic
37
- o.boolean '--version', 'show version' do
37
+ o.boolean "--version", "show version" do
38
38
  puts "httpdisk #{HTTPDisk::VERSION}"
39
39
  exit
40
40
  end
41
- o.on '--help', 'show this help' do
41
+ o.on "--help", "show this help" do
42
42
  puts o
43
43
  exit
44
44
  end
45
45
  end
46
46
 
47
- raise Slop::Error, '' if args.empty?
48
- raise Slop::Error, 'no URL specified' if slop.args.empty?
49
- raise Slop::Error, 'more than one URL specified' if slop.args.length > 1
47
+ raise Slop::Error, "" if args.empty?
48
+ raise Slop::Error, "no URL specified" if slop.args.empty?
49
+ raise Slop::Error, "more than one URL specified" if slop.args.length > 1
50
50
 
51
51
  slop.to_h.tap do
52
52
  _1[:url] = slop.args.first
@@ -1,6 +1,6 @@
1
- require 'faraday-cookie_jar'
2
- require 'faraday_middleware'
3
- require 'ostruct'
1
+ require "faraday-cookie_jar"
2
+ require "faraday/follow_redirects"
3
+ require "ostruct"
4
4
 
5
5
  module HTTPDisk
6
6
  module Cli
@@ -31,7 +31,7 @@ module HTTPDisk
31
31
 
32
32
  # output
33
33
  if options[:output]
34
- File.open(options[:output], 'w') { output(response, _1) }
34
+ File.open(options[:output], "w") { output(response, _1) }
35
35
  else
36
36
  output(response, $stdout)
37
37
  end
@@ -59,7 +59,7 @@ module HTTPDisk
59
59
  max: options[:retry],
60
60
  methods: %w[delete get head options patch post put trace],
61
61
  retry_statuses: (500..600).to_a,
62
- retry_if: ->(_env, _err) { true },
62
+ retry_if: ->(_env, _err) { true }
63
63
  }
64
64
  _1.request :retry, retry_options
65
65
  end
@@ -103,9 +103,9 @@ module HTTPDisk
103
103
  method = if options[:request]
104
104
  options[:request]
105
105
  elsif options[:data]
106
- 'post'
106
+ "post"
107
107
  end
108
- method ||= 'get'
108
+ method ||= "get"
109
109
  method = method.downcase.to_sym
110
110
 
111
111
  if !Faraday::Connection::METHODS.include?(method)
@@ -119,9 +119,9 @@ module HTTPDisk
119
119
  def request_url
120
120
  url = options[:url]
121
121
  # recover from missing http:
122
- if url !~ %r{^https?://}i
123
- if url =~ %r{^\w+://}
124
- raise CliError, 'only http/https supported'
122
+ if !%r{^https?://}i.match?(url)
123
+ if %r{^\w+://}.match?(url)
124
+ raise CliError, "only http/https supported"
125
125
  end
126
126
 
127
127
  url = "http://#{url}"
@@ -140,11 +140,11 @@ module HTTPDisk
140
140
  def request_headers
141
141
  {}.tap do |headers|
142
142
  if options[:user_agent]
143
- headers['User-Agent'] = options[:user_agent]
143
+ headers["User-Agent"] = options[:user_agent]
144
144
  end
145
145
 
146
146
  options[:header].each do |header|
147
- key, value = header.split(': ', 2)
147
+ key, value = header.split(": ", 2)
148
148
  if !key || !value || key.empty? || value.empty?
149
149
  raise CliError, "invalid --header #{header.inspect}"
150
150
  end
@@ -1,6 +1,6 @@
1
- require 'content-type'
2
- require 'faraday'
3
- require 'logger'
1
+ require "content-type"
2
+ require "faraday"
3
+ require "logger"
4
4
 
5
5
  module HTTPDisk
6
6
  # Middleware and main entry point.
@@ -9,7 +9,7 @@ module HTTPDisk
9
9
 
10
10
  def initialize(app, options = {})
11
11
  options = Sloptions.parse(options) do
12
- _1.string :dir, default: File.join(ENV['HOME'], 'httpdisk')
12
+ _1.string :dir, default: File.join(ENV["HOME"], "httpdisk")
13
13
  _1.integer :expires
14
14
  _1.boolean :force
15
15
  _1.boolean :force_errors
@@ -23,12 +23,12 @@ module HTTPDisk
23
23
  end
24
24
 
25
25
  def call(env)
26
- cache_key = CacheKey.new(env, ignore_params: ignore_params)
26
+ cache_key = CacheKey.new(env, ignore_params:)
27
27
  logger&.info("#{env.method.upcase} #{env.url} (#{cache.status(cache_key)})")
28
28
  env[:httpdisk_diskpath] = cache.diskpath(cache_key)
29
29
 
30
30
  # check cache, fallback to network
31
- if response = read(cache_key, env)
31
+ if (response = read(cache_key, env))
32
32
  response.env[:httpdisk] = true
33
33
  else
34
34
  response = perform(env)
@@ -48,7 +48,7 @@ module HTTPDisk
48
48
  status: cache.status(cache_key).to_s,
49
49
  key: cache_key.key,
50
50
  digest: cache_key.digest,
51
- path: cache.diskpath(cache_key),
51
+ path: cache.diskpath(cache_key)
52
52
  }
53
53
  end
54
54
 
@@ -90,7 +90,7 @@ module HTTPDisk
90
90
  def stuff_999_response(env, err)
91
91
  env.tap do
92
92
  _1.reason_phrase = "#{err.class} #{err.message}"
93
- _1.response_body = ''
93
+ _1.response_body = ""
94
94
  _1.response_headers = Faraday::Utils::Headers.new
95
95
  _1.status = HTTPDisk::ERROR_STATUS
96
96
  end
@@ -110,11 +110,11 @@ module HTTPDisk
110
110
  # network. Not all adapters honor Content-Type (including the default
111
111
  # adapter).
112
112
  def encode_body(response)
113
- body = response.body || ''
113
+ body = response.body || ""
114
114
 
115
115
  # parse Content-Type
116
116
  begin
117
- content_type = response['Content-Type'] && ContentType.parse(response['Content-Type'])
117
+ content_type = response["Content-Type"] && ContentType.parse(response["Content-Type"])
118
118
  rescue Parslet::ParseFailed
119
119
  # unparsable
120
120
  end
@@ -130,7 +130,7 @@ module HTTPDisk
130
130
  if options[:utf8] && content_type && response_text?(content_type)
131
131
  body = body.dup if body.frozen?
132
132
  begin
133
- body.encode!('UTF-8', invalid: :replace, undef: :replace, replace: '?')
133
+ body.encode!("UTF-8", invalid: :replace, undef: :replace, replace: "?")
134
134
  rescue Encoding::ConverterNotFoundError
135
135
  # rare, can't do anything here
136
136
  body = "httpdisk could not convert from #{body.encoding.name} to UTF-8"
@@ -152,7 +152,7 @@ module HTTPDisk
152
152
  end
153
153
 
154
154
  def response_text?(content_type)
155
- content_type.type == 'text' || content_type.mime_type == 'application/json'
155
+ content_type.type == "text" || content_type.mime_type == "application/json"
156
156
  end
157
157
 
158
158
  #
@@ -1,6 +1,6 @@
1
1
  # manually load dependencies here since this is loaded standalone by bin
2
- require 'httpdisk/version'
3
- require 'slop'
2
+ require "httpdisk/version"
3
+ require "slop"
4
4
 
5
5
  module HTTPDisk
6
6
  module Grep
@@ -8,22 +8,22 @@ module HTTPDisk
8
8
  # Slop parsing. This is broken out so we can run without require 'httpdisk'.
9
9
  def self.slop(args)
10
10
  slop = Slop.parse(args) do |o|
11
- o.banner = 'httpdisk-grep [options] pattern [path ...]'
12
- o.boolean '-c', '--count', 'suppress normal output and show count'
13
- o.boolean '-h', '--head', 'show req headers before each match'
14
- o.boolean '-s', '--silent', 'do not print anything to stdout'
15
- o.boolean '--version', 'show version' do
11
+ o.banner = "httpdisk-grep [options] pattern [path ...]"
12
+ o.boolean "-c", "--count", "suppress normal output and show count"
13
+ o.boolean "-h", "--head", "show req headers before each match"
14
+ o.boolean "-s", "--silent", "do not print anything to stdout"
15
+ o.boolean "--version", "show version" do
16
16
  puts "httpdisk-grep #{HTTPDisk::VERSION}"
17
17
  exit
18
18
  end
19
- o.on '--help', 'show this help' do
19
+ o.on "--help", "show this help" do
20
20
  puts o
21
21
  exit
22
22
  end
23
23
  end
24
24
 
25
- raise Slop::Error, '' if args.empty?
26
- raise Slop::Error, 'no PATTERN specified' if slop.args.empty?
25
+ raise Slop::Error, "" if args.empty?
26
+ raise Slop::Error, "no PATTERN specified" if slop.args.empty?
27
27
 
28
28
  slop.to_h.tap do
29
29
  _1[:pattern] = slop.args.shift
@@ -1,5 +1,5 @@
1
- require 'find'
2
- require 'json'
1
+ require "find"
2
+ require "json"
3
3
 
4
4
  module HTTPDisk
5
5
  module Grep
@@ -13,25 +13,29 @@ module HTTPDisk
13
13
  # Enumerate file paths one at a time. Returns true if matches were found.
14
14
  def run
15
15
  paths.each do
16
- begin
17
- run_one(_1)
18
- rescue StandardError => e
19
- if ENV['HTTPDISK_DEBUG']
20
- $stderr.puts
21
- $stderr.puts e.class
22
- $stderr.puts e.backtrace.join("\n")
23
- end
24
- raise CliError, "#{e.message[0, 70]} (#{_1})"
25
- end
16
+ run_one(_1)
17
+ rescue => e
18
+ if ENV["HTTPDISK_DEBUG"]
19
+ $stderr.puts
20
+ warn e.class
21
+ warn e.backtrace.join("\n")
22
+ end
23
+ raise CliError, "#{e.message[0, 70]} (#{_1})"
26
24
  end
27
25
  success
28
26
  end
29
27
 
30
28
  def run_one(path)
31
29
  # read payload & body
32
- payload = Zlib::GzipReader.open(path, encoding: 'ASCII-8BIT') do
33
- Payload.read(_1)
30
+ begin
31
+ payload = Zlib::GzipReader.open(path, encoding: "ASCII-8BIT") do
32
+ Payload.read(_1)
33
+ end
34
+ rescue Zlib::GzipFile::Error
35
+ puts "httpdisk: #{path} not in gzip format, skipping" if !options[:silent]
36
+ return
34
37
  end
38
+
35
39
  body = prepare_body(payload)
36
40
 
37
41
  # collect all_matches
@@ -51,14 +55,14 @@ module HTTPDisk
51
55
  def paths
52
56
  # roots
53
57
  roots = options[:roots]
54
- roots = ['.'] if roots.empty?
58
+ roots = ["."] if roots.empty?
55
59
 
56
60
  # find files in roots
57
61
  paths = roots.flat_map { Find.find(_1).to_a }.sort
58
62
  paths = paths.select { File.file?(_1) }
59
63
 
60
64
  # strip default './'
61
- paths = paths.map { _1.gsub(%r{^\./}, '') } if options[:roots].empty?
65
+ paths = paths.map { _1.gsub(%r{^\./}, "") } if options[:roots].empty?
62
66
  paths
63
67
  end
64
68
 
@@ -66,13 +70,13 @@ module HTTPDisk
66
70
  def prepare_body(payload)
67
71
  body = payload.body
68
72
 
69
- if content_type = payload.headers['Content-Type']
73
+ if (content_type = payload.headers["Content-Type"])
70
74
  # Mismatches between Content-Type and body.encoding are fatal, so make
71
75
  # an effort to align them.
72
- if charset = content_type[/charset=([^;]+)/, 1]
76
+ if (charset = content_type[/charset=([^;]+)/, 1])
73
77
  encoding = begin
74
78
  Encoding.find(charset)
75
- rescue StandardError
79
+ rescue
76
80
  nil
77
81
  end
78
82
  if encoding && body.encoding != encoding
@@ -81,7 +85,7 @@ module HTTPDisk
81
85
  end
82
86
 
83
87
  # pretty print json for easier searching
84
- if content_type =~ /\bjson\b/
88
+ if /\bjson\b/.match?(content_type)
85
89
  body = JSON.pretty_generate(JSON.parse(body))
86
90
  end
87
91
  end
@@ -96,12 +100,11 @@ module HTTPDisk
96
100
 
97
101
  # printer for output
98
102
  def printer
99
- @printer ||= case
100
- when options[:silent]
103
+ @printer ||= if options[:silent]
101
104
  Grep::SilentPrinter.new
102
- when options[:count]
105
+ elsif options[:count]
103
106
  Grep::CountPrinter.new($stdout)
104
- when options[:head] || $stdout.tty?
107
+ elsif options[:head] || $stdout.tty?
105
108
  Grep::HeaderPrinter.new($stdout, options[:head])
106
109
  else
107
110
  Grep::TersePrinter.new($stdout)
@@ -1,7 +1,7 @@
1
1
  module HTTPDisk
2
2
  module Grep
3
3
  class Printer
4
- GREP_COLOR = '37;45'.freeze
4
+ GREP_COLOR = "37;45".freeze
5
5
 
6
6
  attr_reader :output
7
7
 
@@ -9,7 +9,8 @@ module HTTPDisk
9
9
  @output = output
10
10
  end
11
11
 
12
- def print(path, payload, all_matches); end
12
+ def print(path, payload, all_matches)
13
+ end
13
14
 
14
15
  protected
15
16
 
@@ -18,7 +19,7 @@ module HTTPDisk
18
19
  #
19
20
 
20
21
  def grep_color
21
- @grep_color ||= (ENV['GREP_COLOR'] || GREP_COLOR)
22
+ @grep_color ||= (ENV["GREP_COLOR"] || GREP_COLOR)
22
23
  end
23
24
 
24
25
  def print_matches(matches)
@@ -30,7 +31,7 @@ module HTTPDisk
30
31
  result << s[ii..._1.begin(0)]
31
32
  result << "\e["
32
33
  result << grep_color
33
- result << 'm'
34
+ result << "m"
34
35
  result << _1[0]
35
36
  result << "\e[0m"
36
37
  ii = _1.end(0)
@@ -12,7 +12,7 @@ module HTTPDisk
12
12
 
13
13
  # headers
14
14
  while (line = f.gets.chomp) && !line.empty?
15
- key, value = line.split(': ', 2)
15
+ key, value = line.split(": ", 2)
16
16
  p.headers[key] = value
17
17
  end
18
18
 
@@ -34,8 +34,8 @@ module HTTPDisk
34
34
  attr_accessor :body, :comment, :headers, :reason_phrase, :status
35
35
 
36
36
  def initialize
37
- @body = ''
38
- @comment = ''
37
+ @body = ""
38
+ @comment = ""
39
39
  @headers = Faraday::Utils::Headers.new
40
40
  end
41
41
 
@@ -1,4 +1,4 @@
1
- require 'slop'
1
+ require "slop"
2
2
 
3
3
  module Slop
4
4
  # Custom duration type for Slop, used for --expires. Raises aggressively
@@ -10,14 +10,14 @@ module Slop
10
10
  h: 60 * 60,
11
11
  d: 24 * 60 * 60,
12
12
  w: 7 * 24 * 60 * 60,
13
- y: 365 * 7 * 24 * 60 * 60,
13
+ y: 365 * 7 * 24 * 60 * 60
14
14
  }.freeze
15
15
 
16
16
  def call(value)
17
17
  m = value.match(/^(\d+)([smhdwy])?$/)
18
18
  raise Slop::Error, "invalid --expires #{value.inspect}" if !m
19
19
 
20
- num, unit = m[1].to_i, (m[2] || 's').to_sym
20
+ num, unit = m[1].to_i, (m[2] || "s").to_sym
21
21
  num * UNITS[unit]
22
22
  end
23
23
  end
@@ -32,10 +32,10 @@ module HTTPDisk
32
32
 
33
33
  %i[array boolean float hash integer string symbol].each do |method|
34
34
  define_method(method) do |flag, foptions = {}|
35
- on(flag, { type: method }.merge(foptions))
35
+ on(flag, {type: method}.merge(foptions))
36
36
  end
37
37
  end
38
- alias bool boolean
38
+ alias_method :bool, :boolean
39
39
 
40
40
  #
41
41
  # return parsed options
@@ -96,9 +96,9 @@ module HTTPDisk
96
96
  def error_message(flag, value, valid)
97
97
  classes = valid.compact.map do
98
98
  s = _1.to_s
99
- s = s.downcase if s =~ /\b(Array|Float|Hash|Integer|String|Symbol)\b/
99
+ s = s.downcase if /\b(Array|Float|Hash|Integer|String|Symbol)\b/.match?(s)
100
100
  s
101
- end.join('/')
101
+ end.join("/")
102
102
  "expected :#{flag} to be #{classes}, not #{value.inspect}"
103
103
  end
104
104
  end
@@ -1,3 +1,3 @@
1
1
  module HTTPDisk
2
- VERSION = '0.5.2'.freeze
2
+ VERSION = "1.0.0".freeze
3
3
  end
data/lib/httpdisk.rb CHANGED
@@ -1,17 +1,17 @@
1
- require 'httpdisk/cache_key'
2
- require 'httpdisk/cache'
3
- require 'httpdisk/client'
4
- require 'httpdisk/error'
5
- require 'httpdisk/payload'
6
- require 'httpdisk/slop_duration'
7
- require 'httpdisk/sloptions'
8
- require 'httpdisk/version'
1
+ require "httpdisk/cache_key"
2
+ require "httpdisk/cache"
3
+ require "httpdisk/client"
4
+ require "httpdisk/error"
5
+ require "httpdisk/payload"
6
+ require "httpdisk/slop_duration"
7
+ require "httpdisk/sloptions"
8
+ require "httpdisk/version"
9
9
 
10
10
  # cli
11
- require 'httpdisk/cli/args'
12
- require 'httpdisk/cli/main'
11
+ require "httpdisk/cli/args"
12
+ require "httpdisk/cli/main"
13
13
 
14
14
  # grep
15
- require 'httpdisk/grep/args'
16
- require 'httpdisk/grep/main'
17
- require 'httpdisk/grep/printer'
15
+ require "httpdisk/grep/args"
16
+ require "httpdisk/grep/main"
17
+ require "httpdisk/grep/printer"