flex 0.4.2 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/LICENSE +1 -1
  2. data/README.md +46 -7
  3. data/VERSION +1 -1
  4. data/flex.gemspec +13 -19
  5. data/lib/flex.rb +66 -392
  6. data/lib/flex/api_stubs.rb +1268 -0
  7. data/lib/flex/api_templates/cluster_api.yml +94 -0
  8. data/lib/flex/api_templates/core_api.yml +202 -0
  9. data/lib/flex/api_templates/indices_api.yml +304 -0
  10. data/lib/flex/class_proxy/base.rb +20 -6
  11. data/lib/flex/class_proxy/templates.rb +97 -0
  12. data/lib/flex/class_proxy/templates/doc.rb +91 -0
  13. data/lib/flex/class_proxy/templates/search.rb +72 -0
  14. data/lib/flex/configuration.rb +17 -49
  15. data/lib/flex/deprecation.rb +153 -0
  16. data/lib/flex/errors.rb +2 -1
  17. data/lib/flex/http_clients/base.rb +15 -0
  18. data/lib/flex/http_clients/loader.rb +51 -0
  19. data/lib/flex/http_clients/patron.rb +9 -7
  20. data/lib/flex/http_clients/rest_client.rb +6 -8
  21. data/lib/flex/logger.rb +24 -3
  22. data/lib/flex/prog_bar.rb +11 -6
  23. data/lib/flex/rails.rb +1 -13
  24. data/lib/flex/result.rb +8 -2
  25. data/lib/flex/result/document.rb +42 -13
  26. data/lib/flex/result/multi_get.rb +24 -0
  27. data/lib/flex/result/search.rb +1 -24
  28. data/lib/flex/struct/array.rb +25 -0
  29. data/lib/flex/struct/hash.rb +105 -0
  30. data/lib/flex/{result/collection.rb → struct/paginable.rb} +16 -9
  31. data/lib/flex/struct/prunable.rb +60 -0
  32. data/lib/flex/struct/symbolize.rb +27 -0
  33. data/lib/flex/tasks.rb +26 -86
  34. data/lib/flex/template.rb +60 -120
  35. data/lib/flex/template/common.rb +42 -0
  36. data/lib/flex/template/logger.rb +66 -0
  37. data/lib/flex/template/partial.rb +12 -15
  38. data/lib/flex/template/search.rb +6 -6
  39. data/lib/flex/template/slim_search.rb +1 -1
  40. data/lib/flex/template/tags.rb +19 -9
  41. data/lib/flex/templates.rb +20 -0
  42. data/lib/flex/utility_methods.rb +80 -89
  43. data/lib/flex/utils.rb +68 -25
  44. data/lib/flex/variables.rb +55 -4
  45. data/lib/tasks.rake +28 -0
  46. metadata +61 -85
  47. data/bin/flexes +0 -174
  48. data/lib/flex/api_methods.yml +0 -108
  49. data/lib/flex/class_proxy/loader.rb +0 -102
  50. data/lib/flex/class_proxy/model.rb +0 -45
  51. data/lib/flex/class_proxy/model_sync.rb +0 -23
  52. data/lib/flex/class_proxy/related_model.rb +0 -23
  53. data/lib/flex/instance_proxy/base.rb +0 -29
  54. data/lib/flex/instance_proxy/model.rb +0 -102
  55. data/lib/flex/instance_proxy/related_model.rb +0 -7
  56. data/lib/flex/loader.rb +0 -18
  57. data/lib/flex/manager.rb +0 -61
  58. data/lib/flex/model.rb +0 -24
  59. data/lib/flex/rails/engine.rb +0 -23
  60. data/lib/flex/rails/helper.rb +0 -16
  61. data/lib/flex/related_model.rb +0 -16
  62. data/lib/flex/result/indifferent_access.rb +0 -11
  63. data/lib/flex/result/source_document.rb +0 -63
  64. data/lib/flex/result/source_search.rb +0 -32
  65. data/lib/flex/structure/indifferent_access.rb +0 -44
  66. data/lib/flex/structure/mergeable.rb +0 -21
  67. data/lib/flex/template/base.rb +0 -41
  68. data/lib/flex/template/info.rb +0 -68
  69. data/lib/generators/flex/setup/setup_generator.rb +0 -48
  70. data/lib/generators/flex/setup/templates/flex_config.yml +0 -16
  71. data/lib/generators/flex/setup/templates/flex_dir/es.rb.erb +0 -18
  72. data/lib/generators/flex/setup/templates/flex_dir/es.yml.erb +0 -19
  73. data/lib/generators/flex/setup/templates/flex_dir/es_extender.rb.erb +0 -17
  74. data/lib/generators/flex/setup/templates/flex_initializer.rb.erb +0 -44
  75. data/lib/tasks/index.rake +0 -17
  76. data/test/flex.irt +0 -143
  77. data/test/flex/configuration.irt +0 -53
  78. data/test/irt_helper.rb +0 -12
