orion 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 142f0738a84b14879a801534a2a582b442078d27
4
- data.tar.gz: f2bf18e3513faa642b8529d9645bbed978f63861
3
+ metadata.gz: b5725831d98f7cd26ee72862fb3548ffbca64bef
4
+ data.tar.gz: 8f45aa5e5cabc427b37f63848e5028dcb66595f3
5
5
  SHA512:
6
- metadata.gz: 03df67ff4fb3b9d79a6047f0e8cfebc2509fff6326d3a47ebe15aca4eb08facf64da5e04ead7e700f0f652fcf8c9f9fa03c5b2b2da877b19427a520466657f9b
7
- data.tar.gz: 4f9a11da2b86a0cf54360e42cee99a6f6d3b1300ac33c1a18c1238dbc579d174fc36cb9cb3800b16af0e86f8f5cede0f883cdcc52dabbe04e76dcd9991f51d3b
6
+ metadata.gz: fae5ab16115782b25d90634c12ab029ca87a633a7e7c4af00785e6b129cdde4444a335040b8bcb30423d0aebff3d61f8c7cefe7ec72aa6bda9a351b524908703
7
+ data.tar.gz: 808686314a191d1444806e7cac7edf83db8e7e91c1ba00a18195d86c15d6b4af2d749ed51c05a513f2bb7dd4d5465c3c6a444d1f65134827542bea20abc2dd5b
data/lib/orion.rb CHANGED
@@ -5,13 +5,13 @@ require "orion/delete"
5
5
  require "orion/info"
6
6
 
7
7
  module Orion
8
- def self.search(root_path, query)
9
- method_call = Orion::Search.new(root_path).with_response(query)
8
+ def self.search(root_path, query_hash)
9
+ method_call = Orion::Search.new(root_path).search(query_hash).to_orion
10
10
  block_given? ? yield(method_call) : method_call
11
11
  end
12
12
 
13
- def self.delete(root_path, query)
14
- found_files = Orion::Search.new(root_path).search(query)
13
+ def self.delete(root_path, query_hash)
14
+ found_files = Orion::Search.new(root_path).search(query_hash)
15
15
  if block_given?
16
16
  yield Orion::Delete.with_response(found_files)
17
17
  else
@@ -0,0 +1,37 @@
1
+ class Fixnum
2
+ def seconds
3
+ self
4
+ end
5
+
6
+ def minutes
7
+ self * 60.seconds
8
+ end
9
+
10
+ def hours
11
+ self * 60.minutes
12
+ end
13
+
14
+ def days
15
+ self * 24.hours
16
+ end
17
+
18
+ def weeks
19
+ self * 7.days
20
+ end
21
+
22
+ def months
23
+ self * 4.weeks
24
+ end
25
+
26
+ def years
27
+ self * 12.months
28
+ end
29
+
30
+ alias_method :second, :seconds
31
+ alias_method :minute, :minutes
32
+ alias_method :hour, :hours
33
+ alias_method :day, :days
34
+ alias_method :week, :weeks
35
+ alias_method :month, :months
36
+ alias_method :year, :years
37
+ end
@@ -4,4 +4,8 @@ class Hash
4
4
  def to_orion
5
5
  OpenStruct.new(self)
6
6
  end
7
+
8
+ def self.diff(hash1, hash2)
9
+ Hash[*((hash1.size > hash2.size) ? hash1.to_a - hash2.to_a : hash2.to_a - hash1.to_a).flatten]
10
+ end
7
11
  end
