orion 0.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 +7 -0
- data/lib/boyer_moore/boyer_moore.rb +90 -0
- data/lib/boyer_moore/rich_hash.rb +29 -0
- data/lib/orion/delete.rb +22 -0
- data/lib/orion/result.rb +7 -0
- data/lib/orion/search.rb +33 -0
- data/lib/orion/version.rb +3 -0
- data/lib/orion.rb +14 -0
- metadata +121 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 743d93cb31ed4bcca866db0bf6838b608a5c7fdf
|
4
|
+
data.tar.gz: 71c0116bc3e84484f9739a356ce57ceec1390b2c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2a50cacc408923ef9dcacfa4a43bc37f7ddb54569c5c8e8f0eb68965214022264065b0087089fea556724342c16ddb67db1c37d7b13157e9f6fd9c3dd0af0b88
|
7
|
+
data.tar.gz: bb9e9ac65200025da60284b1cefe2b3430bab682165e60d8ab075d6d4f00302f5ead4e422a9595936bd241bf1c4ac7949a5cdbc0cc9580e93004136d49ff1fff
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require "boyer_moore/rich_hash"
|
2
|
+
# ported directly from this version wikipedia:
|
3
|
+
# http://en.wikipedia.org/w/index.php?title=Boyer%E2%80%93Moore_string_search_algorithm&diff=391986850&oldid=391398281
|
4
|
+
# it's not very rubyish but it works
|
5
|
+
module Orion
|
6
|
+
module BoyerMoore
|
7
|
+
|
8
|
+
def self.compute_prefix(str)
|
9
|
+
size = str.length
|
10
|
+
k = 0
|
11
|
+
result = [0]
|
12
|
+
1.upto(size - 1) do |q|
|
13
|
+
while (k > 0) && (str[k] != str[q])
|
14
|
+
k = result[k-1]
|
15
|
+
end
|
16
|
+
k += 1 if(str[k] == str[q])
|
17
|
+
result[q] = k
|
18
|
+
end
|
19
|
+
result
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.prepare_badcharacter_heuristic(str)
|
23
|
+
result = Orion::RichHash.new
|
24
|
+
0.upto(str.length - 1) do |i|
|
25
|
+
result[str[i]] = i
|
26
|
+
end
|
27
|
+
result
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.prepare_goodsuffix_heuristic(normal)
|
31
|
+
size = normal.size
|
32
|
+
result = []
|
33
|
+
|
34
|
+
reversed = normal.dup.reverse
|
35
|
+
prefix_normal = compute_prefix(normal)
|
36
|
+
prefix_reversed = compute_prefix(reversed)
|
37
|
+
|
38
|
+
0.upto(size) do |i|
|
39
|
+
result[i] = size - prefix_normal[size-1]
|
40
|
+
end
|
41
|
+
|
42
|
+
0.upto(size-1) do |i|
|
43
|
+
j = size - prefix_reversed[i]
|
44
|
+
k = i - prefix_reversed[i]+1
|
45
|
+
result[j] = k if result[j] > k
|
46
|
+
end
|
47
|
+
result
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.search(haystack, needle)
|
51
|
+
needle_len = needle.size
|
52
|
+
haystack_len = haystack.size
|
53
|
+
|
54
|
+
return nil if haystack_len == 0
|
55
|
+
return haystack if needle_len == 0
|
56
|
+
|
57
|
+
badcharacter = self.prepare_badcharacter_heuristic(needle)
|
58
|
+
goodsuffix = self.prepare_goodsuffix_heuristic(needle)
|
59
|
+
|
60
|
+
s = 0
|
61
|
+
while s <= haystack_len - needle_len
|
62
|
+
j = needle_len
|
63
|
+
while (j > 0) && self.needle_matches?(needle[j-1], haystack[s+j-1])
|
64
|
+
j -= 1
|
65
|
+
end
|
66
|
+
|
67
|
+
if(j > 0)
|
68
|
+
k = badcharacter[haystack[s+j-1]]
|
69
|
+
k = -1 unless k
|
70
|
+
if (k < j) && (m = j-k-1) > goodsuffix[j]
|
71
|
+
s += m
|
72
|
+
else
|
73
|
+
s += goodsuffix[j]
|
74
|
+
end
|
75
|
+
else
|
76
|
+
return s
|
77
|
+
end
|
78
|
+
end
|
79
|
+
return nil
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.needle_matches?(needle, haystack)
|
83
|
+
if needle.kind_of?(Regexp)
|
84
|
+
needle.match(haystack) ? true : false
|
85
|
+
else
|
86
|
+
needle == haystack
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Hash impersonator that accepts regular expressions as keys. But the regular
|
2
|
+
# expression lookups are slow, so don't use them (unless you have to).
|
3
|
+
module Orion
|
4
|
+
class RichHash
|
5
|
+
def initialize
|
6
|
+
@regexps = {}
|
7
|
+
@regular = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def [](k)
|
11
|
+
regular = @regular[k]
|
12
|
+
return regular if regular
|
13
|
+
if @regexps.size > 0
|
14
|
+
@regexps.each do |regex,v| # linear search is going to be slow
|
15
|
+
return v if regex.match(k)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def []=(k,v)
|
22
|
+
if k.kind_of?(Regexp)
|
23
|
+
@regexps[k] = v
|
24
|
+
else
|
25
|
+
@regular[k] = v
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/orion/delete.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'orion/result'
|
2
|
+
include Orion::Result
|
3
|
+
|
4
|
+
module Orion
|
5
|
+
module Delete
|
6
|
+
def self.delete(files)
|
7
|
+
result(delete_files(files))
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def self.delete_files(files)
|
13
|
+
if files.empty?
|
14
|
+
nil
|
15
|
+
else
|
16
|
+
deleted_files = files.inject([]) do |deleted_files, file|
|
17
|
+
deleted_files << file if File.delete(file)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/orion/result.rb
ADDED
data/lib/orion/search.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'find'
|
2
|
+
require 'orion/result'
|
3
|
+
# require 'boyer_moore/boyer_moore'
|
4
|
+
include Orion::Result
|
5
|
+
|
6
|
+
module Orion
|
7
|
+
class Search
|
8
|
+
attr_accessor :root_path
|
9
|
+
|
10
|
+
def initialize(root_path)
|
11
|
+
@root_path ||= root_path
|
12
|
+
end
|
13
|
+
|
14
|
+
def search(query)
|
15
|
+
result(find(query))
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def find(query)
|
21
|
+
results = []
|
22
|
+
Find.find(@root_path) do |path|
|
23
|
+
unless FileTest.directory?(path)
|
24
|
+
file = File.basename(path)
|
25
|
+
results << path if file.include?(query)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
results
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/lib/orion.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "orion/version"
|
2
|
+
require "orion/search"
|
3
|
+
require "orion/delete"
|
4
|
+
|
5
|
+
module Orion
|
6
|
+
def self.search(root_path, query)
|
7
|
+
Orion::Search.new(root_path).search(query)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.delete(root_path, query)
|
11
|
+
found_files = Orion::Search.new(root_path).search(query)
|
12
|
+
Orion::Delete.delete(found_files[:files])
|
13
|
+
end
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: orion
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Bismark
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-07-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ruby-progressbar
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.1.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.1.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
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: rspec
|
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: factory_girl
|
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
|
+
description: Orion allows you to search and delete files in your system.
|
84
|
+
email:
|
85
|
+
- bismark64@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- lib/boyer_moore/rich_hash.rb
|
91
|
+
- lib/boyer_moore/boyer_moore.rb
|
92
|
+
- lib/orion.rb
|
93
|
+
- lib/orion/version.rb
|
94
|
+
- lib/orion/delete.rb
|
95
|
+
- lib/orion/result.rb
|
96
|
+
- lib/orion/search.rb
|
97
|
+
homepage: https://github.com/bismark64/orion
|
98
|
+
licenses:
|
99
|
+
- MIT
|
100
|
+
metadata: {}
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 2.0.3
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: Orion allows you to search and delete files in your system
|
121
|
+
test_files: []
|