@@ -1,48 +0,0 @@
1
- require 'prompter'
2
-
3
- class Flex::SetupGenerator < Rails::Generators::Base
4
-
5
- source_root File.expand_path('../templates', __FILE__)
6
-
7
- def self.banner
8
- "rails generate flex:setup"
9
- end
10
-
11
- def ask_base_name
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]')
14
- @extender_name = "#{@class_name}Extender"
15
- end
16
-
17
- def add_config_flex_file
18
- template 'flex_config.yml', Rails.root.join('config', 'flex.yml')
19
- end
20
-
21
- def create_initializer_file
22
- template 'flex_initializer.rb.erb', Rails.root.join('config', 'initializers', 'flex.rb')
23
- end
24
-
25
- def create_flex_dir
26
- template 'flex_dir/es.rb.erb', Rails.root.join('app', 'flex', "#{@class_name.underscore}.rb")
27
- template 'flex_dir/es.yml.erb', Rails.root.join('app', 'flex', "#{@class_name.underscore}.yml")
28
- template 'flex_dir/es_extender.rb.erb', Rails.root.join('app', 'flex', "#{@extender_name.underscore}.rb")
29
- end
30
-
31
-
32
- def show_setup_message
33
- say <<-text, :style => :green
34
-
35
- Setup done!
36
-
37
- During prototyping, remember also:
38
-
39
- 1. each time you add a `Flex::Model` you should add its name to the "config/initializers/flex.rb"
40
- 2. each time you add/change a flex.parent relation you should reindex your DB(s) with rake `flex:import FORCE=true`
41
-
42
- The complete documentation is available at https://github.com/ddnexus/flex/wiki
43
- If you have any problem with Flex, please report the issue at https://github.com/ddnexus/flex/issues.
44
- text
45
- end
46
-
47
- end
48
-
@@ -1,16 +0,0 @@
1
- # ANCHORS litheral key: it will not be used as template
2
- # you can store here fragments of structures to reuse below
3
- ANCHORS:
4
- -
5
-
6
- # This is a dynamic index name The settings and mapping below will work with any index.
7
- # The default index name generated by Flex is usually <application_name>_<environment>,
8
- # but you may have changed it in the initializers/flex.rb or you can hardcode it if you prefer.
9
- <%%= Flex::Configuration.variables[:index] %>:
10
-
11
- settings:
12
- number_of_shards: 5
13
- number_of_replicas: 1
14
-
15
- # add your custom mappings here
16
- mappings: {}
@@ -1,18 +0,0 @@
1
- # inspect the methods loaded in this module and their usage
2
- # in the rails console by just typing:
3
- # >> puts <%= @class_name %>.flex.info
4
- # you can eventually restrict the info to a single method by pasing its name:
5
- # >> puts <%= @class_name %>.flex.info :search
6
- # see the detailed doc for this feature at https://github.com/ddnexus/flex/wiki/Selfdoc
7
-
8
- module <%= @class_name %>
9
-
10
- extend self
11
-
12
- include Flex::Loader
13
- flex.load_search_source
14
-
15
- # you may need to add more method here, usually wrapper methods
16
- # that use one of the autogenerated methods from the loaded templates
17
-
18
- end
@@ -1,19 +0,0 @@
1
- # Add here your search queries
2
- # see the detailed Source documentation at https://github.com/ddnexus/flex/wiki/Sources
3
-
4
-
5
- # ANCHORS litheral key: it will not be used as template
6
- # you can store here fragments of queries to reuse in the templates below
7
- ANCHORS:
8
- -
9
-
10
- # this is a a basic template loaded in your class <%= @class_name %>
11
- # it defines the 'q' tag. You can check its usage from the rails console by just typing:
12
- # >> puts <%= @class_name %>.flex.info
13
- # You can eventually restrict the info to a single method by pasing its name:
14
- # >> puts <%= @class_name %>.flex.info :search
15
- # see the detailed doc for this feature at https://github.com/ddnexus/flex/wiki/Selfdoc
16
- search:
17
- - query:
18
- query_string: <<q= "*">>
19
-
@@ -1,17 +0,0 @@
1
- # see the detailed Extenders documentation at https://github.com/ddnexus/flex/wiki/Extenders
2
-
3
- module <%= @extender_name %>
4
-
5
- # set this method to restrict this extender to certain types of results
6
- # see the other Flex extenders for reference (https://github.com/ddnexus/flex/tree/master/lib/flex/result)
7
- def self.should_extend?(response)
8
- false
9
- end
10
-
11
- # adds your methods
12
-
13
- def an_extending_method
14
- # self is the structure returned by ES
15
- end
16
-
17
- end
@@ -1,44 +0,0 @@
1
- # see the detailed Configuration documentation at https://github.com/ddnexus/flex/wiki/Configuration
2
-
3
- Flex::Configuration.configure do |config|
4
-
5
- # you MUST add your indexed model names here
6
- config.flex_models = %w[ ]
7
-
8
- # Add the your result extenders here
9
- config.result_extenders |= [ <%= "#{@extender_name}" %> ]
10
-
11
- # Add the default variables here
12
- # see also the details Variables documentation at https://github.com/ddnexus/flex/wiki/Variables
13
- # config.variables.add :index => 'my_index',
14
- # :type => 'project',
15
- # :anything => 'anything
16
-
17
- # The custom url of your ElasticSearch server
18
- # config.base_uri = 'http://localhost:9200'
19
-
20
- # Set it to true to log the debug infos (true by default in development mode)
21
- # config.debug = false
22
-
23
- # Debug info are actually valid curl commands
24
- # config.debug_to_curl = false
25
-
26
- # The custom logger you want Flex to use. Default Rails.logger
27
- # config.logger = Logger.new(STDERR)
28
-
29
- # Custom config file path
30
- # config.config_file = '/custom/path/to/flex.yml',
31
-
32
- # Custom flex dir path
33
- # config.flex_dir = '/custom/path/to/flex',
34
-
35
- # The custom http_client you may want to implement
36
- # config.http_client = 'Your::Client'
37
-
38
- # The options passed to the http_client. They are client specific.
39
- # config.http_client_options = {:timeout => 5}
40
-
41
- # Experimental: checks the response and return a boolean (should raise?)
42
- # config.raise_proc = proc{|response| response.status >= 400}
43
-
44
- end
@@ -1,17 +0,0 @@
1
- require defined?(Rails) ? 'flex/rails' : 'flex'
2
- require 'flex/tasks'
3
-
4
- env = defined?(Rails) ? :environment : []
5
-
6
- namespace :flex do
7
-
8
- desc 'imports from an ActiveRecord or Mongoid models'
9
- task(:import => env) { Flex::Tasks.import_models }
10
-
11
- desc 'creates indices from the Flex::Configuration.config_file file'
12
- task(:create_indices => env) { Flex::Tasks.create_indices }
13
-
14
- desc 'destroys indices in the Flex::Configuration.config_file file'
15
- task(:delete_indices => env) { Flex::Tasks.delete_indices }
16
-
17
- end
@@ -1,143 +0,0 @@
1
- desc 'check version'
2
- Flex::VERSION
3
- _eql?( "0.1" )
4
-
5
- desc 'Flex responds to all public methods'
6
- methods = [ # api methods from yaml
7
- :indices_exists, :create_index, :put_index, :post_index, :get_settings, :put_mapping, :get_mapping, :delete_mapping,
8
- :delete_index, :delete_by_query, :bulk, :count, :stats, :store, :put_store, :post_store, :remove, :get, :multi_get,
9
- # utility_methods
10
- :search, :slim_search, :HEAD, :GET, :PUT, :POST, :DELETE, :json2yaml, :yaml2json,
11
- :process_bulk, :import_collection, :delete_collection,
12
- # other methods
13
- :exist? ]
14
- defined, not_defined = methods.partition {|k| Flex.respond_to?(k)}
15
- defined
16
- _eql?( methods )
17
-
18
-
19
- desc 'create index with PUT (explicit index)'
20
- Flex.delete_index(:index => INDEX_NAME) if Flex.exist?(:index => INDEX_NAME)
21
- Flex.put_index(:index => INDEX_NAME)
22
- _eql?( {"ok"=>true, "acknowledged"=>true} )
23
-
24
-
25
- # in the irt_helper.rb we set the default index to INDEX_NAME and Flex.reload! so we don't need to pass any explicit index
26
-
27
- desc 'create index with PUT'
28
- Flex.delete_index if Flex.exist?
29
- Flex.put_index
30
- _eql?( {"ok"=>true, "acknowledged"=>true} )
31
-
32
-
33
- desc "index #{INDEX_NAME} exist"
34
- Flex.exist?
35
- _eql?( true )
36
-
37
-
38
- desc "index #{unexistent = 'flex_unexistent_index'} doesn't exist'"
39
- Flex.exist?(:index => unexistent)
40
- _eql?( false )
41
-
42
-
43
- desc 'create_index with POST (explicit index)'
44
- Flex.delete_index(:index => TMP_INDEX_NAME) if Flex.exist?(:index => TMP_INDEX_NAME)
45
- Flex.post_index(:index => TMP_INDEX_NAME)
46
- _eql?( {"ok"=>true, "acknowledged"=>true} )
47
- Flex.delete_index(:index => TMP_INDEX_NAME)
48
-
49
-
50
- desc 'get_settings'
51
- Flex.get_settings
52
- _eql?( {"flex_test_index"=>{"settings"=>{"index.number_of_replicas"=>"1", "index.number_of_shards"=>"5", "index.version.created"=>"190299"}}} )
53
-
54
-
55
- desc 'put_mapping'
56
- Flex.put_mapping(:type => 'type1',
57
- :properties => {'test1' => {'type' => 'string'} })
58
- _eql?( {"ok"=>true, "acknowledged"=>true} )
59
-
60
-
61
- desc 'check mapping'
62
- Flex.get_mapping
63
- _eql?( {"flex_test_index"=>{"type1"=>{"properties"=>{"test1"=>{"type"=>"string"}}}}} )
64
-
65
-
66
- desc 'delete_mapping'
67
- Flex.delete_mapping(:type => 'type1')
68
- _eql?( {"ok"=>true} )
69
-
70
-
71
- desc 'delete_index'
72
- Flex.delete_index
73
- _eql?( {"ok"=>true, "acknowledged"=>true} )
74
-
75
-
76
- desc 'check delete_index'
77
- Flex.exist?
78
- _eql?( false )
79
-
80
-
81
- desc 'store'
82
- Flex.store(:type => 'type1', :id => 1, :data => {'a'=>2, 'b'=>3})
83
- _eql?( {"ok"=>true, "_index"=>"flex_test_index", "_type"=>"type1", "_id"=>"1", "_version"=>1} )
84
-
85
-
86
- desc 'get'
87
- Flex.get(:type => 'type1', :id => 1)
88
- _eql?( {"_index"=>"flex_test_index", "_type"=>"type1", "_id"=>"1", "_version"=>1, "exists"=>true, "_source"=>{"a"=>2, "b"=>3}} )
89
-
90
-
91
- desc 'count (may fail in test, but it\'s ok)'
92
- Flex.count :type => 'type1'
93
- _eql?( {"count"=>1, "_shards"=>{"total"=>5, "successful"=>5, "failed"=>0}} )
94
-
95
-
96
- desc 'remove'
97
- Flex.remove(:type => 'type1', :id => 1)
98
- _eql?( {"ok"=>true, "found"=>true, "_index"=>"flex_test_index", "_type"=>"type1", "_id"=>"1", "_version"=>2} )
99
-
100
-
101
- desc 'check remove'
102
- Flex.get(:type => 'type1', :id => 1, :raise => false)
103
- _eql?( nil )
104
-
105
-
106
- desc 'delete_by_query'
107
- # in Patron the :data option is not working, since currently patron cannot send data with a DELETE request
108
- Flex.store(:type => 'type1', :id => 1, :data => {'a'=>2, 'myfield'=>'pippo'})
109
- Flex.delete_by_query :type => 'type1', :params => {:q => 'myfield:pippo'}
110
- _eql?( {"ok"=>true, "_indices"=>{"flex_test_index"=>{"_shards"=>{"total"=>5, "successful"=>5, "failed"=>0}}}} )
111
-
112
-
113
- desc 'strict_existence doesn\'t affect exist'
114
- Flex.get(:type => 'type1', :id => 1, :raise => false)
115
- _eql?( nil )
116
-
117
-
118
- desc 'json2yaml'
119
- struct = {:a => {:b => [3,4,5]}}
120
- yaml = Flex.json2yaml MultiJson.encode(struct)
121
- _eql? <<EOS
122
- ---
123
- a:
124
- b:
125
- - 3
126
- - 4
127
- - 5
128
- EOS
129
-
130
- desc 'yaml2json'
131
- Flex.yaml2json(yaml)
132
- _eql?( "{\"a\":{\"b\":[3,4,5]}}" )
133
-
134
-
135
- desc "exist with HEAD"
136
- Flex.HEAD "/#{INDEX_NAME}"
137
- # empty result object
138
- _eql?( true )
139
-
140
- desc "doesn't exist with HEAD'"
141
- Flex.HEAD "/unexistent_flex_index"
142
- _eql?( false )
143
-
@@ -1,53 +0,0 @@
1
-
2
- desc 'Flex::Configuration responds to all public methods'
3
- methods = [ # regular methods from class
4
- :configure,
5
- # data methods
6
- :base_uri, :result_extenders, :logger, :variables, :flex_models, :config_file, :flex_dir,
7
- :http_client, :http_client_options, :debug, :debug_to_curl, :raise_proc]
8
-
9
- defined, not_defined = methods.partition {|k| Flex::Configuration.respond_to?(k)}
10
- defined
11
- _eql?( methods )
12
-
13
-
14
- desc 'block set variables'
15
- Flex::Configuration.configure do |conf|
16
- conf.base_uri = 'http://something:123'
17
- end
18
- Flex::Configuration.base_uri
19
- _eql?( "http://something:123" )
20
-
21
-
22
- desc 'direct set variables'
23
- Flex::Configuration.test = false
24
- Flex::Configuration.test
25
- _eql?( false )
26
-
27
-
28
- desc 'new configuration object'
29
- Flex::Configuration.configure do |conf|
30
- conf.custom = 23
31
- conf.base_uri = 'http://other_host:9200'
32
- end
33
-
34
-
35
- desc 'custom arg accessor'
36
- Flex::Configuration.custom
37
- _eql?( 23 )
38
-
39
-
40
- desc 'modified configuration'
41
- Flex::Configuration.base_uri
42
- _eql?( 'http://other_host:9200' )
43
-
44
-
45
- desc 'add custom configuration with accessor'
46
- Flex::Configuration.new_custom = 3
47
- _eql?( 3 )
48
-
49
-
50
- desc 'custom option is in object'
51
- Flex::Configuration.new_custom
52
- _eql?( 3 )
53
-
@@ -1,12 +0,0 @@
1
- $:.unshift File.expand_path('../../lib', __FILE__)
2
- require 'flex'
3
-
4
- INDEX_NAME = 'flex_test_index'
5
- TMP_INDEX_NAME = 'flex_tmp_test_index'
6
-
7
- INDEX_NAME_1 = 'flex_test_index_1'
8
- INDEX_NAME_2 = 'flex_test_index_2'
9
-
10
- Flex.create_index(:index => INDEX_NAME) unless Flex.exist?(:index => INDEX_NAME)
11
- Flex.config.variables[:index] = INDEX_NAME
12
- Flex.reload!