flex 0.4.2 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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/loader.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
module Loader
|
3
|
-
|
4
|
-
extend self
|
5
|
-
attr_accessor :host_classes
|
6
|
-
@host_classes = []
|
7
|
-
|
8
|
-
def self.included(base)
|
9
|
-
base.class_eval do
|
10
|
-
Flex::Loader.host_classes |= [base]
|
11
|
-
@flex ||= ClassProxy::Loader.new(base)
|
12
|
-
def self.flex; @flex end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
data/lib/flex/manager.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
module Manager
|
3
|
-
|
4
|
-
extend self
|
5
|
-
|
6
|
-
attr_accessor :parent_types
|
7
|
-
@parent_types = []
|
8
|
-
|
9
|
-
def init_models
|
10
|
-
Configuration.flex_models.each {|m| eval"::#{m}" if m.is_a?(String) }
|
11
|
-
end
|
12
|
-
|
13
|
-
# arrays of all the types
|
14
|
-
def types
|
15
|
-
@types ||= Configuration.flex_models.map {|m| (m.is_a?(String) ? eval("::#{m}") : m).flex.type }.flatten
|
16
|
-
end
|
17
|
-
|
18
|
-
# sets the default parent/child mappings and merges with the config_file
|
19
|
-
# returns the indices structure used for creating the indices
|
20
|
-
def indices(file=Configuration.config_file)
|
21
|
-
@indices ||= ( default = {}.extend Structure::Mergeable
|
22
|
-
Configuration.flex_models.each do |m|
|
23
|
-
m = eval"::#{m}" if m.is_a?(String)
|
24
|
-
next unless m.flex.is_child?
|
25
|
-
index = m.flex.index
|
26
|
-
m.flex.parent_child_map.each do |parent, child|
|
27
|
-
default.add index => {'mappings' => {child => {'_parent' => {'type' => parent }}}}
|
28
|
-
end
|
29
|
-
end
|
30
|
-
hash = YAML.load(Utils.erb_process(file))
|
31
|
-
hash.delete('ANCHORS')
|
32
|
-
default.deep_merge(hash) )
|
33
|
-
end
|
34
|
-
|
35
|
-
# maps all the index/types to the ruby class
|
36
|
-
def type_class_map
|
37
|
-
@type_class_map ||= ( map = {}
|
38
|
-
Configuration.flex_models.each do |m|
|
39
|
-
m = eval("::#{m}") if m.is_a?(String)
|
40
|
-
types = m.flex.type.is_a?(Array) ? m.flex.type : [m.flex.type]
|
41
|
-
types.each do |t|
|
42
|
-
map["#{m.flex.index}/#{t}"] = m
|
43
|
-
end
|
44
|
-
end
|
45
|
-
map )
|
46
|
-
end
|
47
|
-
|
48
|
-
def class_name_to_type(class_name)
|
49
|
-
type = class_name.tr(':', '_')
|
50
|
-
type.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
51
|
-
type.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
52
|
-
type.downcase!
|
53
|
-
type
|
54
|
-
end
|
55
|
-
|
56
|
-
def type_to_class_name(type)
|
57
|
-
type.gsub(/__(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
data/lib/flex/model.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
module Model
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
base.class_eval do
|
6
|
-
@flex ||= ClassProxy::Model.new(base)
|
7
|
-
def self.flex; @flex end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def flex
|
12
|
-
@flex ||= InstanceProxy::Model.new(self)
|
13
|
-
end
|
14
|
-
|
15
|
-
def flex_source
|
16
|
-
to_hash.reject {|k| k.to_s =~ /^_*id$/}.to_json
|
17
|
-
end
|
18
|
-
|
19
|
-
def flex_indexable?
|
20
|
-
true
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
data/lib/flex/rails/engine.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
module Rails
|
3
|
-
class Engine < ::Rails::Engine
|
4
|
-
|
5
|
-
ActiveSupport.on_load(:before_configuration) do
|
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
|
-
end
|
12
|
-
|
13
|
-
ActiveSupport.on_load(:after_initialize) do
|
14
|
-
Helper.after_initialize
|
15
|
-
end
|
16
|
-
|
17
|
-
config.to_prepare do
|
18
|
-
Flex.reload!
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/flex/rails/helper.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
module Rails
|
3
|
-
module Helper
|
4
|
-
extend self
|
5
|
-
|
6
|
-
def after_initialize
|
7
|
-
# use the same app logger
|
8
|
-
Flex::Configuration.logger = ::Rails.logger
|
9
|
-
# we need to reload the flex API methods with the new variables
|
10
|
-
Flex.reload!
|
11
|
-
Flex::Manager.init_models
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
data/lib/flex/related_model.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
module RelatedModel
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
base.class_eval do
|
6
|
-
@flex ||= ClassProxy::RelatedModel.new(base)
|
7
|
-
def self.flex; @flex end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def flex
|
12
|
-
@flex ||= InstanceProxy::RelatedModel.new(self)
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
class Result
|
3
|
-
|
4
|
-
# adds sugar to documents with the following structure:
|
5
|
-
#
|
6
|
-
# {
|
7
|
-
# "_index" : "twitter",
|
8
|
-
# "_type" : "tweet",
|
9
|
-
# "_id" : "1",
|
10
|
-
# "_source" : {
|
11
|
-
# "user" : "kimchy",
|
12
|
-
# "postDate" : "2009-11-15T14:12:12",
|
13
|
-
# "message" : "trying out Elastic Search"
|
14
|
-
# }
|
15
|
-
# }
|
16
|
-
|
17
|
-
module SourceDocument
|
18
|
-
|
19
|
-
# extend if result has a structure like a document
|
20
|
-
def self.should_extend?(obj)
|
21
|
-
%w[_index _type _id _source].all? {|k| obj.has_key?(k)}
|
22
|
-
end
|
23
|
-
|
24
|
-
# exposes _source: automatically supply object-like reader access
|
25
|
-
# also expose meta fields like _id, _source, etc, also for methods without the leading '_'
|
26
|
-
def method_missing(meth, *args, &block)
|
27
|
-
case
|
28
|
-
when meth.to_s =~ /^_/ && has_key?(meth.to_s) then self[meth.to_s]
|
29
|
-
when self['_source'].has_key?(meth.to_s) then self['_source'][meth.to_s]
|
30
|
-
when has_key?("_#{meth.to_s}") then self["_#{meth.to_s}"]
|
31
|
-
else super
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# returns the _source hash with an added id (if missing))
|
36
|
-
def to_attributes
|
37
|
-
{'id' => _id}.merge(_source)
|
38
|
-
end
|
39
|
-
|
40
|
-
# creates an instance of a mapped or computed class, falling back to OpenStruct
|
41
|
-
def to_mapped
|
42
|
-
to(mapped_class || OpenStruct)
|
43
|
-
end
|
44
|
-
|
45
|
-
# experimental: creates an instance of klass out of to_attributes
|
46
|
-
# we should probably reset the id to the original document _id
|
47
|
-
# but be sure the record is read-only
|
48
|
-
def to(klass)
|
49
|
-
obj = klass.new(to_attributes)
|
50
|
-
case
|
51
|
-
when defined?(ActiveRecord::Base) && obj.is_a?(ActiveRecord::Base)
|
52
|
-
obj.readonly!
|
53
|
-
when defined?(Mongoid::Document) && obj.is_a?(Mongoid::Document)
|
54
|
-
# TODO: make it readonly
|
55
|
-
when obj.is_a?(OpenStruct)
|
56
|
-
# TODO: anythig to extend?
|
57
|
-
end
|
58
|
-
obj
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
class Result
|
3
|
-
module SourceSearch
|
4
|
-
|
5
|
-
# extend if result comes from a search url and does not contain an empty fields param (no _source))
|
6
|
-
def self.should_extend?(result)
|
7
|
-
result.response.url =~ /\b_m?search\b/ &&
|
8
|
-
!result['hits']['hits'].empty? && result['hits']['hits'].first.has_key?('_source')
|
9
|
-
end
|
10
|
-
|
11
|
-
# extend the hits results on extended
|
12
|
-
def self.extended(result)
|
13
|
-
result['hits']['hits'].each { |h| h.extend(SourceDocument) }
|
14
|
-
end
|
15
|
-
|
16
|
-
# experimental
|
17
|
-
# returns an array of document mapped objects
|
18
|
-
def mapped_collection
|
19
|
-
@mapped_collection ||= begin
|
20
|
-
docs = self['hits']['hits'].map do |h|
|
21
|
-
raise NameError, "no '_source' found in hit #{h.inspect} " \
|
22
|
-
unless h.respond_to(:to_mapped)
|
23
|
-
h.to_mapped
|
24
|
-
end
|
25
|
-
docs.extend Collection
|
26
|
-
docs.setup(self['hits']['total'], variables)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
module Structure
|
3
|
-
# allows to use both Symbol or String keys to access the same values in a Hash
|
4
|
-
module IndifferentAccess
|
5
|
-
|
6
|
-
def [](k)
|
7
|
-
get_value(k)
|
8
|
-
end
|
9
|
-
|
10
|
-
def []=(k,v)
|
11
|
-
# default to_s for storing new keys
|
12
|
-
has_key?(k) ? super : super(k.to_s, v)
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_hash
|
16
|
-
self
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def get_value(k)
|
22
|
-
val = fetch_val(k)
|
23
|
-
case val
|
24
|
-
when Hash
|
25
|
-
val.extend IndifferentAccess
|
26
|
-
when Array
|
27
|
-
val.each {|v| v.extend IndifferentAccess if v.is_a?(Hash)}
|
28
|
-
end
|
29
|
-
val
|
30
|
-
end
|
31
|
-
|
32
|
-
def fetch_val(k)
|
33
|
-
v = fetch(k, nil)
|
34
|
-
return v unless v.nil?
|
35
|
-
if k.is_a?(String)
|
36
|
-
v = fetch(k.to_sym, nil)
|
37
|
-
return v unless v.nil?
|
38
|
-
end
|
39
|
-
fetch(k.to_s, nil) if k.is_a?(Symbol)
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
module Structure
|
3
|
-
# allows deep merge between Hashes
|
4
|
-
module Mergeable
|
5
|
-
|
6
|
-
def deep_merge(*hashes)
|
7
|
-
Utils.deep_merge_hashes(self, *hashes)
|
8
|
-
end
|
9
|
-
|
10
|
-
def deep_merge!(*hashes)
|
11
|
-
replace deep_merge(*hashes)
|
12
|
-
end
|
13
|
-
alias_method :add, :deep_merge!
|
14
|
-
|
15
|
-
def deep_dup
|
16
|
-
Marshal.load(Marshal.dump(self))
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/flex/template/base.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
class Template
|
3
|
-
|
4
|
-
module PrunableObject end
|
5
|
-
|
6
|
-
module Base
|
7
|
-
|
8
|
-
def process_vars(vars)
|
9
|
-
missing = @tags - vars.keys
|
10
|
-
raise ArgumentError, "required variables #{missing.inspect} missing." \
|
11
|
-
unless missing.empty?
|
12
|
-
@partials.each do |k|
|
13
|
-
raise MissingPartialError, "undefined #{k} partial template" \
|
14
|
-
unless @host_flex.partials.has_key?(k)
|
15
|
-
next if vars[k].nil?
|
16
|
-
vars[k] = [vars[k]] unless vars[k].is_a?(Array)
|
17
|
-
vars[k] = vars[k].map {|v| @host_flex.partials[k].interpolate(@variables.deep_dup, v)}
|
18
|
-
end
|
19
|
-
vars[:index] = vars[:index].join(',') if vars[:index].is_a?(Array)
|
20
|
-
vars[:type] = vars[:type].join(',') if vars[:type].is_a?(Array)
|
21
|
-
if vars[:page]
|
22
|
-
vars[:params] ||= {}
|
23
|
-
vars[:params][:size] ||= vars[:size] || 10
|
24
|
-
page = vars[:page].to_i
|
25
|
-
page = 1 unless page > 0
|
26
|
-
vars[:params][:from] = ((page - 1) * vars[:params][:size]).ceil
|
27
|
-
end
|
28
|
-
vars
|
29
|
-
end
|
30
|
-
|
31
|
-
# extend obj with PrunableObject if it is nil or it is an empty Array or Hash
|
32
|
-
# called from stringified
|
33
|
-
def prunable(name, vars)
|
34
|
-
obj = vars[name]
|
35
|
-
return obj if vars[:no_pruning].include?(name)
|
36
|
-
(obj.nil? || obj == [] || obj == {}) ? obj.extend(PrunableObject) : obj
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/lib/flex/template/info.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
class Template
|
3
|
-
module Info
|
4
|
-
|
5
|
-
def info(*names)
|
6
|
-
names = templates.keys if names.empty?
|
7
|
-
info = "\n"
|
8
|
-
names.each do |name|
|
9
|
-
next unless templates.include?(name)
|
10
|
-
block = ''
|
11
|
-
temp = templates[name]
|
12
|
-
meth_call = [host_class, name].join('.')
|
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
|
20
|
-
temp.partials.each do |par_name|
|
21
|
-
par = partials[par_name]
|
22
|
-
block << <<-partial
|
23
|
-
#{'-' * par.class.to_s.length}
|
24
|
-
#{par.class}
|
25
|
-
#{par.to_flex(par_name)}
|
26
|
-
partial
|
27
|
-
end
|
28
|
-
block << "\nUsage:\n"
|
29
|
-
block << usage(meth_call, temp)
|
30
|
-
block << "\n "
|
31
|
-
info << block.split("\n").map{|l| '# ' + l}.join("\n")
|
32
|
-
info << <<-meth
|
33
|
-
|
34
|
-
def #{meth_call}(vars={})
|
35
|
-
## this is a stub, used for reference
|
36
|
-
end
|
37
|
-
|
38
|
-
|
39
|
-
meth
|
40
|
-
end
|
41
|
-
info
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def usage(meth_call, temp)
|
47
|
-
all_tags = temp.tags + temp.partials
|
48
|
-
lines = all_tags.map do |t|
|
49
|
-
comments = 'partial' if t.to_s.match(/^_/)
|
50
|
-
['', t.to_s] + (temp.variables.has_key?(t) ? ["#{temp.variables[t].inspect},", comments_to_s(comments)] \
|
51
|
-
: ["#{t},", comments_to_s(comments, 'required')])
|
52
|
-
end
|
53
|
-
lines.sort! { |a,b| b[3] <=> a[3] }
|
54
|
-
lines.first[0] = meth_call
|
55
|
-
lines.last[2].chop!
|
56
|
-
max = lines.transpose.map { |c| c.map(&:length).max }
|
57
|
-
lines.map { |line| "%-#{max[0]}s :%-#{max[1]}s => %-#{max[2]}s %s" % line }.join("\n")
|
58
|
-
end
|
59
|
-
|
60
|
-
def comments_to_s(*comments)
|
61
|
-
comments = comments.compact
|
62
|
-
return '' if comments == []
|
63
|
-
"# #{comments.join(' ')}"
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|