@@ -0,0 +1,13 @@
1
+ class Time
2
+ def >(other_time)
3
+ (self <=> other_time) == 1 ? true : false
4
+ end
5
+
6
+ def <(other_time)
7
+ (self <=> other_time) == -1 ? true : false
8
+ end
9
+
10
+ def ==(other_time)
11
+ (self <=> other_time) == 0 ? true : false
12
+ end
13
+ end
@@ -0,0 +1,72 @@
1
+ # Original from:
2
+ # https://github.com/ruby/ruby/blob/trunk/lib/find.rb?source=cc
3
+ # Modified to fit Orion purposes
4
+
5
+ require "orion/orion_support/i18n"
6
+ require "orion/orion_objects/fixnum"
7
+
8
+ module Orion
9
+ module Find
10
+ def find(*paths, conditions) # :yield: path
11
+ raise I18n.t("errors.search.not_conditions_provided") if conditions.empty?
12
+ condition_string = condition_statement(validate(conditions))
13
+ results = []
14
+
15
+ paths.collect!{|d| raise Errno::ENOENT unless File.exist?(d); d.dup}
16
+ while file = paths.shift
17
+ catch(:prune) do
18
+ results << file.dup.taint if eval(condition_string)
19
+ begin
20
+ s = File.lstat(file)
21
+ rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
22
+ next
23
+ end
24
+ if s.directory? then
25
+ begin
26
+ fs = Dir.entries(file)
27
+ rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
28
+ next
29
+ end
30
+ fs.sort!
31
+ fs.reverse_each {|f|
32
+ next if f == "." or f == ".."
33
+ f = File.join(file, f)
34
+ paths.unshift f.untaint
35
+ }
36
+ end
37
+ end
38
+ end
39
+ results
40
+ end
41
+
42
+ def self.validate(conditions)
43
+ valid_conditions = [:name, :atime, :ctime, :mtime, :ftype, :size, :absolute_path, :basename, :directory?, :dirname, :executable?, :exists?, :extname, :file?, :readable?, :socket?, :symlink?, :writable?, :zero?]
44
+ invalid_cond = ((valid_conditions+conditions.keys)-(valid_conditions&conditions.keys))-(valid_conditions-(valid_conditions&conditions.keys))
45
+ invalid_cond.empty? ? conditions : raise(NoMethodError)
46
+ end
47
+
48
+ def self.arrange_conditions(conditions)
49
+ @comparative_conditions = conditions.select{|k,v| v =~ /(>)|(<)/ } # size: '> 999'
50
+ @equality_conditions = Hash.diff(conditions, @comparative_conditions) # name: '.rb'
51
+ end
52
+
53
+ # Creates a conditional statement string with the given conditions
54
+ def self.condition_statement(conditions)
55
+ arrange_conditions(conditions)
56
+ conditions_array = conditions.has_key?(:name) ? ["file.include?(conditions[:name])"] : []
57
+ @equality_conditions.each do |k, v|
58
+ conditions_array << "File.send(:#{k}, file) == conditions[:#{k}]" unless k == :name
59
+ end
60
+ @comparative_conditions.each do |k, v|
61
+ conditions_array << "File.send(:#{k}, file) #{conditions[k]}"
62
+ end
63
+ conditions_array.join(" && ")
64
+ end
65
+
66
+ def prune
67
+ throw :prune
68
+ end
69
+
70
+ module_function :find, :prune
71
+ end
72
+ end
data/lib/orion/search.rb CHANGED
@@ -1,5 +1,4 @@
1
- require 'find'
2
- require "orion/orion_objects/array"
1
+ require 'orion/orion_support/find/find'
3
2
  require "orion/orion_objects/nil"
4
3
 
5
4
  module Orion
@@ -7,28 +6,11 @@ module Orion
7
6
  attr_accessor :root_path
8
7
 
9
8
  def initialize(root_path)
10
- @root_path ||= root_path
9
+ @root_path ||= File.expand_path(root_path)
11
10
  end
12
11
 
13
12
  def search(query)
14
- find(query)
15
- end
16
-
17
- def with_response(query)
18
- find(query).to_orion
19
- end
20
-
21
- private
22
-
23
- def find(query)
24
- results = []
25
- Find.find(@root_path) do |path|
26
- unless FileTest.directory?(path)
27
- file = File.basename(path)
28
- results << path if file.include?(query)
29
- end
30
- end
31
- results
13
+ Find.find(@root_path, query)
32
14
  end
33
15
  end
34
16
  end
data/lib/orion/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Orion
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: orion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bismark
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-19 00:00:00.000000000 Z
11
+ date: 2013-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n
@@ -73,13 +73,14 @@ executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
- - lib/boyer_moore/rich_hash.rb
77
- - lib/boyer_moore/boyer_moore.rb
78
76
  - lib/orion.rb
77
+ - lib/orion/orion_support/find/find.rb
79
78
  - lib/orion/orion_support/i18n.rb
79
+ - lib/orion/orion_objects/fixnum.rb
80
80
  - lib/orion/orion_objects/array.rb
81
81
  - lib/orion/orion_objects/nil.rb
82
82
  - lib/orion/orion_objects/hash.rb
83
+ - lib/orion/orion_objects/time.rb
83
84
  - lib/orion/version.rb
84
85
  - lib/orion/delete.rb
85
86
  - lib/orion/search.rb
@@ -1,90 +0,0 @@
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
@@ -1,29 +0,0 @@
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