fd 1.0.0 → 1.0.1
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/.github/workflows/main.yml +1 -1
- data/.rubocop.yml +20 -0
- data/.ruby-version +1 -0
- data/Gemfile +21 -0
- data/README.md +8 -4
- data/Rakefile +7 -1
- data/bin/fd +4 -2
- data/fd.gemspec +1 -13
- data/lib/fd/version.rb +1 -1
- data/lib/fd.rb +24 -21
- metadata +8 -163
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79678d50cb3a33dd8db130fb309a9a7636511cfdc1b0f803c15a16af05811b59
|
4
|
+
data.tar.gz: '069fb8252dd99e14d04dcce97d795f13c60d1574d428e4e6d731364caf562088'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ee3d3708e6eef81509591e96d608781307273309b53888d745e4274437db5f2d84300a2058a9fcc241a9f21338107d3fbb27de4744e128dae9a070f9b7a556d
|
7
|
+
data.tar.gz: 806bacb747669e0e5ddc58e9b80d905d9cbae12acf78ba80ff731e93807e2b6ee31d344ce57964d9d09c28a00c0fcc980b3e8bfb4f42689729990f1662b6f3fe
|
data/.github/workflows/main.yml
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# The behavior of RuboCop can be controlled via the .rubocop.yml
|
2
|
+
# configuration file. It makes it possible to enable/disable
|
3
|
+
# certain cops (checks) and to alter their behavior if they accept
|
4
|
+
# any parameters. The file can be placed either in your home
|
5
|
+
# directory or in some project directory.
|
6
|
+
#
|
7
|
+
# RuboCop will start looking for the configuration file in the directory
|
8
|
+
# where the inspected file is and continue its way up to the root directory.
|
9
|
+
#
|
10
|
+
# See https://docs.rubocop.org/rubocop/configuration
|
11
|
+
|
12
|
+
require:
|
13
|
+
- rubocop-minitest
|
14
|
+
- rubocop-rake
|
15
|
+
|
16
|
+
AllCops:
|
17
|
+
NewCops: enable
|
18
|
+
|
19
|
+
Style/OpenStructUse:
|
20
|
+
Enabled: false
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.4.1
|
data/Gemfile
CHANGED
@@ -4,3 +4,24 @@ source 'https://rubygems.org'
|
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in fd.gemspec
|
6
6
|
gemspec
|
7
|
+
|
8
|
+
group :development, :test do
|
9
|
+
gem 'guard-bundler'
|
10
|
+
gem 'guard-minitest'
|
11
|
+
gem 'logger'
|
12
|
+
gem 'minitest'
|
13
|
+
gem 'minitest-reporters'
|
14
|
+
gem 'mutex_m'
|
15
|
+
gem 'ostruct'
|
16
|
+
gem 'pry'
|
17
|
+
gem 'pry-doc'
|
18
|
+
gem 'rake'
|
19
|
+
gem 'rb-fsevent'
|
20
|
+
gem 'rubocop'
|
21
|
+
gem 'rubocop-minitest', require: false
|
22
|
+
gem 'rubocop-performance', require: false
|
23
|
+
gem 'rubocop-rake', require: false
|
24
|
+
gem 'simplecov'
|
25
|
+
gem 'terminal-notifier'
|
26
|
+
gem 'terminal-notifier-guard'
|
27
|
+
end
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
`fd` reads files (or STDIN) _as a sequence of (UTF-8) characters_ and dumps the content to _STDOUT_, thus the name `fd`. It does so in two columns, the left one will display the hex values of the bytes in the file, the right one will display the characters.
|
10
10
|
|
11
11
|
## History
|
12
|
-
|
12
|
+
|
13
13
|
I created this tool **back in 2004**. It was programmed in a different world: On another operating system, using another file system (which most notably didn't have the concept of case-sensitive file names). This version originally used ISO-8859-1 as the default (and only) encoding, while it now assumes UTF-8.
|
14
14
|
|
15
15
|
The early versions had it easy: Each character was assumed to use one byte in the file. This made displaying it in rows with a constant number of characters easy. Nowadays, however, a singe character may be composed of a (varying) number of bytes, making it impossible to always display the same number of characters in each row.
|
@@ -26,11 +26,15 @@ gem 'fd'
|
|
26
26
|
|
27
27
|
Then execute:
|
28
28
|
|
29
|
-
|
29
|
+
```bash
|
30
|
+
bundle install
|
31
|
+
```
|
30
32
|
|
31
33
|
Or install it yourself as:
|
32
34
|
|
33
|
-
|
35
|
+
```bash
|
36
|
+
gem install fd
|
37
|
+
```
|
34
38
|
|
35
39
|
Also see the [fd page on rubygems.org](https://rubygems.org/gems/fd)
|
36
40
|
|
@@ -38,7 +42,7 @@ Also see the [fd page on rubygems.org](https://rubygems.org/gems/fd)
|
|
38
42
|
|
39
43
|
You can pass _file names_ on the command line:
|
40
44
|
|
41
|
-
```
|
45
|
+
```bash
|
42
46
|
fd [-w number] [file_names]
|
43
47
|
```
|
44
48
|
|
data/Rakefile
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'bundler/gem_tasks'
|
4
4
|
require 'rake/testtask'
|
5
|
+
require 'rubocop/rake_task'
|
6
|
+
require 'rubocop'
|
5
7
|
|
6
8
|
Rake::TestTask.new(:test) do |t|
|
7
9
|
t.libs << 'test'
|
@@ -9,4 +11,8 @@ Rake::TestTask.new(:test) do |t|
|
|
9
11
|
t.test_files = FileList['test/**/*_test.rb']
|
10
12
|
end
|
11
13
|
|
12
|
-
|
14
|
+
RuboCop::RakeTask.new do |task|
|
15
|
+
task.requires << 'rubocop-rake'
|
16
|
+
end
|
17
|
+
|
18
|
+
task default: %i[test rubocop]
|
data/bin/fd
CHANGED
@@ -11,7 +11,9 @@ arguments.width = 10
|
|
11
11
|
options = OptionParser.new do |opts|
|
12
12
|
opts.banner = "Usage: #{File.basename __FILE__} [options] [file_names]"
|
13
13
|
|
14
|
-
opts.on('-w',
|
14
|
+
opts.on('-w',
|
15
|
+
'--width=WIDTH [Integer]',
|
16
|
+
Integer, 'Display upto _width_ bytes per row, optional, default is 10') do |width|
|
15
17
|
arguments.width = width
|
16
18
|
end
|
17
19
|
|
@@ -43,5 +45,5 @@ if ARGV.size.positive?
|
|
43
45
|
file_dumper.dump_file(fn)
|
44
46
|
end
|
45
47
|
else
|
46
|
-
file_dumper.dump_stdin(
|
48
|
+
file_dumper.dump_stdin($stdin.read)
|
47
49
|
end
|
data/fd.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.email = ['the.tester@seasidetesting.com']
|
10
10
|
|
11
11
|
spec.summary = 'fd is a simple tool to dump file contents in binary & text format side by side'
|
12
|
-
spec.description = 'fd prints the given file in
|
12
|
+
spec.description = 'fd prints the given file in 2 columns (left: hex values left / right: / textual representations'
|
13
13
|
spec.homepage = 'https://github.com/s2k/fd'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
spec.required_ruby_version = '>= 3.1.0'
|
@@ -20,18 +20,6 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.metadata['source_code_uri'] = 'https://github.com/s2k/fd'
|
21
21
|
# spec.metadata['changelog_uri'] = "TODO: Put your gem's CHANGELOG.md URL here."
|
22
22
|
|
23
|
-
spec.add_development_dependency 'guard-bundler'
|
24
|
-
spec.add_development_dependency 'guard-minitest'
|
25
|
-
spec.add_development_dependency 'minitest'
|
26
|
-
spec.add_development_dependency 'pry'
|
27
|
-
spec.add_development_dependency 'pry-doc'
|
28
|
-
spec.add_development_dependency 'rake'
|
29
|
-
spec.add_development_dependency 'rb-fsevent'
|
30
|
-
spec.add_development_dependency 'simplecov'
|
31
|
-
spec.add_development_dependency 'terminal-notifier'
|
32
|
-
spec.add_development_dependency 'terminal-notifier-guard'
|
33
|
-
spec.add_development_dependency 'mutex_m'
|
34
|
-
|
35
23
|
# Specify which files should be added to the gem when it is released.
|
36
24
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
37
25
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
data/lib/fd/version.rb
CHANGED
data/lib/fd.rb
CHANGED
@@ -7,9 +7,23 @@ require_relative 'fd/version'
|
|
7
7
|
class Fd
|
8
8
|
class Error < StandardError; end
|
9
9
|
|
10
|
-
ESCAPE_CHARACTERS = %w[␀ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␡ ␛ ␠]
|
11
|
-
|
12
|
-
|
10
|
+
ESCAPE_CHARACTERS = %w[␀ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␡ ␛ ␠].freeze
|
11
|
+
|
12
|
+
CHAR_TABLE = {
|
13
|
+
0 => '␀',
|
14
|
+
7 => '␇',
|
15
|
+
8 => '␈',
|
16
|
+
9 => '␉',
|
17
|
+
10 => '␊',
|
18
|
+
11 => '␋',
|
19
|
+
12 => '␌',
|
20
|
+
13 => '␍',
|
21
|
+
16 => '␡',
|
22
|
+
27 => '␛',
|
23
|
+
32 => '␠'
|
24
|
+
}.freeze
|
25
|
+
|
26
|
+
attr_reader :line_length
|
13
27
|
|
14
28
|
# _line_length_ sets how many characters are displayed per @line.
|
15
29
|
# Some <i>special non-printable/invisible characters</i> are displayed as their names.
|
@@ -28,22 +42,12 @@ class Fd
|
|
28
42
|
# __ :: 32
|
29
43
|
#
|
30
44
|
def initialize(line_length)
|
31
|
-
|
32
|
-
|
45
|
+
unless line_length.is_a?(Integer) && line_length.positive?
|
46
|
+
raise ArgumentError,
|
47
|
+
"Line width must be a positive integer, was given '#{line_length}'"
|
48
|
+
end
|
33
49
|
|
34
50
|
@line_length = line_length
|
35
|
-
@char_table = {}
|
36
|
-
@char_table[0] = '␀'
|
37
|
-
@char_table[7] = '␇'
|
38
|
-
@char_table[8] = '␈'
|
39
|
-
@char_table[9] = '␉'
|
40
|
-
@char_table[10] = '␊'
|
41
|
-
@char_table[11] = '␋'
|
42
|
-
@char_table[12] = '␌'
|
43
|
-
@char_table[13] = '␍'
|
44
|
-
@char_table[16] = '␡'
|
45
|
-
@char_table[27] = '␛'
|
46
|
-
@char_table[32] = '␠'
|
47
51
|
end
|
48
52
|
|
49
53
|
def add_esc_sequence(chr)
|
@@ -101,7 +105,7 @@ class Fd
|
|
101
105
|
def append_to_line(bytes, char)
|
102
106
|
@byte_count_in_line += bytes.size
|
103
107
|
bytes.each { |bt| @hex_values << format('%02x', bt) }
|
104
|
-
@line += format('%2s', (
|
108
|
+
@line += format('%2s', (CHAR_TABLE[char.ord] || char))
|
105
109
|
@char_index += 1
|
106
110
|
end
|
107
111
|
|
@@ -110,8 +114,7 @@ class Fd
|
|
110
114
|
end
|
111
115
|
|
112
116
|
def print_single_line
|
113
|
-
puts("#{format("%#{(3 * line_length) - 1}s", hex_values.join(' '))} |#{format("%#{2 * line_length}s", line)}"
|
114
|
-
|
115
|
-
)
|
117
|
+
puts("#{format("%#{(3 * line_length) - 1}s", hex_values.join(' '))} |#{format("%#{2 * line_length}s", line)}"
|
118
|
+
.gsub(/([#{ESCAPE_CHARACTERS.join}])/, add_esc_sequence('\1')))
|
116
119
|
end
|
117
120
|
end
|
metadata
CHANGED
@@ -1,171 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephan Kämper
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: guard-minitest
|
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: minitest
|
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
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: pry
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: pry-doc
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rake
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: rb-fsevent
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: simplecov
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: terminal-notifier
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: terminal-notifier-guard
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ">="
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: mutex_m
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '0'
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '0'
|
167
|
-
description: 'fd prints the given file in two columns: Hex values in the left column
|
168
|
-
and the textual representations in the right column.'
|
10
|
+
date: 2024-12-27 00:00:00.000000000 Z
|
11
|
+
dependencies: []
|
12
|
+
description: 'fd prints the given file in 2 columns (left: hex values left / right:
|
13
|
+
/ textual representations'
|
169
14
|
email:
|
170
15
|
- the.tester@seasidetesting.com
|
171
16
|
executables:
|
@@ -178,6 +23,8 @@ files:
|
|
178
23
|
- ".github/workflows/codeql-analysis.yml"
|
179
24
|
- ".github/workflows/main.yml"
|
180
25
|
- ".gitignore"
|
26
|
+
- ".rubocop.yml"
|
27
|
+
- ".ruby-version"
|
181
28
|
- Gemfile
|
182
29
|
- Guardfile
|
183
30
|
- LICENSE.txt
|
@@ -198,7 +45,6 @@ metadata:
|
|
198
45
|
homepage_uri: https://github.com/s2k/fd
|
199
46
|
source_code_uri: https://github.com/s2k/fd
|
200
47
|
rubygems_mfa_required: 'true'
|
201
|
-
post_install_message:
|
202
48
|
rdoc_options: []
|
203
49
|
require_paths:
|
204
50
|
- lib
|
@@ -213,8 +59,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
213
59
|
- !ruby/object:Gem::Version
|
214
60
|
version: '0'
|
215
61
|
requirements: []
|
216
|
-
rubygems_version: 3.
|
217
|
-
signing_key:
|
62
|
+
rubygems_version: 3.6.2
|
218
63
|
specification_version: 4
|
219
64
|
summary: fd is a simple tool to dump file contents in binary & text format side by
|
220
65
|
side
|