flex 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|