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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/tags_finder.rb +92 -0
  3. 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
@@ -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: []