tags_finder 0.1.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 +7 -0
- data/lib/tags_finder.rb +92 -0
- metadata +58 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 98fede39edbf75006120fa24c2cd74c0ad819869aa120653f5dbeb663c31dc4e
|
4
|
+
data.tar.gz: 6bc368c8983dad70e6eb3b58c1db626a1d2501aac93045720ea264b75e1cad55
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c5f724968d14e4207a044f7c4dc3c0cfa7a34d6e1a90aafb21de35e4bd8deebf85b3ad0985060b0ddfdaf242e03d7881b5e69391b2550e0799fde56d705e1d61
|
7
|
+
data.tar.gz: b02da93517f5f2b24e0fa1e82e14ab2a3f511fc5ec96ee1c4f37cf866df2d4c05ed1108bca470ed151e63eda4276b3c9a53499c78beefa11075836ba90e67d1c
|
data/lib/tags_finder.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'string-similarity'
|
4
|
+
require 'pathname'
|
5
|
+
require 'etc'
|
6
|
+
|
7
|
+
# :nodoc:
|
8
|
+
class TagsFinder
|
9
|
+
VERSION = '0.1.0'
|
10
|
+
|
11
|
+
# :nodoc:
|
12
|
+
class Error < StandardError; end
|
13
|
+
|
14
|
+
def initialize(
|
15
|
+
search_tags:,
|
16
|
+
search_globs:,
|
17
|
+
result_size: 10,
|
18
|
+
parallelism: Etc.nprocessors,
|
19
|
+
html_tags: { tags: 'tags', gtags: 'gtags' }
|
20
|
+
)
|
21
|
+
@search_tags = search_tags
|
22
|
+
@search_globs = search_globs
|
23
|
+
@result_size = result_size
|
24
|
+
@parallelism = parallelism
|
25
|
+
|
26
|
+
Parser.build_html_tags_reg(**html_tags)
|
27
|
+
end
|
28
|
+
|
29
|
+
def find(&)
|
30
|
+
results.each_slice(@result_size, &)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def results
|
36
|
+
paths = Dir.glob(@search_globs)
|
37
|
+
slice_size = (paths.length / @parallelism.to_f).ceil
|
38
|
+
|
39
|
+
jobs = paths.each_slice(slice_size).map do |paths_slice|
|
40
|
+
job = Job.new do
|
41
|
+
paths_slice.flat_map do |path|
|
42
|
+
parser = Parser.new(
|
43
|
+
path,
|
44
|
+
@search_tags,
|
45
|
+
path_tags(path)
|
46
|
+
)
|
47
|
+
|
48
|
+
parser.parse.results
|
49
|
+
rescue StandardError => e
|
50
|
+
puts e.message if e.is_a?(TagsFinder::Error)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
job.call
|
55
|
+
end
|
56
|
+
|
57
|
+
jobs
|
58
|
+
.map(&:result)
|
59
|
+
.flatten
|
60
|
+
.compact
|
61
|
+
.sort_by(&:score)
|
62
|
+
.reverse
|
63
|
+
ensure
|
64
|
+
jobs&.each do |job|
|
65
|
+
Process.kill('HUP', job.pid)
|
66
|
+
rescue StandardError
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def path_tags(path)
|
71
|
+
pathname = Pathname.new(File.expand_path(path))
|
72
|
+
|
73
|
+
search_pathnames.each do |search_pathname|
|
74
|
+
relative = pathname.relative_path_from(search_pathname)
|
75
|
+
next nil if relative.to_s.start_with?('..')
|
76
|
+
|
77
|
+
return relative.to_s.gsub(/\..+$/, '').split('/')
|
78
|
+
end
|
79
|
+
|
80
|
+
[]
|
81
|
+
end
|
82
|
+
|
83
|
+
def search_pathnames
|
84
|
+
@search_pathnames ||= @search_globs.map do |glob|
|
85
|
+
Pathname.new(File.expand_path(glob.gsub(/\*+.*$/, '')))
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
require_relative 'tags_finder/parser'
|
91
|
+
require_relative 'tags_finder/job'
|
92
|
+
require_relative 'tags_finder/result'
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tags_finder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Joakim Carrilho
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-03-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: string-similarity
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.1.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.1.0
|
27
|
+
description:
|
28
|
+
email: joakim.carrilho@yahoo.fr
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- lib/tags_finder.rb
|
34
|
+
homepage: https://github.com/Kimoja/tags_finder
|
35
|
+
licenses:
|
36
|
+
- MIT
|
37
|
+
metadata:
|
38
|
+
rubygems_mfa_required: 'true'
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.1.1
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubygems_version: 3.3.7
|
55
|
+
signing_key:
|
56
|
+
specification_version: 4
|
57
|
+
summary: Search for text content by tag in the local file system
|
58
|
+
test_files: []
|