flex 0.4.2 → 1.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.
- data/LICENSE +1 -1
- data/README.md +46 -7
- data/VERSION +1 -1
- data/flex.gemspec +13 -19
- data/lib/flex.rb +66 -392
- data/lib/flex/api_stubs.rb +1268 -0
- data/lib/flex/api_templates/cluster_api.yml +94 -0
- data/lib/flex/api_templates/core_api.yml +202 -0
- data/lib/flex/api_templates/indices_api.yml +304 -0
- data/lib/flex/class_proxy/base.rb +20 -6
- data/lib/flex/class_proxy/templates.rb +97 -0
- data/lib/flex/class_proxy/templates/doc.rb +91 -0
- data/lib/flex/class_proxy/templates/search.rb +72 -0
- data/lib/flex/configuration.rb +17 -49
- data/lib/flex/deprecation.rb +153 -0
- data/lib/flex/errors.rb +2 -1
- data/lib/flex/http_clients/base.rb +15 -0
- data/lib/flex/http_clients/loader.rb +51 -0
- data/lib/flex/http_clients/patron.rb +9 -7
- data/lib/flex/http_clients/rest_client.rb +6 -8
- data/lib/flex/logger.rb +24 -3
- data/lib/flex/prog_bar.rb +11 -6
- data/lib/flex/rails.rb +1 -13
- data/lib/flex/result.rb +8 -2
- data/lib/flex/result/document.rb +42 -13
- data/lib/flex/result/multi_get.rb +24 -0
- data/lib/flex/result/search.rb +1 -24
- data/lib/flex/struct/array.rb +25 -0
- data/lib/flex/struct/hash.rb +105 -0
- data/lib/flex/{result/collection.rb → struct/paginable.rb} +16 -9
- data/lib/flex/struct/prunable.rb +60 -0
- data/lib/flex/struct/symbolize.rb +27 -0
- data/lib/flex/tasks.rb +26 -86
- data/lib/flex/template.rb +60 -120
- data/lib/flex/template/common.rb +42 -0
- data/lib/flex/template/logger.rb +66 -0
- data/lib/flex/template/partial.rb +12 -15
- data/lib/flex/template/search.rb +6 -6
- data/lib/flex/template/slim_search.rb +1 -1
- data/lib/flex/template/tags.rb +19 -9
- data/lib/flex/templates.rb +20 -0
- data/lib/flex/utility_methods.rb +80 -89
- data/lib/flex/utils.rb +68 -25
- data/lib/flex/variables.rb +55 -4
- data/lib/tasks.rake +28 -0
- metadata +61 -85
- data/bin/flexes +0 -174
- data/lib/flex/api_methods.yml +0 -108
- data/lib/flex/class_proxy/loader.rb +0 -102
- data/lib/flex/class_proxy/model.rb +0 -45
- data/lib/flex/class_proxy/model_sync.rb +0 -23
- data/lib/flex/class_proxy/related_model.rb +0 -23
- data/lib/flex/instance_proxy/base.rb +0 -29
- data/lib/flex/instance_proxy/model.rb +0 -102
- data/lib/flex/instance_proxy/related_model.rb +0 -7
- data/lib/flex/loader.rb +0 -18
- data/lib/flex/manager.rb +0 -61
- data/lib/flex/model.rb +0 -24
- data/lib/flex/rails/engine.rb +0 -23
- data/lib/flex/rails/helper.rb +0 -16
- data/lib/flex/related_model.rb +0 -16
- data/lib/flex/result/indifferent_access.rb +0 -11
- data/lib/flex/result/source_document.rb +0 -63
- data/lib/flex/result/source_search.rb +0 -32
- data/lib/flex/structure/indifferent_access.rb +0 -44
- data/lib/flex/structure/mergeable.rb +0 -21
- data/lib/flex/template/base.rb +0 -41
- data/lib/flex/template/info.rb +0 -68
- data/lib/generators/flex/setup/setup_generator.rb +0 -48
- data/lib/generators/flex/setup/templates/flex_config.yml +0 -16
- data/lib/generators/flex/setup/templates/flex_dir/es.rb.erb +0 -18
- data/lib/generators/flex/setup/templates/flex_dir/es.yml.erb +0 -19
- data/lib/generators/flex/setup/templates/flex_dir/es_extender.rb.erb +0 -17
- data/lib/generators/flex/setup/templates/flex_initializer.rb.erb +0 -44
- data/lib/tasks/index.rake +0 -17
- data/test/flex.irt +0 -143
- data/test/flex/configuration.irt +0 -53
- data/test/irt_helper.rb +0 -12
data/lib/flex/utils.rb
CHANGED
@@ -2,23 +2,17 @@ module Flex
|
|
2
2
|
module Utils
|
3
3
|
extend self
|
4
4
|
|
5
|
-
def
|
5
|
+
def parse_source(source)
|
6
6
|
return unless source
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
raise ArgumentError, "the source does not decode to
|
14
|
-
unless
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
def deep_merge_hashes(h1, *hashes)
|
19
|
-
merged = h1.dup
|
20
|
-
hashes.each {|h2| merged.replace(deep_merge_hash(merged,h2))}
|
21
|
-
merged
|
7
|
+
parsed = case source
|
8
|
+
when Hash then keyfy(:to_s, source)
|
9
|
+
when /^\s*\{.+\}\s*$/m then source
|
10
|
+
when String then YAML.load(source)
|
11
|
+
else raise ArgumentError, "expected a String or Hash instance, got #{source.inspect}"
|
12
|
+
end
|
13
|
+
raise ArgumentError, "the source does not decode to an Array, Hash or String, got #{parsed.inspect}" \
|
14
|
+
unless parsed.is_a?(Hash) || parsed.is_a?(Array) || parsed.is_a?(String)
|
15
|
+
parsed
|
22
16
|
end
|
23
17
|
|
24
18
|
def erb_process(source)
|
@@ -39,22 +33,71 @@ module Flex
|
|
39
33
|
h
|
40
34
|
end
|
41
35
|
|
42
|
-
def
|
43
|
-
|
44
|
-
hash
|
45
|
-
|
36
|
+
def delete_allcaps_keys(hash)
|
37
|
+
hash.keys.each { |k| hash.delete(k) if k =~ /^[A-Z_]+$/ }
|
38
|
+
hash
|
39
|
+
end
|
40
|
+
|
41
|
+
def keyfy(to_what, obj)
|
42
|
+
case obj
|
43
|
+
when Hash
|
44
|
+
h = {}
|
45
|
+
obj.each do |k,v|
|
46
|
+
h[k.send(to_what)] = keyfy(to_what, v)
|
47
|
+
end
|
48
|
+
h
|
49
|
+
when Array
|
50
|
+
obj.map{|i| keyfy(to_what, i)}
|
51
|
+
else
|
52
|
+
obj
|
46
53
|
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def slice_hash(hash, *keys)
|
57
|
+
h = {}
|
58
|
+
keys.each{|k| h[k] = hash[k] if hash.has_key?(k)}
|
47
59
|
h
|
48
60
|
end
|
49
61
|
|
50
|
-
|
62
|
+
def env2options(*keys)
|
63
|
+
options = {}
|
64
|
+
ENV.keys.map do |k|
|
65
|
+
key = k.downcase.to_sym
|
66
|
+
options[key] = ENV[k] if keys.include?(key)
|
67
|
+
end
|
68
|
+
options
|
69
|
+
end
|
70
|
+
|
71
|
+
def define_delegation(opts)
|
72
|
+
file, line = caller.first.split(':', 2)
|
73
|
+
line = line.to_i
|
74
|
+
|
75
|
+
obj, meth, methods, to = opts[:in], opts[:by], opts[:for], opts[:to]
|
51
76
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
77
|
+
methods.each do |method|
|
78
|
+
obj.send meth, <<-method, file, line - 1
|
79
|
+
def #{method}(*args, &block) # def method_name(*args, &block)
|
80
|
+
if #{to} || #{to}.respond_to?(:#{method}) # if client || client.respond_to?(:name)
|
81
|
+
#{to}.__send__(:#{method}, *args, &block) # client.__send__(:name, *args, &block)
|
82
|
+
end # end
|
83
|
+
end # end
|
84
|
+
method
|
56
85
|
end
|
86
|
+
|
57
87
|
end
|
58
88
|
|
89
|
+
def class_name_to_type(class_name)
|
90
|
+
type = class_name.tr(':', '_')
|
91
|
+
type.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
92
|
+
type.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
93
|
+
type.downcase!
|
94
|
+
type
|
95
|
+
end
|
96
|
+
|
97
|
+
def type_to_class_name(type)
|
98
|
+
type.gsub(/__(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
99
|
+
end
|
100
|
+
|
101
|
+
|
59
102
|
end
|
60
103
|
end
|
data/lib/flex/variables.rb
CHANGED
@@ -1,11 +1,62 @@
|
|
1
1
|
module Flex
|
2
|
-
class Variables < Hash
|
2
|
+
class Variables < Struct::Hash
|
3
3
|
|
4
|
-
|
4
|
+
def initialize(*hashes)
|
5
|
+
deep_merge! super(), *hashes
|
6
|
+
end
|
7
|
+
|
8
|
+
def finalize
|
9
|
+
self[:index] = self[:index].uniq.join(',') if self[:index].is_a?(Array)
|
10
|
+
self[:type] = self[:type].uniq.join(',') if self[:type].is_a?(Array)
|
11
|
+
# so you can pass :fields => [:field_one, :field_two]
|
12
|
+
self[:params!].each{|k,v| self[:params][k] = v.uniq.join(',') if v.is_a?(Array)}
|
13
|
+
if self[:page]
|
14
|
+
self[:page] = self[:page].to_i
|
15
|
+
self[:page] = 1 unless self[:page] > 0
|
16
|
+
self[:params][:from] ||= ((self[:page] - 1) * (self[:params][:size] || 10)).ceil unless self[:page] == 1
|
17
|
+
else
|
18
|
+
self[:page] = 1
|
19
|
+
end
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
# returns Prunable::Value if the value is in VALUES (called from stringified)
|
24
|
+
def get_prunable(key)
|
25
|
+
val = fetch_nested(key)
|
26
|
+
return val if self[:no_pruning].include?(key)
|
27
|
+
Prunable::VALUES.include?(val) ? Prunable::Value : val
|
28
|
+
end
|
29
|
+
|
30
|
+
# allows to store keys like 'a.3.c' into vars[:a][3][:c]
|
31
|
+
def store_nested(key, value)
|
32
|
+
var = unnest(key).reverse.inject(value) do |memo,k|
|
33
|
+
if k.is_a?(Symbol)
|
34
|
+
{k => memo}
|
35
|
+
else
|
36
|
+
ar = []
|
37
|
+
ar[k] = memo
|
38
|
+
ar
|
39
|
+
end
|
40
|
+
end
|
41
|
+
deep_merge! var
|
42
|
+
end
|
43
|
+
|
44
|
+
# allows to fetch values for tag names like 'a.3.c' fetching vars[:a][3][:c]
|
45
|
+
def fetch_nested(key)
|
46
|
+
unnest(key).inject(self, :fetch)
|
47
|
+
rescue NoMethodError, KeyError
|
48
|
+
raise MissingVariableError, "the required #{key.inspect} variable is missing."
|
49
|
+
end
|
5
50
|
|
6
|
-
|
7
|
-
|
51
|
+
private
|
52
|
+
|
53
|
+
def unnest(key)
|
54
|
+
key.to_s.split('.').map{|s| s =~ /^\d+$/ ? s.to_i : s.to_sym}
|
8
55
|
end
|
9
56
|
|
10
57
|
end
|
58
|
+
# shorter alias
|
59
|
+
Vars = Variables
|
11
60
|
end
|
61
|
+
|
62
|
+
|
data/lib/tasks.rake
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'flex'
|
2
|
+
|
3
|
+
env = defined?(Rails) ? :environment : []
|
4
|
+
|
5
|
+
namespace :flex do
|
6
|
+
|
7
|
+
# deprecated tasks
|
8
|
+
task(:create_indices => env) do
|
9
|
+
Flex::Deprecation.warn 'flex:create_indices', 'flex:index:create', nil
|
10
|
+
Flex::Tasks.new.create_indices
|
11
|
+
end
|
12
|
+
task(:delete_indices => env) do
|
13
|
+
Flex::Deprecation.warn 'flex:delete_indices', 'flex:index:delete', nil
|
14
|
+
Flex::Tasks.new.delete_indices
|
15
|
+
end
|
16
|
+
|
17
|
+
namespace :index do
|
18
|
+
|
19
|
+
desc 'creates index/indices from the Flex::Configuration.config_file file'
|
20
|
+
task(:create => env) { Flex::Tasks.new.create_indices }
|
21
|
+
|
22
|
+
desc 'destroys index/indices in the Flex::Configuration.config_file file'
|
23
|
+
task(:delete => env) { Flex::Tasks.new.delete_indices }
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,83 +9,78 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 1.3.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: progressbar
|
27
|
-
requirement: &70261802508900 !ruby/object:Gem::Requirement
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
25
|
none: false
|
29
26
|
requirements:
|
30
|
-
- -
|
27
|
+
- - ! '>='
|
31
28
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
33
|
-
type: :runtime
|
34
|
-
prerelease: false
|
35
|
-
version_requirements: *70261802508900
|
29
|
+
version: 1.3.4
|
36
30
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement:
|
31
|
+
name: progressbar
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
39
33
|
none: false
|
40
34
|
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.11.0
|
41
38
|
- - ~>
|
42
39
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.
|
40
|
+
version: 0.12.0
|
44
41
|
type: :runtime
|
45
42
|
prerelease: false
|
46
|
-
version_requirements:
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: irt
|
49
|
-
requirement: &70261802506900 !ruby/object:Gem::Requirement
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
44
|
none: false
|
51
45
|
requirements:
|
46
|
+
- - ! '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 0.11.0
|
52
49
|
- - ~>
|
53
50
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
-
type: :development
|
56
|
-
prerelease: false
|
57
|
-
version_requirements: *70261802506900
|
51
|
+
version: 0.12.0
|
58
52
|
- !ruby/object:Gem::Dependency
|
59
|
-
name:
|
60
|
-
requirement:
|
53
|
+
name: dye
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
61
55
|
none: false
|
62
56
|
requirements:
|
63
57
|
- - ~>
|
64
58
|
- !ruby/object:Gem::Version
|
65
|
-
version: 0.4
|
66
|
-
type: :
|
59
|
+
version: 0.1.4
|
60
|
+
type: :runtime
|
67
61
|
prerelease: false
|
68
|
-
version_requirements:
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rest-client
|
71
|
-
requirement: &70261802505360 !ruby/object:Gem::Requirement
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
63
|
none: false
|
73
64
|
requirements:
|
74
65
|
- - ~>
|
75
66
|
- !ruby/object:Gem::Version
|
76
|
-
version: 1.
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
67
|
+
version: 0.1.4
|
68
|
+
description: ! 'Flex is the ultimate ruby client for elasticsearch. It is powerful,
|
69
|
+
fast and efficient, easy to use and customize.
|
70
|
+
|
71
|
+
|
72
|
+
It covers ALL the elasticsearch API, and transparently integrates it with your app
|
73
|
+
and its components, like Rails, ActiveRecord, Mongoid, ActiveModel, will_paginate,
|
74
|
+
kaminari, elasticsearch-mapper-attachments, ...
|
75
|
+
|
76
|
+
|
77
|
+
It also implements and integrates very advanced features like chainable scopes,
|
78
|
+
live-reindex, cross-model syncing, query fragment reuse, parent/child relationships,
|
79
|
+
templating, self-documenting tools, detailed debugging, ...
|
84
80
|
|
85
81
|
'
|
86
82
|
email: dd.nexus@gmail.com
|
87
|
-
executables:
|
88
|
-
- flexes
|
83
|
+
executables: []
|
89
84
|
extensions: []
|
90
85
|
extra_rdoc_files:
|
91
86
|
- README.md
|
@@ -93,72 +88,54 @@ files:
|
|
93
88
|
- LICENSE
|
94
89
|
- README.md
|
95
90
|
- VERSION
|
96
|
-
- bin/flexes
|
97
91
|
- flex.gemspec
|
98
92
|
- lib/flex.rb
|
99
|
-
- lib/flex/
|
93
|
+
- lib/flex/api_stubs.rb
|
94
|
+
- lib/flex/api_templates/cluster_api.yml
|
95
|
+
- lib/flex/api_templates/core_api.yml
|
96
|
+
- lib/flex/api_templates/indices_api.yml
|
100
97
|
- lib/flex/class_proxy/base.rb
|
101
|
-
- lib/flex/class_proxy/
|
102
|
-
- lib/flex/class_proxy/
|
103
|
-
- lib/flex/class_proxy/
|
104
|
-
- lib/flex/class_proxy/related_model.rb
|
98
|
+
- lib/flex/class_proxy/templates.rb
|
99
|
+
- lib/flex/class_proxy/templates/doc.rb
|
100
|
+
- lib/flex/class_proxy/templates/search.rb
|
105
101
|
- lib/flex/configuration.rb
|
102
|
+
- lib/flex/deprecation.rb
|
106
103
|
- lib/flex/errors.rb
|
104
|
+
- lib/flex/http_clients/base.rb
|
105
|
+
- lib/flex/http_clients/loader.rb
|
107
106
|
- lib/flex/http_clients/patron.rb
|
108
107
|
- lib/flex/http_clients/rest_client.rb
|
109
|
-
- lib/flex/instance_proxy/base.rb
|
110
|
-
- lib/flex/instance_proxy/model.rb
|
111
|
-
- lib/flex/instance_proxy/related_model.rb
|
112
|
-
- lib/flex/loader.rb
|
113
108
|
- lib/flex/logger.rb
|
114
|
-
- lib/flex/manager.rb
|
115
|
-
- lib/flex/model.rb
|
116
109
|
- lib/flex/prog_bar.rb
|
117
110
|
- lib/flex/rails.rb
|
118
|
-
- lib/flex/rails/engine.rb
|
119
|
-
- lib/flex/rails/helper.rb
|
120
|
-
- lib/flex/related_model.rb
|
121
111
|
- lib/flex/result.rb
|
122
112
|
- lib/flex/result/bulk.rb
|
123
|
-
- lib/flex/result/collection.rb
|
124
113
|
- lib/flex/result/document.rb
|
125
|
-
- lib/flex/result/
|
114
|
+
- lib/flex/result/multi_get.rb
|
126
115
|
- lib/flex/result/search.rb
|
127
|
-
- lib/flex/
|
128
|
-
- lib/flex/
|
129
|
-
- lib/flex/
|
130
|
-
- lib/flex/
|
116
|
+
- lib/flex/struct/array.rb
|
117
|
+
- lib/flex/struct/hash.rb
|
118
|
+
- lib/flex/struct/paginable.rb
|
119
|
+
- lib/flex/struct/prunable.rb
|
120
|
+
- lib/flex/struct/symbolize.rb
|
131
121
|
- lib/flex/tasks.rb
|
132
122
|
- lib/flex/template.rb
|
133
|
-
- lib/flex/template/
|
134
|
-
- lib/flex/template/
|
123
|
+
- lib/flex/template/common.rb
|
124
|
+
- lib/flex/template/logger.rb
|
135
125
|
- lib/flex/template/partial.rb
|
136
126
|
- lib/flex/template/search.rb
|
137
127
|
- lib/flex/template/slim_search.rb
|
138
128
|
- lib/flex/template/tags.rb
|
129
|
+
- lib/flex/templates.rb
|
139
130
|
- lib/flex/utility_methods.rb
|
140
131
|
- lib/flex/utils.rb
|
141
132
|
- lib/flex/variables.rb
|
142
|
-
- lib/
|
143
|
-
- lib/generators/flex/setup/templates/flex_config.yml
|
144
|
-
- lib/generators/flex/setup/templates/flex_dir/es.rb.erb
|
145
|
-
- lib/generators/flex/setup/templates/flex_dir/es.yml.erb
|
146
|
-
- lib/generators/flex/setup/templates/flex_dir/es_extender.rb.erb
|
147
|
-
- lib/generators/flex/setup/templates/flex_initializer.rb.erb
|
148
|
-
- lib/tasks/index.rake
|
149
|
-
- test/flex.irt
|
150
|
-
- test/flex/configuration.irt
|
151
|
-
- test/irt_helper.rb
|
133
|
+
- lib/tasks.rake
|
152
134
|
homepage: http://github.com/ddnexus/flex
|
153
135
|
licenses: []
|
154
136
|
post_install_message: ! "________________________________________________________________________________\n\n
|
155
|
-
\ FLEX INSTALLATION NOTES\n________________________________________________________________________________\n\
|
156
|
-
|
157
|
-
suported http-client gems are \"patron\" and \"rest-client\".\n\nYou should install
|
158
|
-
\"patron\" (a libcurl based gem developed in C) for best\nperformances, or install
|
159
|
-
\"rest-client\" if you cannot use libcurl on your system.\n\nAs an alternative you
|
160
|
-
could eventually develop your own http-client interface\nand set the Flex::Configuration.http_client
|
161
|
-
option.\n\n________________________________________________________________________________\n"
|
137
|
+
\ FLEX INSTALLATION NOTES\n________________________________________________________________________________\n\nNew
|
138
|
+
Documentation: http://ddnexus.github.io/flex\n\nUpgrading Tutorial: http://ddnexus.github.io/flex/doc/7-Tutorials/2-Migrate-from-0.x.html\n\n________________________________________________________________________________\n"
|
162
139
|
rdoc_options:
|
163
140
|
- --charset=UTF-8
|
164
141
|
require_paths:
|
@@ -177,9 +154,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
154
|
version: 1.3.6
|
178
155
|
requirements: []
|
179
156
|
rubyforge_project:
|
180
|
-
rubygems_version: 1.8.
|
157
|
+
rubygems_version: 1.8.25
|
181
158
|
signing_key:
|
182
159
|
specification_version: 3
|
183
|
-
summary:
|
160
|
+
summary: The ultimate ruby client for elasticsearch
|
184
161
|
test_files: []
|
185
|
-
has_rdoc:
|
data/bin/flexes
DELETED
@@ -1,174 +0,0 @@
|
|
1
|
-
#! /usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'optparse'
|
4
|
-
require 'flex'
|
5
|
-
|
6
|
-
options = { }
|
7
|
-
version = File.read(File.expand_path('../../VERSION', __FILE__)).strip
|
8
|
-
copy = "flexes #{version} (c) 2012 Domizio Demichelis"
|
9
|
-
optparse = OptionParser.new do |opts|
|
10
|
-
|
11
|
-
opts.banner = <<-banner
|
12
|
-
|
13
|
-
FlexEs:
|
14
|
-
Flex tool to dump/load data from/to ElasticSearch.
|
15
|
-
Usage:
|
16
|
-
flexes <command> [options]
|
17
|
-
<command>:
|
18
|
-
dump dumps the data from one or more ElasticSearch indices
|
19
|
-
load loads a dumpfile
|
20
|
-
stats prints the full ElasticSearch stats
|
21
|
-
|
22
|
-
Notice: The load command will load the dump-file into ElasticSearch without removing any pre-existent data.
|
23
|
-
If you need fresh indices, use the flex:delete_indices and flex:create_indices rake tasks from your
|
24
|
-
application, which will also recreate the mapping.
|
25
|
-
banner
|
26
|
-
|
27
|
-
|
28
|
-
opts.separator ''
|
29
|
-
opts.separator 'Common options:'
|
30
|
-
|
31
|
-
options[:file] = './flexes.dump'
|
32
|
-
opts.on( '-f', '--file [FILE]', "The path of the dumpfile (default: '#{options[:file]}')" ) do |f|
|
33
|
-
options[:file] = f
|
34
|
-
end
|
35
|
-
|
36
|
-
opts.separator ''
|
37
|
-
opts.separator 'Dump options:'
|
38
|
-
|
39
|
-
options[:index] = nil
|
40
|
-
opts.on( '-i', '--index [INDEX_OR_INDICES]', Array, 'The index or comma separated indices to dump (default: all indices)' ) do |i|
|
41
|
-
options[:index] = i
|
42
|
-
end
|
43
|
-
|
44
|
-
options[:type] = nil
|
45
|
-
opts.on( '-t', '--type [TYPE_OR_TYPES]', Array, 'The type or comma separated types to dump (default: all types)' ) do |t|
|
46
|
-
options[:type] = t
|
47
|
-
end
|
48
|
-
|
49
|
-
options[:scroll] = '5m'
|
50
|
-
opts.on( '-s', '--scroll [TIME]', "The ElasticSearch scroll time (default: #{options[:scroll]})" ) do |s|
|
51
|
-
options[:scroll] = s
|
52
|
-
end
|
53
|
-
|
54
|
-
options[:size] = 50
|
55
|
-
opts.on( '-z', '--size [SIZE]', Integer, "The chunk size to dump per shard (default: #{options[:size]} * number of shards)" ) do |z|
|
56
|
-
options[:size] = z
|
57
|
-
end
|
58
|
-
|
59
|
-
opts.separator ''
|
60
|
-
opts.separator 'Load options:'
|
61
|
-
|
62
|
-
options[:timeout] = 20
|
63
|
-
opts.on( '-o', '--timeout [SECONDS]', Integer, "The http_client timeout for bulk loading (default: #{options[:timeout]} seconds)" ) do |o|
|
64
|
-
options[:timeout] = o
|
65
|
-
end
|
66
|
-
|
67
|
-
options[:batch_size] = 1000
|
68
|
-
opts.on( '-b', '--batch_size [BATCH_SIZE]', Integer, "The batch size to load (default: #{options[:batch_size]})" ) do |z|
|
69
|
-
options[:size] = z
|
70
|
-
end
|
71
|
-
|
72
|
-
opts.separator ''
|
73
|
-
opts.separator 'Other options:'
|
74
|
-
|
75
|
-
opts.on( '-v', '--version', 'Shows the version and exits' ) do
|
76
|
-
puts version
|
77
|
-
exit
|
78
|
-
end
|
79
|
-
|
80
|
-
opts.on_tail( '-h', '--help', 'Displays this screen' ) do
|
81
|
-
puts copy
|
82
|
-
puts opts
|
83
|
-
exit
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
optparse.parse!
|
89
|
-
command = ARGV.first
|
90
|
-
exec "#{$0} -h" if command.nil?
|
91
|
-
puts copy
|
92
|
-
|
93
|
-
case command
|
94
|
-
|
95
|
-
when 'dump'
|
96
|
-
search_t = Flex::Template::Search.new( {:query => {:match_all => {}}},
|
97
|
-
:params => { :search_type => 'scan',
|
98
|
-
:scroll => options[:scroll],
|
99
|
-
:size => options[:size],
|
100
|
-
:fields => '_source,*' } )
|
101
|
-
scroll_t = Flex::Template.new( :get,
|
102
|
-
'/_search/scroll',
|
103
|
-
nil,
|
104
|
-
:params => { :scroll => options[:scroll] } )
|
105
|
-
search_res = search_t.render options
|
106
|
-
scroll_id = search_res['_scroll_id']
|
107
|
-
total_hits = search_res['hits']['total']
|
108
|
-
total_count = 0
|
109
|
-
pbar = Flex::ProgBar.new(total_hits)
|
110
|
-
dump_stats = Hash.new { |hash, key| hash[key] = Hash.new{|h,k| h[k] = 0} }
|
111
|
-
file_size = 0
|
112
|
-
File.open(options[:file], 'wb') do |file|
|
113
|
-
while (result = scroll_t.render(:data => scroll_id)) do
|
114
|
-
break if result['hits']['hits'] == []
|
115
|
-
lines = result['hits']['hits'].map do |h|
|
116
|
-
dump_stats[h['_index']][h['_type']] += 1
|
117
|
-
meta = { :_index => h['_index'],
|
118
|
-
:_type => h['_type'],
|
119
|
-
:_id => h['_id'] }
|
120
|
-
if h.has_key?('fields')
|
121
|
-
h['fields'].each do |k,v|
|
122
|
-
meta[k] = v if k[0] == '_'
|
123
|
-
end
|
124
|
-
end
|
125
|
-
[ MultiJson.encode({'index' => meta}),
|
126
|
-
MultiJson.encode(h['_source']) ].join("\n")
|
127
|
-
end
|
128
|
-
file.puts lines.join("\n")
|
129
|
-
scroll_id = result['_scroll_id']
|
130
|
-
total_count += lines.size
|
131
|
-
pbar.pbar.inc(lines.size)
|
132
|
-
end
|
133
|
-
file_size = file.size
|
134
|
-
end
|
135
|
-
formatted_file_size = file_size.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse
|
136
|
-
pbar.pbar.finish
|
137
|
-
puts "\n***** WARNING: Expected document to dump: #{total_hits}, dumped: #{total_count}. *****" \
|
138
|
-
unless total_hits == total_count
|
139
|
-
puts "\nDumped #{total_count} documents to #{options[:file]} (size: #{formatted_file_size} bytes)"
|
140
|
-
puts dump_stats.to_yaml
|
141
|
-
|
142
|
-
when 'load'
|
143
|
-
Flex::Configuration.http_client_options[:timeout] = options[:timeout]
|
144
|
-
chunk_size = options[:batch_size] * 2 # 2 lines per doc
|
145
|
-
lines = ''
|
146
|
-
line_count = 0
|
147
|
-
file = File.open(options[:file])
|
148
|
-
file.lines{ line_count += 1 }
|
149
|
-
file.rewind
|
150
|
-
pbar = Flex::ProgBar.new(line_count / 2, options[:batch_size])
|
151
|
-
file.lines do |line|
|
152
|
-
lines << line
|
153
|
-
if file.lineno % chunk_size == 0
|
154
|
-
result = Flex.bulk :lines => lines
|
155
|
-
lines = ''
|
156
|
-
pbar.process_result(result, options[:batch_size])
|
157
|
-
end
|
158
|
-
end
|
159
|
-
# last chunk
|
160
|
-
unless lines == ''
|
161
|
-
result = Flex.bulk :lines => lines
|
162
|
-
pbar.process_result(result, (file.lineno % chunk_size) / 2)
|
163
|
-
end
|
164
|
-
file.close
|
165
|
-
pbar.finish
|
166
|
-
|
167
|
-
when 'stats'
|
168
|
-
puts '>> puts Flex.stats.to_yaml'
|
169
|
-
puts Flex.stats.to_yaml
|
170
|
-
|
171
|
-
else
|
172
|
-
puts "unknown command: #{command.inspect}"
|
173
|
-
|
174
|
-
end
|