soulheart 0.1.3 → 0.1.4
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/bin/soulheart +20 -8
- data/lib/soulheart/base.rb +9 -1
- data/lib/soulheart/loader.rb +27 -7
- data/lib/soulheart/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0a9835278571fb659e0eae5ad1d39918bcd41049
|
|
4
|
+
data.tar.gz: e3dbbeecea70b9cf11327f012f3d47e02f64f04b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 01215919be332be2cc67d9885c5bb21380110fa04caf4a424e91f7649aacf696d08c88f24c5a95b0bf88b8329915c93bf1c37976ee3f95b0e96c1cfb7fd2449b
|
|
7
|
+
data.tar.gz: e5b336efcc86b4250cecdb4d61c8427c831dca3eea2ba25f8bf2e362f2cd7ea00612951da3c1160f9f0eb1f9a0e62833b37aab69d20a7507bfafb3ccfbb105bc
|
data/bin/soulheart
CHANGED
|
@@ -32,8 +32,16 @@ parser = OptionParser.new do |opts|
|
|
|
32
32
|
exit
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
opts.on('-
|
|
36
|
-
|
|
35
|
+
opts.on('-A', '--no-all', 'on load: Do not add items into the "all" category (on load)') do |size|
|
|
36
|
+
NO_ALL = true
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
opts.on('-C', '--no-combinatorial', 'Do not create combined categories, do not add items to combined categories (on load)') do |size|
|
|
40
|
+
NO_COMBINATORIAL = true
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
opts.on('-R', '--remove-results', 'Remove results data - breaks the cache, fully clears all loaded data. (on clear)') do |size|
|
|
44
|
+
REMOVE_RESULTS = true
|
|
37
45
|
end
|
|
38
46
|
|
|
39
47
|
opts.separator ''
|
|
@@ -41,6 +49,8 @@ parser = OptionParser.new do |opts|
|
|
|
41
49
|
opts.separator ' load FILE Loads data from a FILE - can be a local file or a url. Accepted formats are .json, .tsv and .csv'
|
|
42
50
|
opts.separator " reset Removes all existing data (optionally pass a file to run load after reset)"
|
|
43
51
|
opts.separator ''
|
|
52
|
+
opts.separator 'Additional info: https://sethherr.github.io/soulheart/commands/'
|
|
53
|
+
opts.separator ''
|
|
44
54
|
end
|
|
45
55
|
|
|
46
56
|
|
|
@@ -58,7 +68,7 @@ def load(file)
|
|
|
58
68
|
|
|
59
69
|
start_time = Time.now.to_i
|
|
60
70
|
count = 0
|
|
61
|
-
loader = Soulheart::Loader.new
|
|
71
|
+
loader = Soulheart::Loader.new({no_all: NO_ALL, no_combinatorial: NO_COMBINATORIAL})
|
|
62
72
|
lines = []
|
|
63
73
|
begin
|
|
64
74
|
if file.match(/(c|t)sv\z/i)
|
|
@@ -87,21 +97,23 @@ def load(file)
|
|
|
87
97
|
f.close
|
|
88
98
|
end
|
|
89
99
|
loader.load(lines)
|
|
90
|
-
puts "
|
|
100
|
+
puts "Total time to load: #{Time.now.to_i - start_time} second(s)"
|
|
91
101
|
end
|
|
92
102
|
|
|
93
|
-
def clear
|
|
94
|
-
Soulheart::Loader.new.clear
|
|
103
|
+
def clear(remove_results)
|
|
104
|
+
Soulheart::Loader.new.clear(remove_results)
|
|
95
105
|
end
|
|
96
106
|
|
|
97
107
|
parser.parse!
|
|
98
|
-
BATCH_SIZE ||= 1000
|
|
99
108
|
|
|
100
109
|
case ARGV[0]
|
|
101
110
|
when 'load'
|
|
111
|
+
BATCH_SIZE ||= 1000
|
|
112
|
+
NO_ALL ||= false
|
|
113
|
+
NO_COMBINED_CATEGORIES ||= false
|
|
102
114
|
load ARGV[1]
|
|
103
115
|
when 'reset'
|
|
104
|
-
clear
|
|
116
|
+
clear(REMOVE_RESULTS)
|
|
105
117
|
load ARGV[1] if ARGV[1]
|
|
106
118
|
else
|
|
107
119
|
puts parser.help
|
data/lib/soulheart/base.rb
CHANGED
|
@@ -20,6 +20,10 @@ module Soulheart
|
|
|
20
20
|
redis.smembers(categories_id).map { |c| normalize(c) }.uniq.sort
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
+
def hidden_category_array
|
|
24
|
+
redis.smembers(hidden_categories_id).map { |c| normalize(c) }.uniq.sort
|
|
25
|
+
end
|
|
26
|
+
|
|
23
27
|
def combinatored_category_array
|
|
24
28
|
1.upto(sorted_category_array.size).
|
|
25
29
|
flat_map { |n| sorted_category_array.combination(n).
|
|
@@ -29,7 +33,7 @@ module Soulheart
|
|
|
29
33
|
def set_category_combos_array
|
|
30
34
|
redis.expire category_combos_id, 0
|
|
31
35
|
array = combinatored_category_array
|
|
32
|
-
array.last.replace('all')
|
|
36
|
+
array.any? ? array.last.replace('all') : array << 'all'
|
|
33
37
|
redis.sadd category_combos_id, array
|
|
34
38
|
array
|
|
35
39
|
end
|
|
@@ -46,6 +50,10 @@ module Soulheart
|
|
|
46
50
|
"#{base_id}categories:"
|
|
47
51
|
end
|
|
48
52
|
|
|
53
|
+
def hidden_categories_id
|
|
54
|
+
"#{categories_id}hidden:"
|
|
55
|
+
end
|
|
56
|
+
|
|
49
57
|
def category_id(name = 'all')
|
|
50
58
|
"#{categories_id}#{name}:"
|
|
51
59
|
end
|
data/lib/soulheart/loader.rb
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
module Soulheart
|
|
2
2
|
class Loader < Base
|
|
3
|
+
def initialize(defaults={})
|
|
4
|
+
@no_all = defaults[:no_all]
|
|
5
|
+
@no_combinatorial = defaults[:no_combinatorial]
|
|
6
|
+
end
|
|
7
|
+
|
|
3
8
|
def default_items_hash(text, category)
|
|
4
9
|
category ||= 'default'
|
|
5
10
|
{
|
|
@@ -14,9 +19,19 @@ module Soulheart
|
|
|
14
19
|
}
|
|
15
20
|
end
|
|
16
21
|
|
|
22
|
+
def add_to_categories_array(category)
|
|
23
|
+
if @no_combinatorial
|
|
24
|
+
return if redis.smembers(hidden_categories_id).include?(category)
|
|
25
|
+
redis.sadd hidden_categories_id, category
|
|
26
|
+
elsif !redis.smembers(categories_id).include?(category)
|
|
27
|
+
redis.sadd categories_id, category
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
17
31
|
def delete_categories
|
|
18
32
|
redis.expire category_combos_id, 0
|
|
19
33
|
redis.expire categories_id, 0
|
|
34
|
+
redis.expire hidden_categories_id, 0
|
|
20
35
|
end
|
|
21
36
|
|
|
22
37
|
def reset_categories(categories)
|
|
@@ -65,12 +80,20 @@ module Soulheart
|
|
|
65
80
|
end
|
|
66
81
|
set_category_combos_array.each do |category_combo|
|
|
67
82
|
items.each do |item|
|
|
68
|
-
|
|
83
|
+
if category_combo == item['category']
|
|
84
|
+
next
|
|
85
|
+
elsif category_combo == 'all'
|
|
86
|
+
next if @no_all
|
|
87
|
+
elsif !category_combo.match(item['category'])
|
|
88
|
+
next
|
|
89
|
+
elsif @no_combinatorial
|
|
90
|
+
next
|
|
91
|
+
end
|
|
69
92
|
add_item(item, category_id(category_combo), true) # send it base
|
|
70
93
|
i += 1
|
|
71
94
|
end
|
|
72
95
|
end
|
|
73
|
-
puts "Total items (including
|
|
96
|
+
puts "Total items (including combinatorial categories): #{i}"
|
|
74
97
|
end
|
|
75
98
|
|
|
76
99
|
def clean_hash(item)
|
|
@@ -87,19 +110,16 @@ module Soulheart
|
|
|
87
110
|
item.keys.select{ |k| !%w(category priority term aliases data).include?(k) }.each do |key|
|
|
88
111
|
item['data'].merge!({"#{key}" => item.delete(key)})
|
|
89
112
|
end
|
|
90
|
-
|
|
91
|
-
redis.sadd categories_id, item['category']
|
|
92
|
-
end
|
|
113
|
+
add_to_categories_array(item['category'])
|
|
93
114
|
item
|
|
94
115
|
end
|
|
95
116
|
|
|
96
117
|
def add_item(item, category_base_id=nil, cleaned=false)
|
|
97
118
|
item = clean(item) unless cleaned
|
|
98
119
|
category_base_id ||= category_id(item['category'])
|
|
99
|
-
|
|
100
120
|
priority = (-item['priority'])
|
|
101
121
|
redis.pipelined do
|
|
102
|
-
redis.zadd(no_query_id(category_base_id), priority, item['term'])
|
|
122
|
+
redis.zadd(no_query_id(category_base_id), priority, item['term']) # Add to master set for queryless searches
|
|
103
123
|
# store the raw data in a separate key to reduce memory usage, if it's cleaned it's done
|
|
104
124
|
redis.hset(results_hashes_id, item['term'], MultiJson.encode(item['data'])) unless cleaned
|
|
105
125
|
phrase = ([item['term']] + (item['aliases'] || [])).join(' ')
|
data/lib/soulheart/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: soulheart
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Seth Herr
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-07-
|
|
11
|
+
date: 2015-07-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: hiredis
|
|
@@ -164,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
164
164
|
version: '0'
|
|
165
165
|
requirements: []
|
|
166
166
|
rubyforge_project:
|
|
167
|
-
rubygems_version: 2.
|
|
167
|
+
rubygems_version: 2.4.8
|
|
168
168
|
signing_key:
|
|
169
169
|
specification_version: 4
|
|
170
170
|
summary: Simple, fast autocomplete server for Ruby and Rails
|