flex 0.3.1 → 0.4.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.
- data/README.md +4 -2
- data/VERSION +1 -1
- data/bin/flexes +174 -0
- data/flex.gemspec +3 -2
- data/lib/flex.rb +3 -0
- data/lib/flex/configuration.rb +2 -2
- data/lib/flex/instance_proxy/model.rb +3 -2
- data/lib/flex/manager.rb +1 -1
- data/lib/flex/prog_bar.rb +34 -0
- data/lib/flex/rails.rb +2 -1
- data/lib/flex/rails/engine.rb +5 -5
- data/lib/flex/tasks.rb +6 -25
- data/lib/flex/template.rb +18 -21
- data/lib/flex/template/base.rb +11 -0
- data/lib/flex/template/info.rb +22 -4
- data/lib/flex/template/tags.rb +1 -1
- data/lib/flex/utility_methods.rb +10 -5
- data/lib/flex/utils.rb +2 -1
- data/lib/generators/flex/setup/templates/flex_initializer.rb.erb +2 -2
- data/lib/tasks/index.rake +2 -2
- metadata +20 -17
data/README.md
CHANGED
@@ -2,14 +2,16 @@
|
|
2
2
|
|
3
3
|
Flex is a complete ruby client for [ElasticSearch](http://www.elasticsearch.org). It introduces a new way to send any kind of request (not just search queries) to the ES server, and to manage any kind of response. You can transparently integrate it with **ActiveRecord** and **Mongoid** models with or without automatic synchronization, with or without **Rails**. It is fast and efficient, easy to use and customize.
|
4
4
|
|
5
|
-
Flex is currently a very new project, however it is already used in production in 5 sites, and it will be deployed to a few others soon.
|
6
|
-
|
7
5
|
## Useful Links
|
8
6
|
|
9
7
|
* [Documentation](./flex/wiki)
|
10
8
|
* [Issues](./flex/issues)
|
11
9
|
* [Pull Requests](./flex/pulls)
|
12
10
|
|
11
|
+
## Branches
|
12
|
+
|
13
|
+
The master branch reflects the last published gem. Then you may find a next-version branch (named after the version string), with the commits that will be merged in master just before publishing the next gem version. The next-version branch may get rebased or force pushed.
|
14
|
+
|
13
15
|
## Credits
|
14
16
|
|
15
17
|
Special thanks for their sponsorship to [Escalate Media](http://www.escalatemedia.com) and [Barquin International](http://www.barquin.com).
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/bin/flexes
ADDED
@@ -0,0 +1,174 @@
|
|
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
|
data/flex.gemspec
CHANGED
@@ -4,11 +4,12 @@ Gem::Specification.new do |s|
|
|
4
4
|
s.name = 'flex'
|
5
5
|
s.summary = 'Ruby Client for ElasticSearch'
|
6
6
|
s.description = <<-desc
|
7
|
-
Flex is an innovative ruby client for ElasticSearch. With Flex your code will be clean, easy to write and read, and very short: "poetic-short". Flex is fast and efficient, easy to use and customize, and offers ActiveRecord,
|
7
|
+
Flex is an innovative ruby client for ElasticSearch. With Flex your code will be clean, easy to write and read, and very short: "poetic-short". Flex is fast and efficient, easy to use and customize, and offers ActiveRecord, Mongoid and Rails integration.
|
8
8
|
desc
|
9
9
|
s.homepage = 'http://github.com/ddnexus/flex'
|
10
10
|
s.authors = ["Domizio Demichelis"]
|
11
11
|
s.email = 'dd.nexus@gmail.com'
|
12
|
+
s.executables = ['flexes']
|
12
13
|
s.extra_rdoc_files = %w[README.md]
|
13
14
|
s.require_paths = %w[lib]
|
14
15
|
s.files = `git ls-files -z`.split("\0")
|
@@ -19,7 +20,7 @@ Flex is an innovative ruby client for ElasticSearch. With Flex your code will be
|
|
19
20
|
s.post_install_message = <<EOM
|
20
21
|
________________________________________________________________________________
|
21
22
|
|
22
|
-
|
23
|
+
FLEX INSTALLATION NOTES
|
23
24
|
________________________________________________________________________________
|
24
25
|
|
25
26
|
In order to use Flex, a supported http-client must be installed on this system.
|
data/lib/flex.rb
CHANGED
data/lib/flex/configuration.rb
CHANGED
@@ -44,13 +44,13 @@ module Flex
|
|
44
44
|
:logger => Logger.new(STDERR),
|
45
45
|
:variables => Variables.new( :index => nil,
|
46
46
|
:type => nil,
|
47
|
-
:no_pruning =>
|
47
|
+
:no_pruning => [] ),
|
48
48
|
:flex_models => [],
|
49
49
|
:config_file => './config/flex.yml',
|
50
50
|
:flex_dir => './flex',
|
51
51
|
:http_client => load_http_client,
|
52
52
|
:http_client_options => {},
|
53
|
-
:debug =>
|
53
|
+
:debug => false,
|
54
54
|
:debug_result => true,
|
55
55
|
:debug_to_curl => false,
|
56
56
|
:raise_proc => proc{|response| response.status >= 400}
|
@@ -28,7 +28,8 @@ module Flex
|
|
28
28
|
|
29
29
|
def parent_instance(raise=true)
|
30
30
|
return unless is_child?
|
31
|
-
@parent_instance ||= instance.send(class_flex.parent_association) || raise &&
|
31
|
+
@parent_instance ||= instance.send(class_flex.parent_association) || raise &&
|
32
|
+
raise(MissingParentError, "missing parent instance for document #{instance.inspect}.")
|
32
33
|
end
|
33
34
|
|
34
35
|
# helper that iterates through the parent record chain
|
@@ -81,7 +82,7 @@ module Flex
|
|
81
82
|
|
82
83
|
private
|
83
84
|
|
84
|
-
BASE62_DIGITS =
|
85
|
+
BASE62_DIGITS = ('0'..'9').to_a + ('A'..'Z').to_a + ('a'..'z').to_a
|
85
86
|
|
86
87
|
def create_routing
|
87
88
|
string = [index, type, id].join
|
data/lib/flex/manager.rb
CHANGED
@@ -12,7 +12,7 @@ module Flex
|
|
12
12
|
|
13
13
|
# arrays of all the types
|
14
14
|
def types
|
15
|
-
|
15
|
+
@types ||= Configuration.flex_models.map {|m| (m.is_a?(String) ? eval("::#{m}") : m).flex.type }.flatten
|
16
16
|
end
|
17
17
|
|
18
18
|
# sets the default parent/child mappings and merges with the config_file
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Flex
|
2
|
+
class ProgBar
|
3
|
+
|
4
|
+
attr_reader :pbar
|
5
|
+
|
6
|
+
def initialize(total_count, batch_size=nil, prefix_message=nil)
|
7
|
+
@total_count = total_count
|
8
|
+
@successful_count = 0
|
9
|
+
@failed_count = 0
|
10
|
+
@pbar = ::ProgressBar.new('processing...', total_count)
|
11
|
+
@pbar.clear
|
12
|
+
@pbar.bar_mark = '|'
|
13
|
+
puts '_' * @pbar.send(:get_term_width)
|
14
|
+
message = "#{prefix_message}Processing #{total_count} documents"
|
15
|
+
message << " in batches of #{batch_size}:" unless batch_size.nil?
|
16
|
+
puts message
|
17
|
+
@pbar.send(:show)
|
18
|
+
end
|
19
|
+
|
20
|
+
def process_result(result, inc)
|
21
|
+
Configuration.logger.error "[FLEX] Failed load:\n#{result.failed.to_yaml}" unless result.failed.size == 0
|
22
|
+
@failed_count += result.failed.size
|
23
|
+
@successful_count += result.successful.size
|
24
|
+
@pbar.inc(inc)
|
25
|
+
end
|
26
|
+
|
27
|
+
def finish
|
28
|
+
@pbar.finish
|
29
|
+
puts "Processed #{@total_count}. Successful #{@successful_count}. Skipped #{@total_count - @successful_count - @failed_count}. Failed #{@failed_count}."
|
30
|
+
puts "See the log for the details about the failed import." unless @failed_count == 0
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
data/lib/flex/rails.rb
CHANGED
@@ -2,11 +2,12 @@ require 'flex'
|
|
2
2
|
require 'rails'
|
3
3
|
require 'flex/rails/helper'
|
4
4
|
|
5
|
-
if ::Rails.respond_to?(:version) && ::Rails.version.to_i
|
5
|
+
if ::Rails.respond_to?(:version) && ::Rails.version.to_i >= 3
|
6
6
|
require 'flex/rails/engine'
|
7
7
|
else
|
8
8
|
Flex::Configuration.configure do |c|
|
9
9
|
c.config_file = ::Rails.root.join('config', 'flex.yml').to_s
|
10
10
|
c.flex_dir = ::Rails.root.join('app', 'flex').to_s
|
11
|
+
c.debug = ::Rails.env.development?
|
11
12
|
end
|
12
13
|
end
|
data/lib/flex/rails/engine.rb
CHANGED
@@ -3,11 +3,11 @@ module Flex
|
|
3
3
|
class Engine < ::Rails::Engine
|
4
4
|
|
5
5
|
ActiveSupport.on_load(:before_configuration) do
|
6
|
-
Flex::Configuration
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
config.flex = Flex::Configuration
|
7
|
+
config.flex.variables[:index] = [self.class.name.split('::').first.underscore, ::Rails.env].join('_')
|
8
|
+
config.flex.config_file = ::Rails.root.join('config', 'flex.yml').to_s
|
9
|
+
config.flex.flex_dir = ::Rails.root.join('app', 'flex').to_s
|
10
|
+
config.flex.debug = ::Rails.env.development?
|
11
11
|
end
|
12
12
|
|
13
13
|
ActiveSupport.on_load(:after_initialize) do
|
data/lib/flex/tasks.rb
CHANGED
@@ -16,8 +16,6 @@ module Flex
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def import_models
|
19
|
-
require 'progressbar'
|
20
|
-
|
21
19
|
Configuration.http_client_options[:timeout] = ENV['TIMEOUT'].to_i if ENV['TIMEOUT']
|
22
20
|
Configuration.http_client_options[:timeout] ||= 20
|
23
21
|
Configuration.debug = !!ENV['FLEX_DEBUG']
|
@@ -29,7 +27,7 @@ module Flex
|
|
29
27
|
options[k.to_sym] = v
|
30
28
|
end
|
31
29
|
end
|
32
|
-
deleted
|
30
|
+
deleted = []
|
33
31
|
|
34
32
|
models.each do |klass|
|
35
33
|
index = klass.flex.index
|
@@ -60,37 +58,19 @@ module Flex
|
|
60
58
|
next
|
61
59
|
end
|
62
60
|
|
63
|
-
|
64
|
-
successful_count = 0
|
65
|
-
failed = []
|
66
|
-
|
67
|
-
pbar = ProgressBar.new('processing...', total_count)
|
68
|
-
pbar.clear
|
69
|
-
pbar.bar_mark = '|'
|
70
|
-
puts '_' * pbar.send(:get_term_width)
|
71
|
-
puts "Class #{klass}: indexing #{total_count} documents in batches of #{batch_size}:\n"
|
72
|
-
pbar.send(:show)
|
61
|
+
pbar = ProgBar.new(klass.count, batch_size, "Class #{klass}: ")
|
73
62
|
|
74
63
|
klass.find_in_batches(:batch_size => batch_size) do |array|
|
75
|
-
opts
|
64
|
+
opts = {:index => index}.merge(options)
|
76
65
|
result = Flex.import_collection(array, opts) || next
|
77
|
-
|
78
|
-
failed += f
|
79
|
-
successful_count += result.successful.count
|
80
|
-
pbar.inc(array.size)
|
66
|
+
pbar.process_result(result, array.size)
|
81
67
|
end
|
82
68
|
|
83
69
|
pbar.finish
|
84
|
-
puts "Processed #{total_count}. Successful #{successful_count}. Skipped #{total_count - successful_count - failed.size}. Failed #{failed.size}."
|
85
|
-
|
86
|
-
if failed.size > 0
|
87
|
-
puts 'Failed imports:'
|
88
|
-
puts failed.to_yaml
|
89
|
-
end
|
90
70
|
end
|
91
71
|
end
|
92
72
|
|
93
|
-
|
73
|
+
private
|
94
74
|
|
95
75
|
def indices
|
96
76
|
indices = ENV['INDICES'] || struct.keys
|
@@ -138,4 +118,5 @@ module Flex
|
|
138
118
|
end
|
139
119
|
|
140
120
|
end
|
121
|
+
|
141
122
|
end
|
data/lib/flex/template.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Flex
|
2
|
+
|
2
3
|
# Generic Flex::Template object.
|
3
|
-
# This class represents a generic Flex::Template object.
|
4
|
+
# This class represents a generic Flex::Template object.
|
5
|
+
# It is used as the base class by all the more specific Flex::Template::* classes.
|
4
6
|
# You usually don't need to instantiate this class manually, since it is usually used internally.
|
5
7
|
# For more details about templates, see the documentation.
|
6
8
|
class Template
|
@@ -69,8 +71,9 @@ module Flex
|
|
69
71
|
|
70
72
|
rescue NameError => e
|
71
73
|
if e.name == :request
|
72
|
-
raise MissingHttpClientError,
|
73
|
-
|
74
|
+
raise MissingHttpClientError,
|
75
|
+
'you should install the gem "patron" (recommended for performances) or "rest-client", ' +
|
76
|
+
'or provide your own http-client interface and set Flex::Configuration.http_client'
|
74
77
|
else
|
75
78
|
raise
|
76
79
|
end
|
@@ -142,40 +145,34 @@ module Flex
|
|
142
145
|
merged = @variables.deep_merge sym_vars
|
143
146
|
vars = process_vars(merged)
|
144
147
|
obj = #{stringified}
|
148
|
+
obj = prune(obj)
|
149
|
+
obj[:path].tr_s!('/', '/') # removes empty path segments
|
145
150
|
obj[:vars] = vars
|
146
|
-
obj = prune(obj, vars[:no_pruning])
|
147
151
|
obj
|
148
152
|
end
|
149
153
|
ruby
|
150
154
|
interpolate(*args)
|
151
155
|
end
|
152
156
|
|
153
|
-
# prunes the branch when the leaf is
|
154
|
-
# also removes empty path segments
|
157
|
+
# prunes the branch when the leaf is a PrunableObject
|
155
158
|
# and compact.flatten the Array values
|
156
|
-
def prune(obj
|
159
|
+
def prune(obj)
|
157
160
|
case obj
|
158
161
|
when Array
|
159
|
-
return if obj.
|
162
|
+
return if obj.is_a?(PrunableObject)
|
160
163
|
a = obj.map do |i|
|
161
|
-
next if i.
|
162
|
-
prune(i
|
164
|
+
next if i.is_a?(PrunableObject)
|
165
|
+
prune(i)
|
163
166
|
end.compact.flatten
|
164
167
|
a unless a.empty?
|
165
168
|
when Hash
|
166
|
-
return if obj.
|
169
|
+
return if obj.is_a?(PrunableObject)
|
170
|
+
return obj if obj.empty?
|
167
171
|
h = {}
|
168
172
|
obj.each do |k, v|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
v.gsub(/\/+/, '/')
|
173
|
-
when no_pruning.include?(k)
|
174
|
-
v
|
175
|
-
else
|
176
|
-
prune(v, no_pruning)
|
177
|
-
end
|
178
|
-
h[k] = v unless v.nil?
|
173
|
+
pruned = prune(v)
|
174
|
+
next if pruned.is_a?(PrunableObject)
|
175
|
+
h[k] = pruned
|
179
176
|
end
|
180
177
|
h unless h.empty?
|
181
178
|
else
|
data/lib/flex/template/base.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
module Flex
|
2
2
|
class Template
|
3
|
+
|
4
|
+
module PrunableObject end
|
5
|
+
|
3
6
|
module Base
|
4
7
|
|
5
8
|
def process_vars(vars)
|
@@ -24,6 +27,14 @@ module Flex
|
|
24
27
|
vars
|
25
28
|
end
|
26
29
|
|
30
|
+
# extend obj with PrunableObject if it is nil or it is an empty Array or Hash
|
31
|
+
# called from stringified
|
32
|
+
def prunable(name, vars)
|
33
|
+
obj = vars[name]
|
34
|
+
return obj if vars[:no_pruning].include?(name)
|
35
|
+
(obj.nil? || obj == [] || obj == {}) ? obj.extend(PrunableObject) : obj
|
36
|
+
end
|
37
|
+
|
27
38
|
end
|
28
39
|
end
|
29
40
|
end
|
data/lib/flex/template/info.rb
CHANGED
@@ -10,16 +10,33 @@ module Flex
|
|
10
10
|
block = ''
|
11
11
|
temp = templates[name]
|
12
12
|
meth_call = [host_class, name].join('.')
|
13
|
-
block <<
|
13
|
+
block << <<-meth_call
|
14
|
+
########## #{meth_call} ##########
|
15
|
+
|
16
|
+
#{'-' * temp.class.to_s.length}
|
17
|
+
#{temp.class}
|
18
|
+
#{temp.to_flex(name)}
|
19
|
+
meth_call
|
14
20
|
temp.partials.each do |par_name|
|
15
21
|
par = partials[par_name]
|
16
|
-
block <<
|
22
|
+
block << <<-partial
|
23
|
+
#{'-' * par.class.to_s.length}
|
24
|
+
#{par.class}
|
25
|
+
#{par.to_flex(par_name)}
|
26
|
+
partial
|
17
27
|
end
|
18
28
|
block << "\nUsage:\n"
|
19
29
|
block << usage(meth_call, temp)
|
20
30
|
block << "\n "
|
21
31
|
info << block.split("\n").map{|l| '# ' + l}.join("\n")
|
22
|
-
info <<
|
32
|
+
info << <<-meth
|
33
|
+
|
34
|
+
def #{meth_call}(vars={})
|
35
|
+
## this is a stub, used for reference
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
meth
|
23
40
|
end
|
24
41
|
info
|
25
42
|
end
|
@@ -30,7 +47,8 @@ module Flex
|
|
30
47
|
all_tags = temp.tags + temp.partials
|
31
48
|
lines = all_tags.map do |t|
|
32
49
|
comments = 'partial' if t.to_s.match(/^_/)
|
33
|
-
['', t.to_s] + (temp.variables.has_key?(t) ? ["#{temp.variables[t].inspect},", comments_to_s(comments)]
|
50
|
+
['', t.to_s] + (temp.variables.has_key?(t) ? ["#{temp.variables[t].inspect},", comments_to_s(comments)] \
|
51
|
+
: ["#{t},", comments_to_s(comments, 'required')])
|
34
52
|
end
|
35
53
|
lines.sort! { |a,b| b[3] <=> a[3] }
|
36
54
|
lines.first[0] = meth_call
|
data/lib/flex/template/tags.rb
CHANGED
data/lib/flex/utility_methods.rb
CHANGED
@@ -61,7 +61,7 @@ module Flex
|
|
61
61
|
m['_parent'] = parent if parent
|
62
62
|
routing = get_routing(d)
|
63
63
|
m['_routing'] = routing if routing
|
64
|
-
line = {action => meta.merge(m)}
|
64
|
+
line = MultiJson.encode({action => meta.merge(m)})
|
65
65
|
line << "\n#{json}" unless action == 'delete'
|
66
66
|
line
|
67
67
|
end.compact
|
@@ -94,7 +94,8 @@ module Flex
|
|
94
94
|
case
|
95
95
|
when d.respond_to?(:flex) then d.flex.type
|
96
96
|
when d.respond_to?(:_type) then d._type
|
97
|
-
when d.is_a?(Hash) then d.delete(:_type) || d.delete('_type') ||
|
97
|
+
when d.is_a?(Hash) then d.delete(:_type) || d.delete('_type') ||
|
98
|
+
d.delete(:type) || d.delete('type')
|
98
99
|
when d.respond_to?(:type) then d.type
|
99
100
|
end
|
100
101
|
end
|
@@ -104,7 +105,8 @@ module Flex
|
|
104
105
|
when d.respond_to?(:flex) && d.flex.parent_instance(false) then d.flex.parent_instance.id
|
105
106
|
when d.respond_to?(:_parent) then d._parent
|
106
107
|
when d.respond_to?(:parent) then d.parent
|
107
|
-
when d.is_a?(Hash) then d.delete(:_parent) || d.delete('_parent') ||
|
108
|
+
when d.is_a?(Hash) then d.delete(:_parent) || d.delete('_parent') ||
|
109
|
+
d.delete(:parent) || d.delete('parent')
|
108
110
|
end
|
109
111
|
end
|
110
112
|
|
@@ -113,13 +115,15 @@ module Flex
|
|
113
115
|
when d.respond_to?(:flex) && d.flex.routing(false) then d.flex.routing
|
114
116
|
when d.respond_to?(:_routing) then d._routing
|
115
117
|
when d.respond_to?(:routing) then d.routing
|
116
|
-
when d.is_a?(Hash) then d.delete(:_routing) || d.delete('_routing') ||
|
118
|
+
when d.is_a?(Hash) then d.delete(:_routing) || d.delete('_routing') ||
|
119
|
+
d.delete(:routing) || d.delete('routing')
|
117
120
|
end
|
118
121
|
end
|
119
122
|
|
120
123
|
def get_id(d)
|
121
124
|
case
|
122
|
-
when d.is_a?(Hash) then d.delete(:_id) || d.delete('_id') ||
|
125
|
+
when d.is_a?(Hash) then d.delete(:_id) || d.delete('_id') ||
|
126
|
+
d.delete(:id) || d.delete('id')
|
123
127
|
when d.respond_to?(:id) then d.id
|
124
128
|
end
|
125
129
|
end
|
@@ -128,6 +132,7 @@ module Flex
|
|
128
132
|
case
|
129
133
|
when d.respond_to?(:flex_source) then d.flex_source
|
130
134
|
when d.respond_to?(:to_json) then d.to_json
|
135
|
+
else MultiJson.encode(d)
|
131
136
|
end
|
132
137
|
end
|
133
138
|
|
data/lib/flex/utils.rb
CHANGED
@@ -17,8 +17,8 @@ Flex::Configuration.configure do |config|
|
|
17
17
|
# The custom url of your ElasticSearch server
|
18
18
|
# config.base_uri = 'http://localhost:9200'
|
19
19
|
|
20
|
-
# Set it to
|
21
|
-
# config.debug =
|
20
|
+
# Set it to true to log the debug infos (true by default in development mode)
|
21
|
+
# config.debug = false
|
22
22
|
|
23
23
|
# Debug info are actually valid curl commands
|
24
24
|
# config.debug_to_curl = false
|
data/lib/tasks/index.rake
CHANGED
@@ -8,10 +8,10 @@ namespace :flex do
|
|
8
8
|
desc 'imports from an ActiveRecord or Mongoid models'
|
9
9
|
task(:import => env) { Flex::Tasks.import_models }
|
10
10
|
|
11
|
-
desc '
|
11
|
+
desc 'creates indices from the Flex::Configuration.config_file file'
|
12
12
|
task(:create_indices => env) { Flex::Tasks.create_indices }
|
13
13
|
|
14
|
-
desc '
|
14
|
+
desc 'destroys indices in the Flex::Configuration.config_file file'
|
15
15
|
task(:delete_indices => env) { Flex::Tasks.delete_indices }
|
16
16
|
|
17
17
|
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: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-11-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
16
|
-
requirement: &
|
16
|
+
requirement: &70223266050660 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.3.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70223266050660
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: progressbar
|
27
|
-
requirement: &
|
27
|
+
requirement: &70223266050000 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.11.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70223266050000
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: prompter
|
38
|
-
requirement: &
|
38
|
+
requirement: &70223266049300 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.1.5
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70223266049300
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: irt
|
49
|
-
requirement: &
|
49
|
+
requirement: &70223266048620 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.2.10
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70223266048620
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: patron
|
60
|
-
requirement: &
|
60
|
+
requirement: &70223266048160 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 0.4.18
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70223266048160
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rest-client
|
71
|
-
requirement: &
|
71
|
+
requirement: &70223266047620 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,15 +76,16 @@ dependencies:
|
|
76
76
|
version: 1.6.7
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70223266047620
|
80
80
|
description: ! 'Flex is an innovative ruby client for ElasticSearch. With Flex your
|
81
81
|
code will be clean, easy to write and read, and very short: "poetic-short". Flex
|
82
|
-
is fast and efficient, easy to use and customize, and offers ActiveRecord,
|
82
|
+
is fast and efficient, easy to use and customize, and offers ActiveRecord, Mongoid
|
83
83
|
and Rails integration.
|
84
84
|
|
85
85
|
'
|
86
86
|
email: dd.nexus@gmail.com
|
87
|
-
executables:
|
87
|
+
executables:
|
88
|
+
- flexes
|
88
89
|
extensions: []
|
89
90
|
extra_rdoc_files:
|
90
91
|
- README.md
|
@@ -92,6 +93,7 @@ files:
|
|
92
93
|
- LICENSE
|
93
94
|
- README.md
|
94
95
|
- VERSION
|
96
|
+
- bin/flexes
|
95
97
|
- flex.gemspec
|
96
98
|
- lib/flex.rb
|
97
99
|
- lib/flex/api_methods.yml
|
@@ -111,6 +113,7 @@ files:
|
|
111
113
|
- lib/flex/logger.rb
|
112
114
|
- lib/flex/manager.rb
|
113
115
|
- lib/flex/model.rb
|
116
|
+
- lib/flex/prog_bar.rb
|
114
117
|
- lib/flex/rails.rb
|
115
118
|
- lib/flex/rails/engine.rb
|
116
119
|
- lib/flex/rails/helper.rb
|
@@ -149,7 +152,7 @@ files:
|
|
149
152
|
homepage: http://github.com/ddnexus/flex
|
150
153
|
licenses: []
|
151
154
|
post_install_message: ! "________________________________________________________________________________\n\n
|
152
|
-
\
|
155
|
+
\ FLEX INSTALLATION NOTES\n________________________________________________________________________________\n\nIn
|
153
156
|
order to use Flex, a supported http-client must be installed on this system.\n\nThe
|
154
157
|
suported http-client gems are \"patron\" and \"rest-client\".\n\nYou should install
|
155
158
|
\"patron\" (a libcurl based gem developed in C) for best\nperformances, or install
|