flex 0.2.1 → 0.3.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/VERSION +1 -1
- data/lib/flex.rb +1 -1
- data/lib/flex/api_methods.yml +2 -2
- data/lib/flex/class_proxy/loader.rb +1 -1
- data/lib/flex/class_proxy/model.rb +2 -2
- data/lib/flex/http_clients/patron.rb +2 -2
- data/lib/flex/http_clients/rest_client.rb +3 -3
- data/lib/flex/instance_proxy/model.rb +1 -1
- data/lib/flex/manager.rb +61 -0
- data/lib/flex/rails/helper.rb +1 -1
- data/lib/flex/result/document.rb +1 -1
- data/lib/flex/tasks.rb +4 -4
- data/lib/flex/utility_methods.rb +0 -5
- data/lib/generators/flex/setup/setup_generator.rb +2 -5
- data/lib/tasks/index.rake +0 -6
- data/test/flex.irt +1 -1
- metadata +16 -46
- data/lib/flex/model_manager.rb +0 -65
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/flex.rb
CHANGED
data/lib/flex/api_methods.yml
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# These methods are available as Flex.<method>
|
1
|
+
# These methods are available as Flex.<method>(variable_hash)
|
2
2
|
# you can get the updated full reference and usage example of these methods
|
3
3
|
# by just doing in the console:
|
4
4
|
# >> puts Flex.info
|
@@ -87,7 +87,7 @@ store: &store
|
|
87
87
|
# alias for symmetry with post_store
|
88
88
|
put_store: *store
|
89
89
|
|
90
|
-
# id is
|
90
|
+
# id is assigned by ES; you must pass :data
|
91
91
|
post_store:
|
92
92
|
- POST
|
93
93
|
- /<<index>>/<<type>>
|
@@ -16,7 +16,7 @@ module Flex
|
|
16
16
|
def load_source_for(klass, source, source_vars)
|
17
17
|
if source.nil? || source != /\n/
|
18
18
|
paths = [ "#{Configuration.flex_dir}/#{source}.yml",
|
19
|
-
"#{Configuration.flex_dir}/#{
|
19
|
+
"#{Configuration.flex_dir}/#{Manager.class_name_to_type(host_class.name)}.yml",
|
20
20
|
source.to_s ]
|
21
21
|
source = paths.find {|p| File.exist?(p)}
|
22
22
|
end
|
@@ -9,7 +9,7 @@ module Flex
|
|
9
9
|
def initialize(base)
|
10
10
|
super
|
11
11
|
variables.add :index => Configuration.variables[:index],
|
12
|
-
:type =>
|
12
|
+
:type => Manager.class_name_to_type(host_class.name)
|
13
13
|
end
|
14
14
|
|
15
15
|
def index
|
@@ -30,7 +30,7 @@ module Flex
|
|
30
30
|
|
31
31
|
def parent(parent_association, map)
|
32
32
|
@parent_association = parent_association
|
33
|
-
|
33
|
+
Manager.parent_types |= map.keys.map(&:to_s)
|
34
34
|
self.type = map.values.map(&:to_s)
|
35
35
|
@parent_child_map = map
|
36
36
|
@is_child = true
|
@@ -3,8 +3,8 @@ module Flex
|
|
3
3
|
module Patron
|
4
4
|
extend self
|
5
5
|
|
6
|
-
def request(method, path, data=nil
|
7
|
-
options =
|
6
|
+
def request(method, path, data=nil)
|
7
|
+
options = Configuration.http_client_options
|
8
8
|
options = options.merge(:data => data) if data
|
9
9
|
session.request method.to_s.downcase.to_sym, path, {}, options
|
10
10
|
rescue ::Patron::TimeoutError
|
@@ -3,9 +3,9 @@ module Flex
|
|
3
3
|
module RestClient
|
4
4
|
extend self
|
5
5
|
|
6
|
-
def request(method, path, data=nil
|
7
|
-
options = Configuration.http_client_options
|
8
|
-
url = Configuration.base_uri
|
6
|
+
def request(method, path, data=nil)
|
7
|
+
options = Configuration.http_client_options
|
8
|
+
url = Configuration.base_uri.join(path)
|
9
9
|
args = options.merge( :method => method.to_s.downcase.to_sym,
|
10
10
|
:url => url,
|
11
11
|
:payload => data )
|
data/lib/flex/manager.rb
ADDED
@@ -0,0 +1,61 @@
|
|
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
|
+
type_class_map.keys.map{|k| k.split('/').last}
|
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/rails/helper.rb
CHANGED
data/lib/flex/result/document.rb
CHANGED
@@ -23,7 +23,7 @@ module Flex
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def mapped_class(should_raise=false)
|
26
|
-
@mapped_class ||=
|
26
|
+
@mapped_class ||= Manager.type_class_map["#{_index}/#{_type}"]
|
27
27
|
rescue NameError
|
28
28
|
raise DocumentMappingError, "the '#{_index}/#{_type}' document cannot be mapped to any class." \
|
29
29
|
if should_raise
|
data/lib/flex/tasks.rb
CHANGED
@@ -93,7 +93,7 @@ module Flex
|
|
93
93
|
private
|
94
94
|
|
95
95
|
def indices
|
96
|
-
indices = ENV['
|
96
|
+
indices = ENV['INDICES'] || struct.keys
|
97
97
|
indices = eval(indices) if indices.is_a?(String)
|
98
98
|
indices = [indices] unless indices.is_a?(Array)
|
99
99
|
indices
|
@@ -110,15 +110,15 @@ module Flex
|
|
110
110
|
'Please, use CONFIG_FILE=/path/to/index.yml ' +
|
111
111
|
'or set the Flex::Configuration.config_file properly' \
|
112
112
|
unless File.exist?(@indices_yaml)
|
113
|
-
|
113
|
+
Manager.indices(@indices_yaml)
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
117
|
|
118
118
|
def models
|
119
119
|
@models ||= begin
|
120
|
-
mods = ENV['
|
121
|
-
raise AgrumentError, 'no class defined. Please use
|
120
|
+
mods = ENV['MODELS'] || Flex::Configuration.flex_models
|
121
|
+
raise AgrumentError, 'no class defined. Please use MODELS=[ClassA,ClassB]' +
|
122
122
|
'or set the Flex::Configuration.flex_models properly' \
|
123
123
|
if mods.nil? || mods.empty?
|
124
124
|
mods = eval(mods) if mods.is_a?(String)
|
data/lib/flex/utility_methods.rb
CHANGED
@@ -1,11 +1,6 @@
|
|
1
1
|
module Flex
|
2
2
|
module UtilityMethods
|
3
3
|
|
4
|
-
def configuration
|
5
|
-
Configuration
|
6
|
-
end
|
7
|
-
alias_method :config, :configuration
|
8
|
-
|
9
4
|
# Anonymous search query: please, consider to use named templates for better performances and programming style
|
10
5
|
# data can be a JSON string that will be passed as is, or a YAML string (that will be converted into a ruby hash)
|
11
6
|
# or a hash. It can contain interpolation tags as usual.
|
@@ -2,9 +2,6 @@ require 'prompter'
|
|
2
2
|
|
3
3
|
class Flex::SetupGenerator < Rails::Generators::Base
|
4
4
|
|
5
|
-
# more funny than vanilla thor
|
6
|
-
include Prompter::Methods
|
7
|
-
|
8
5
|
source_root File.expand_path('../templates', __FILE__)
|
9
6
|
|
10
7
|
def self.banner
|
@@ -12,8 +9,8 @@ class Flex::SetupGenerator < Rails::Generators::Base
|
|
12
9
|
end
|
13
10
|
|
14
11
|
def ask_base_name
|
15
|
-
@class_name = ask('Please, enter a class name for your Search class. Choose a name not defined in your app.',
|
16
|
-
|
12
|
+
@class_name = Prompter.ask('Please, enter a class name for your Search class. Choose a name not defined in your app.',
|
13
|
+
:default => 'FlexSearch', :hint => '[<enter>=FlexSearch]')
|
17
14
|
@extender_name = "#{@class_name}Extender"
|
18
15
|
end
|
19
16
|
|
data/lib/tasks/index.rake
CHANGED
@@ -9,15 +9,9 @@ namespace :flex do
|
|
9
9
|
task(:import => env) { Flex::Tasks.import_models }
|
10
10
|
|
11
11
|
desc 'create indices from the Flex::Configuration.config_file file'
|
12
|
-
task(:create_index => env) { Flex::Tasks.create_indices }
|
13
|
-
|
14
|
-
desc 'alias for flex:create_index'
|
15
12
|
task(:create_indices => env) { Flex::Tasks.create_indices }
|
16
13
|
|
17
14
|
desc 'destroy indices in the Flex::Configuration.config_file file'
|
18
|
-
task(:delete_index => env) { Flex::Tasks.delete_indices }
|
19
|
-
|
20
|
-
desc 'alias for flex:delete_index'
|
21
15
|
task(:delete_indices => env) { Flex::Tasks.delete_indices }
|
22
16
|
|
23
17
|
end
|
data/test/flex.irt
CHANGED
@@ -7,7 +7,7 @@ methods = [ # api methods from yaml
|
|
7
7
|
:indices_exists, :create_index, :put_index, :post_index, :get_settings, :put_mapping, :get_mapping, :delete_mapping,
|
8
8
|
:delete_index, :delete_by_query, :bulk, :count, :stats, :store, :put_store, :post_store, :remove, :get, :multi_get,
|
9
9
|
# utility_methods
|
10
|
-
:
|
10
|
+
:search, :slim_search, :HEAD, :GET, :PUT, :POST, :DELETE, :json2yaml, :yaml2json,
|
11
11
|
:process_bulk, :import_collection, :delete_collection,
|
12
12
|
# other methods
|
13
13
|
:exist? ]
|
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.3.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-08-
|
12
|
+
date: 2012-08-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70336369278160 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,15 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.3.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 1.3.4
|
24
|
+
version_requirements: *70336369278160
|
30
25
|
- !ruby/object:Gem::Dependency
|
31
26
|
name: progressbar
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
27
|
+
requirement: &70336369277440 !ruby/object:Gem::Requirement
|
33
28
|
none: false
|
34
29
|
requirements:
|
35
30
|
- - ~>
|
@@ -37,15 +32,10 @@ dependencies:
|
|
37
32
|
version: 0.11.0
|
38
33
|
type: :runtime
|
39
34
|
prerelease: false
|
40
|
-
version_requirements:
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 0.11.0
|
35
|
+
version_requirements: *70336369277440
|
46
36
|
- !ruby/object:Gem::Dependency
|
47
37
|
name: prompter
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirement: &70336369276780 !ruby/object:Gem::Requirement
|
49
39
|
none: false
|
50
40
|
requirements:
|
51
41
|
- - ~>
|
@@ -53,15 +43,10 @@ dependencies:
|
|
53
43
|
version: 0.1.5
|
54
44
|
type: :runtime
|
55
45
|
prerelease: false
|
56
|
-
version_requirements:
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 0.1.5
|
46
|
+
version_requirements: *70336369276780
|
62
47
|
- !ruby/object:Gem::Dependency
|
63
48
|
name: irt
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
+
requirement: &70336369276080 !ruby/object:Gem::Requirement
|
65
50
|
none: false
|
66
51
|
requirements:
|
67
52
|
- - ~>
|
@@ -69,15 +54,10 @@ dependencies:
|
|
69
54
|
version: 1.2.10
|
70
55
|
type: :development
|
71
56
|
prerelease: false
|
72
|
-
version_requirements:
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ~>
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: 1.2.10
|
57
|
+
version_requirements: *70336369276080
|
78
58
|
- !ruby/object:Gem::Dependency
|
79
59
|
name: patron
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirement: &70336369275480 !ruby/object:Gem::Requirement
|
81
61
|
none: false
|
82
62
|
requirements:
|
83
63
|
- - ~>
|
@@ -85,15 +65,10 @@ dependencies:
|
|
85
65
|
version: 0.4.18
|
86
66
|
type: :development
|
87
67
|
prerelease: false
|
88
|
-
version_requirements:
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - ~>
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: 0.4.18
|
68
|
+
version_requirements: *70336369275480
|
94
69
|
- !ruby/object:Gem::Dependency
|
95
70
|
name: rest-client
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirement: &70336369275020 !ruby/object:Gem::Requirement
|
97
72
|
none: false
|
98
73
|
requirements:
|
99
74
|
- - ~>
|
@@ -101,12 +76,7 @@ dependencies:
|
|
101
76
|
version: 1.6.7
|
102
77
|
type: :development
|
103
78
|
prerelease: false
|
104
|
-
version_requirements:
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ~>
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: 1.6.7
|
79
|
+
version_requirements: *70336369275020
|
110
80
|
description: ! 'Flex is an innovative ruby client for ElasticSearch. With Flex your
|
111
81
|
code will be clean, easy to write and read, and very short: "poetic-short". Flex
|
112
82
|
is fast and efficient, easy to use and customize, and offers ActiveRecord, MongoId
|
@@ -139,8 +109,8 @@ files:
|
|
139
109
|
- lib/flex/instance_proxy/related_model.rb
|
140
110
|
- lib/flex/loader.rb
|
141
111
|
- lib/flex/logger.rb
|
112
|
+
- lib/flex/manager.rb
|
142
113
|
- lib/flex/model.rb
|
143
|
-
- lib/flex/model_manager.rb
|
144
114
|
- lib/flex/rails.rb
|
145
115
|
- lib/flex/rails/engine.rb
|
146
116
|
- lib/flex/rails/helper.rb
|
@@ -204,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
204
174
|
version: 1.3.6
|
205
175
|
requirements: []
|
206
176
|
rubyforge_project:
|
207
|
-
rubygems_version: 1.8.
|
177
|
+
rubygems_version: 1.8.10
|
208
178
|
signing_key:
|
209
179
|
specification_version: 3
|
210
180
|
summary: Ruby Client for ElasticSearch
|
data/lib/flex/model_manager.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
module Flex
|
2
|
-
module ModelManager
|
3
|
-
|
4
|
-
extend self
|
5
|
-
|
6
|
-
attr_accessor :parent_types
|
7
|
-
@parent_types = []
|
8
|
-
|
9
|
-
def init
|
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
|
-
type_class_map.keys.map{|k| k.split('/').last}
|
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 ||= begin
|
22
|
-
default = {}.extend Structure::Mergeable
|
23
|
-
Configuration.flex_models.each do |m|
|
24
|
-
m = eval"::#{m}" if m.is_a?(String)
|
25
|
-
next unless m.flex.is_child?
|
26
|
-
index = m.flex.index
|
27
|
-
m.flex.parent_child_map.each do |parent, child|
|
28
|
-
default.add index => {'mappings' => {child => {'_parent' => {'type' => parent }}}}
|
29
|
-
end
|
30
|
-
end
|
31
|
-
hash = YAML.load(Utils.erb_process(file))
|
32
|
-
hash.delete('ANCHORS')
|
33
|
-
default.deep_merge(hash)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# maps all the index/types to the ruby class
|
38
|
-
def type_class_map
|
39
|
-
@type_class_map ||= begin
|
40
|
-
map = {}
|
41
|
-
Configuration.flex_models.each do |m|
|
42
|
-
m = eval("::#{m}") if m.is_a?(String)
|
43
|
-
types = m.flex.type.is_a?(Array) ? m.flex.type : [m.flex.type]
|
44
|
-
types.each do |t|
|
45
|
-
map["#{m.flex.index}/#{t}"] = m
|
46
|
-
end
|
47
|
-
end
|
48
|
-
map
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def class_name_to_type(class_name)
|
53
|
-
type = class_name.tr(':', '_')
|
54
|
-
type.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
55
|
-
type.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
56
|
-
type.downcase!
|
57
|
-
type
|
58
|
-
end
|
59
|
-
|
60
|
-
def type_to_class_name(type)
|
61
|
-
type.gsub(/__(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|