poepod 0.1.7 → 0.1.8
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/.rubocop.yml +2 -0
- data/.rubocop_todo.yml +122 -0
- data/lib/poepod/cli.rb +2 -2
- data/lib/poepod/file_processor.rb +17 -3
- data/lib/poepod/gem_processor.rb +21 -5
- data/lib/poepod/processor.rb +7 -9
- data/lib/poepod/version.rb +1 -1
- data/spec/poepod/file_processor_spec.rb +34 -0
- data/spec/poepod/gem_processor_spec.rb +35 -6
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5f3b75d6903698ba37dea1a00b73ff9d6a5672436dadac4cf452fd4d0ed46416
|
|
4
|
+
data.tar.gz: cfc4055807a6cb01ed40cb685be644e91317bfd6303120fa75410b97eff5e7c1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ecdede017300986e4d1a226f895f232b91a182f6ade3384d804308239b1b252251e8f36fac652667c41a3c2baa05927a98b5f67c779b176e4b4e7a4d939e302f
|
|
7
|
+
data.tar.gz: aace78fd62422ec85134e79def873f3cc721b26f44b70563741443f3b3de23b8f29f0d7c3d9c0b8933a55ea0a2a80579a0140575539c7d901c7dbe1a77cc313e
|
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# This configuration was generated by
|
|
2
|
+
# `rubocop --auto-gen-config`
|
|
3
|
+
# on 2024-10-28 08:08:05 UTC using RuboCop version 1.67.0.
|
|
4
|
+
# The point is for the user to remove these configuration records
|
|
5
|
+
# one by one as the offenses are removed from the code base.
|
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
|
8
|
+
|
|
9
|
+
# Offense count: 1
|
|
10
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
11
|
+
Layout/ElseAlignment:
|
|
12
|
+
Exclude:
|
|
13
|
+
- 'lib/poepod/processor.rb'
|
|
14
|
+
|
|
15
|
+
# Offense count: 1
|
|
16
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
17
|
+
Layout/EmptyLineAfterMagicComment:
|
|
18
|
+
Exclude:
|
|
19
|
+
- 'lib/poepod/file_processor.rb'
|
|
20
|
+
|
|
21
|
+
# Offense count: 1
|
|
22
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
23
|
+
# Configuration parameters: EnforcedStyleAlignWith, Severity.
|
|
24
|
+
# SupportedStylesAlignWith: keyword, variable, start_of_line
|
|
25
|
+
Layout/EndAlignment:
|
|
26
|
+
Exclude:
|
|
27
|
+
- 'lib/poepod/processor.rb'
|
|
28
|
+
|
|
29
|
+
# Offense count: 1
|
|
30
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
31
|
+
# Configuration parameters: Width, AllowedPatterns.
|
|
32
|
+
Layout/IndentationWidth:
|
|
33
|
+
Exclude:
|
|
34
|
+
- 'lib/poepod/processor.rb'
|
|
35
|
+
|
|
36
|
+
# Offense count: 5
|
|
37
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
38
|
+
# Configuration parameters: AutoCorrect.
|
|
39
|
+
Lint/UselessAssignment:
|
|
40
|
+
Exclude:
|
|
41
|
+
- 'lib/poepod/gem_processor.rb'
|
|
42
|
+
- 'spec/poepod/gem_processor_spec.rb'
|
|
43
|
+
|
|
44
|
+
# Offense count: 1
|
|
45
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
|
|
46
|
+
Metrics/AbcSize:
|
|
47
|
+
Max: 24
|
|
48
|
+
|
|
49
|
+
# Offense count: 12
|
|
50
|
+
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
|
|
51
|
+
# AllowedMethods: refine
|
|
52
|
+
Metrics/BlockLength:
|
|
53
|
+
Max: 158
|
|
54
|
+
|
|
55
|
+
# Offense count: 1
|
|
56
|
+
# Configuration parameters: CountComments, CountAsOne.
|
|
57
|
+
Metrics/ClassLength:
|
|
58
|
+
Max: 105
|
|
59
|
+
|
|
60
|
+
# Offense count: 5
|
|
61
|
+
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
|
|
62
|
+
Metrics/MethodLength:
|
|
63
|
+
Max: 18
|
|
64
|
+
|
|
65
|
+
# Offense count: 2
|
|
66
|
+
# Configuration parameters: CountKeywordArgs, MaxOptionalParameters.
|
|
67
|
+
Metrics/ParameterLists:
|
|
68
|
+
Max: 7
|
|
69
|
+
|
|
70
|
+
# Offense count: 1
|
|
71
|
+
# This cop supports unsafe autocorrection (--autocorrect-all).
|
|
72
|
+
# Configuration parameters: EnforcedStyle.
|
|
73
|
+
# SupportedStyles: always, always_true, never
|
|
74
|
+
Style/FrozenStringLiteralComment:
|
|
75
|
+
Exclude:
|
|
76
|
+
- 'lib/poepod/file_processor.rb'
|
|
77
|
+
|
|
78
|
+
# Offense count: 1
|
|
79
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
80
|
+
Style/IfUnlessModifier:
|
|
81
|
+
Exclude:
|
|
82
|
+
- 'lib/poepod/processor.rb'
|
|
83
|
+
|
|
84
|
+
# Offense count: 1
|
|
85
|
+
Style/OptionalArguments:
|
|
86
|
+
Exclude:
|
|
87
|
+
- 'lib/poepod/processor.rb'
|
|
88
|
+
|
|
89
|
+
# Offense count: 4
|
|
90
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
91
|
+
# Configuration parameters: EnforcedStyleForMultiline.
|
|
92
|
+
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
|
93
|
+
Style/TrailingCommaInArguments:
|
|
94
|
+
Exclude:
|
|
95
|
+
- 'lib/poepod/cli.rb'
|
|
96
|
+
- 'lib/poepod/processor.rb'
|
|
97
|
+
- 'spec/poepod/file_processor_spec.rb'
|
|
98
|
+
|
|
99
|
+
# Offense count: 2
|
|
100
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
101
|
+
# Configuration parameters: EnforcedStyleForMultiline.
|
|
102
|
+
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
|
103
|
+
Style/TrailingCommaInArrayLiteral:
|
|
104
|
+
Exclude:
|
|
105
|
+
- 'lib/poepod/processor.rb'
|
|
106
|
+
- 'spec/poepod/gem_processor_spec.rb'
|
|
107
|
+
|
|
108
|
+
# Offense count: 1
|
|
109
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
110
|
+
# Configuration parameters: EnforcedStyleForMultiline.
|
|
111
|
+
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
|
112
|
+
Style/TrailingCommaInHashLiteral:
|
|
113
|
+
Exclude:
|
|
114
|
+
- 'spec/poepod/gem_processor_spec.rb'
|
|
115
|
+
|
|
116
|
+
# Offense count: 6
|
|
117
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
118
|
+
# Configuration parameters: AllowNamedUnderscoreVariables.
|
|
119
|
+
Style/TrailingUnderscoreVariable:
|
|
120
|
+
Exclude:
|
|
121
|
+
- 'lib/poepod/gem_processor.rb'
|
|
122
|
+
- 'spec/poepod/gem_processor_spec.rb'
|
data/lib/poepod/cli.rb
CHANGED
|
@@ -44,7 +44,7 @@ module Poepod
|
|
|
44
44
|
include_binary: options[:include_binary],
|
|
45
45
|
include_dot_files: options[:include_dot_files],
|
|
46
46
|
base_dir: base_dir,
|
|
47
|
-
config_file: options[:config]
|
|
47
|
+
config_file: options[:config]
|
|
48
48
|
)
|
|
49
49
|
success, result, unstaged_files = processor.process(output_file)
|
|
50
50
|
if success
|
|
@@ -81,7 +81,7 @@ module Poepod
|
|
|
81
81
|
include_binary: options[:include_binary],
|
|
82
82
|
include_dot_files: options[:include_dot_files],
|
|
83
83
|
exclude: options[:exclude],
|
|
84
|
-
base_dir: base_dir
|
|
84
|
+
base_dir: base_dir
|
|
85
85
|
)
|
|
86
86
|
total_files, copied_files = processor.process(output_path.to_s)
|
|
87
87
|
print_result(total_files, copied_files, output_path)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# lib/poepod/file_processor.rb
|
|
2
1
|
# frozen_string_literal: true
|
|
3
2
|
|
|
4
3
|
require_relative "processor"
|
|
@@ -29,9 +28,24 @@ module Poepod
|
|
|
29
28
|
private
|
|
30
29
|
|
|
31
30
|
def collect_files_to_process
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
files_to_process = []
|
|
32
|
+
|
|
33
|
+
@patterns.flatten.each do |pattern|
|
|
34
|
+
expanded_pattern = File.expand_path(pattern)
|
|
35
|
+
if File.directory?(expanded_pattern)
|
|
36
|
+
# If the pattern is a directory, collect all files within it recursively
|
|
37
|
+
files = collect_files_from_pattern(File.join(expanded_pattern, "**", "*"))
|
|
38
|
+
files_to_process.concat(files)
|
|
39
|
+
elsif File.file?(expanded_pattern)
|
|
40
|
+
files_to_process << expanded_pattern unless should_exclude?(expanded_pattern)
|
|
41
|
+
else
|
|
42
|
+
# It's a pattern, collect matching files
|
|
43
|
+
files = collect_files_from_pattern(expanded_pattern)
|
|
44
|
+
files_to_process.concat(files)
|
|
45
|
+
end
|
|
34
46
|
end
|
|
47
|
+
|
|
48
|
+
files_to_process.uniq
|
|
35
49
|
end
|
|
36
50
|
end
|
|
37
51
|
end
|
data/lib/poepod/gem_processor.rb
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
require_relative "processor"
|
|
4
4
|
require "rubygems/specification"
|
|
5
5
|
require "git"
|
|
6
|
+
require "pathname"
|
|
6
7
|
|
|
7
8
|
module Poepod
|
|
8
9
|
# Processes gem files for wrapping, handling unstaged files
|
|
@@ -35,7 +36,7 @@ module Poepod
|
|
|
35
36
|
|
|
36
37
|
unstaged_files = check_unstaged_files
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
super(output_file)
|
|
39
40
|
|
|
40
41
|
[true, output_file, unstaged_files]
|
|
41
42
|
end
|
|
@@ -46,11 +47,26 @@ module Poepod
|
|
|
46
47
|
files_to_include = find_gemspec_files
|
|
47
48
|
files_to_include += check_unstaged_files if @include_unstaged
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
File.join(@base_dir, relative_path)
|
|
50
|
+
files_to_collect = []
|
|
51
|
+
|
|
52
|
+
files_to_include.sort.uniq.each do |relative_path|
|
|
53
|
+
full_path = File.join(@base_dir, relative_path)
|
|
54
|
+
|
|
55
|
+
next if should_exclude?(full_path)
|
|
56
|
+
|
|
57
|
+
if File.directory?(full_path)
|
|
58
|
+
# Recursively collect all files under the directory
|
|
59
|
+
files = collect_files_from_pattern(full_path)
|
|
60
|
+
files_to_collect.concat(files)
|
|
61
|
+
elsif File.file?(full_path)
|
|
62
|
+
files_to_collect << full_path
|
|
63
|
+
else
|
|
64
|
+
# Skip if neither file nor directory
|
|
65
|
+
next
|
|
66
|
+
end
|
|
53
67
|
end
|
|
68
|
+
|
|
69
|
+
files_to_collect
|
|
54
70
|
end
|
|
55
71
|
|
|
56
72
|
def find_gemspec_files
|
data/lib/poepod/processor.rb
CHANGED
|
@@ -10,7 +10,7 @@ module Poepod
|
|
|
10
10
|
# Base processor class
|
|
11
11
|
class Processor
|
|
12
12
|
EXCLUDE_DEFAULT = [
|
|
13
|
-
%r{node_modules/}, %r{.git/}, /.gitignore$/, /.DS_Store
|
|
13
|
+
%r{node_modules/}, %r{.git/}, /.gitignore$/, /.DS_Store$/
|
|
14
14
|
].freeze
|
|
15
15
|
|
|
16
16
|
def initialize(
|
|
@@ -56,9 +56,7 @@ module Poepod
|
|
|
56
56
|
|
|
57
57
|
def collect_files_from_pattern(pattern)
|
|
58
58
|
expanded_pattern = File.expand_path(pattern)
|
|
59
|
-
if File.directory?(expanded_pattern)
|
|
60
|
-
expanded_pattern = File.join(expanded_pattern, "**", "*")
|
|
61
|
-
end
|
|
59
|
+
expanded_pattern = File.join(expanded_pattern, "**", "*") if File.directory?(expanded_pattern)
|
|
62
60
|
|
|
63
61
|
Dir.glob(expanded_pattern, File::FNM_DOTMATCH).each_with_object([]) do |file_path, acc|
|
|
64
62
|
next unless File.file?(file_path)
|
|
@@ -82,7 +80,7 @@ module Poepod
|
|
|
82
80
|
mime_type = Marcel::MimeType.for(
|
|
83
81
|
content,
|
|
84
82
|
name: File.basename(file_path),
|
|
85
|
-
declared_type: "text/plain"
|
|
83
|
+
declared_type: "text/plain"
|
|
86
84
|
)
|
|
87
85
|
|
|
88
86
|
!mime_type.start_with?("text/") && mime_type != "application/json"
|
|
@@ -93,10 +91,10 @@ module Poepod
|
|
|
93
91
|
output ||= StringIO.new
|
|
94
92
|
|
|
95
93
|
relative_path = if @base_dir
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
94
|
+
Pathname.new(file_path).relative_path_from(@base_dir).to_s
|
|
95
|
+
else
|
|
96
|
+
file_path
|
|
97
|
+
end
|
|
100
98
|
|
|
101
99
|
puts "Adding to bundle: #{relative_path}"
|
|
102
100
|
|
data/lib/poepod/version.rb
CHANGED
|
@@ -147,4 +147,38 @@ RSpec.describe Poepod::FileProcessor do
|
|
|
147
147
|
end.to raise_error(Encoding::InvalidByteSequenceError)
|
|
148
148
|
end
|
|
149
149
|
end
|
|
150
|
+
|
|
151
|
+
context "when directories are included in the file patterns (e.g., git submodules)" do
|
|
152
|
+
let(:submodule_dir) { File.join(temp_dir, "vendor", "submodule_project") }
|
|
153
|
+
let(:submodule_file) { File.join(submodule_dir, "submodule_file.rb") }
|
|
154
|
+
|
|
155
|
+
before do
|
|
156
|
+
# Simulate a submodule directory with a file
|
|
157
|
+
FileUtils.mkdir_p(submodule_dir)
|
|
158
|
+
File.write(submodule_file, "puts 'Hello from submodule'")
|
|
159
|
+
|
|
160
|
+
# Include the submodule directory in the patterns
|
|
161
|
+
@processor = described_class.new(
|
|
162
|
+
[text_file1, text_file2, submodule_dir],
|
|
163
|
+
output_file.path,
|
|
164
|
+
include_binary: false,
|
|
165
|
+
include_dot_files: false,
|
|
166
|
+
exclude: nil,
|
|
167
|
+
base_dir: temp_dir
|
|
168
|
+
)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it "includes files from directories specified in the patterns" do
|
|
172
|
+
total_files, copied_files = @processor.process(output_file.path)
|
|
173
|
+
expect(total_files).to eq(3) # text_file1, text_file2, submodule_file
|
|
174
|
+
expect(copied_files).to eq(3)
|
|
175
|
+
|
|
176
|
+
output_content = File.read(output_file.path, encoding: "utf-8")
|
|
177
|
+
expect(output_content).to include("Content of file1.\n")
|
|
178
|
+
expect(output_content).to include("Content of file2.\n")
|
|
179
|
+
expect(output_content).to include("puts 'Hello from submodule'")
|
|
180
|
+
|
|
181
|
+
expect(output_content).to include("--- START FILE: vendor/submodule_project/submodule_file.rb ---")
|
|
182
|
+
end
|
|
183
|
+
end
|
|
150
184
|
end
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# spec/poepod/gem_processor_spec.rb
|
|
4
3
|
require "spec_helper"
|
|
5
4
|
require "poepod/gem_processor"
|
|
6
5
|
require "tempfile"
|
|
@@ -42,7 +41,7 @@ RSpec.describe Poepod::GemProcessor do
|
|
|
42
41
|
end
|
|
43
42
|
|
|
44
43
|
it "processes the gem files, includes README files, and spec files in sorted order" do
|
|
45
|
-
success,
|
|
44
|
+
success, = processor.process(output_file)
|
|
46
45
|
expect(success).to be true
|
|
47
46
|
expect(File.exist?(output_file)).to be true
|
|
48
47
|
|
|
@@ -53,7 +52,7 @@ RSpec.describe Poepod::GemProcessor do
|
|
|
53
52
|
"README.md",
|
|
54
53
|
"README.txt",
|
|
55
54
|
"lib/test_gem.rb",
|
|
56
|
-
"spec/test_gem_spec.rb"
|
|
55
|
+
"spec/test_gem_spec.rb"
|
|
57
56
|
]
|
|
58
57
|
expect(file_order).to eq(expected_order)
|
|
59
58
|
|
|
@@ -83,7 +82,7 @@ RSpec.describe Poepod::GemProcessor do
|
|
|
83
82
|
let(:processor) { described_class.new("non_existent.gemspec") }
|
|
84
83
|
|
|
85
84
|
it "returns an error" do
|
|
86
|
-
success, error_message,
|
|
85
|
+
success, error_message, = processor.process(output_file)
|
|
87
86
|
expect(success).to be false
|
|
88
87
|
expect(error_message).to include("Error: The specified gemspec file")
|
|
89
88
|
end
|
|
@@ -116,7 +115,7 @@ RSpec.describe Poepod::GemProcessor do
|
|
|
116
115
|
"spec/test_gem_spec.rb" => "RSpec.describe TestGem do\nend",
|
|
117
116
|
"README.md" => "# Test Gem\n\nThis is a test gem.",
|
|
118
117
|
"README.txt" => "Test Gem\n\nThis is a test gem in plain text.",
|
|
119
|
-
"lib/unstaged_file.rb" => "Unstaged content"
|
|
118
|
+
"lib/unstaged_file.rb" => "Unstaged content"
|
|
120
119
|
}
|
|
121
120
|
|
|
122
121
|
# Mock File.read
|
|
@@ -138,7 +137,7 @@ RSpec.describe Poepod::GemProcessor do
|
|
|
138
137
|
end
|
|
139
138
|
end
|
|
140
139
|
|
|
141
|
-
success,
|
|
140
|
+
success, _, unstaged_files = processor.process(output_file)
|
|
142
141
|
expect(success).to be true
|
|
143
142
|
expect(unstaged_files).to eq(["lib/unstaged_file.rb"])
|
|
144
143
|
|
|
@@ -168,6 +167,36 @@ RSpec.describe Poepod::GemProcessor do
|
|
|
168
167
|
expect(content).to eq(expected)
|
|
169
168
|
end
|
|
170
169
|
end
|
|
170
|
+
|
|
171
|
+
context "when gem includes directories in spec.files (e.g., git submodules)" do
|
|
172
|
+
let(:submodule_dir) { File.join(temp_dir, "vendor", "submodule_project") }
|
|
173
|
+
before do
|
|
174
|
+
# Simulate a submodule directory with a file
|
|
175
|
+
FileUtils.mkdir_p(submodule_dir)
|
|
176
|
+
File.write(File.join(submodule_dir, "submodule_file.rb"), "puts 'Hello from submodule'")
|
|
177
|
+
|
|
178
|
+
# Update gemspec to include the submodule directory
|
|
179
|
+
File.write(gemspec_file, <<~GEMSPEC)
|
|
180
|
+
Gem::Specification.new do |spec|
|
|
181
|
+
spec.name = "test_gem"
|
|
182
|
+
spec.version = "0.1.0"
|
|
183
|
+
spec.authors = ["Test Author"]
|
|
184
|
+
spec.files = ["lib/test_gem.rb", "vendor/submodule_project"]
|
|
185
|
+
spec.test_files = ["spec/test_gem_spec.rb"]
|
|
186
|
+
end
|
|
187
|
+
GEMSPEC
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
it "includes files from directories listed in spec.files" do
|
|
191
|
+
success, = processor.process(output_file)
|
|
192
|
+
expect(success).to be true
|
|
193
|
+
expect(File.exist?(output_file)).to be true
|
|
194
|
+
|
|
195
|
+
content = File.read(output_file)
|
|
196
|
+
expect(content).to include("--- START FILE: vendor/submodule_project/submodule_file.rb ---")
|
|
197
|
+
expect(content).to include("puts 'Hello from submodule'")
|
|
198
|
+
end
|
|
199
|
+
end
|
|
171
200
|
end
|
|
172
201
|
end
|
|
173
202
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: poepod
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-
|
|
11
|
+
date: 2024-10-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: git
|
|
@@ -165,6 +165,7 @@ files:
|
|
|
165
165
|
- ".gitignore"
|
|
166
166
|
- ".rspec"
|
|
167
167
|
- ".rubocop.yml"
|
|
168
|
+
- ".rubocop_todo.yml"
|
|
168
169
|
- CODE_OF_CONDUCT.md
|
|
169
170
|
- Gemfile
|
|
170
171
|
- README.adoc
|