elastirad 0.0.1
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +4 -0
- data/LICENSE +20 -0
- data/README.md +105 -0
- data/Rakefile +19 -0
- data/VERSION +1 -0
- data/lib/elastirad/client.rb +128 -0
- data/lib/elastirad.rb +3 -0
- data/test/test_setup.rb +19 -0
- metadata +111 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 95156251835b98cdd37c6609f5e11e3c22fc5887
|
4
|
+
data.tar.gz: 607df84376fee0048434528edc0222b1286bdda5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 64ff790b4f28a2253228e13f36a5dd21703486c361abf5b62c4e9873ccf2bf6407900329e502595c463ae81a8b827a693b2c6aa16f0428f6e55e5343c92a416d
|
7
|
+
data.tar.gz: 50c43595c370835210c2e232fbc7069ffec012d047a9fb0cfad0b6bd4680a3c2c2d22b46867d64fb2260c1be7c9b907c54392182f8c982e06683e5a04bb1b453
|
data/CHANGELOG.md
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2014 John Wang
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
Elastirad: A RAD Client for Elasticsearch
|
2
|
+
====================================================
|
3
|
+
|
4
|
+
Synopsis
|
5
|
+
--------
|
6
|
+
|
7
|
+
Elastirad is a custom rapid application development (RAD) client for
|
8
|
+
Elasticsearch's Elasticsearch::API that provides a simple interface for
|
9
|
+
making Elasticsearch requests based on Elasticsearch's online documentation.
|
10
|
+
|
11
|
+
The primary goal for Elastirad is to enable use of the Elasticsearch online
|
12
|
+
curl-based documentation alone without needing to understand the syntax for
|
13
|
+
the Ruby SDK.
|
14
|
+
|
15
|
+
Installing
|
16
|
+
----------
|
17
|
+
|
18
|
+
Download and install elastirad with the following:
|
19
|
+
|
20
|
+
gem install elastirad
|
21
|
+
|
22
|
+
#Examples
|
23
|
+
---------
|
24
|
+
|
25
|
+
require 'elastirad'
|
26
|
+
|
27
|
+
# Defaults to http://localhost:9200
|
28
|
+
|
29
|
+
rad = Elastirad::Client.new
|
30
|
+
|
31
|
+
# All of the following arguments are optional
|
32
|
+
# Setting :index will enable request code to not include the index
|
33
|
+
# for greater flexibility when switching between deployments, e.g.
|
34
|
+
# dev, staging, production, etc.
|
35
|
+
|
36
|
+
rad = Elastirad::Client.new( \
|
37
|
+
:protocol => 'https',
|
38
|
+
:hostname => 'localhost',
|
39
|
+
:port => 9200,
|
40
|
+
:index => 'articles'
|
41
|
+
)
|
42
|
+
|
43
|
+
# path can be a simple string. Leading slash will over ride default :index
|
44
|
+
|
45
|
+
result_hash = rad.rad_request({ :path => '/articles/_count' })
|
46
|
+
|
47
|
+
# path can also be an array
|
48
|
+
|
49
|
+
result_hash = rad.rad_request({ :path => ['/articles/article', 1 ] })
|
50
|
+
|
51
|
+
# default index can be used without leading slash
|
52
|
+
|
53
|
+
result_hash = rad.rad_request({ :path => ['article', 1 ] })
|
54
|
+
|
55
|
+
# optional :verb can be used for non-GET requests, :get is used by default
|
56
|
+
|
57
|
+
article = { :title => 'Hello World', :by => 'John Doe' }
|
58
|
+
|
59
|
+
result_hash = rad.rad_request({ \
|
60
|
+
:verb => 'put',
|
61
|
+
:path => ['article', 1 ],
|
62
|
+
:body => article
|
63
|
+
})
|
64
|
+
|
65
|
+
# :body can be a hash or JSON string
|
66
|
+
|
67
|
+
result_hash = rad.rad_request({ \
|
68
|
+
:verb => 'put',
|
69
|
+
:path => ['article', 1 ],
|
70
|
+
:body => JSON.dump( article )
|
71
|
+
})
|
72
|
+
|
73
|
+
# :put verb can automatically be added using #rad_index method
|
74
|
+
|
75
|
+
result_has = rad.rad_index({ \
|
76
|
+
:path => ['article', 1 ],
|
77
|
+
:body => article
|
78
|
+
})
|
79
|
+
|
80
|
+
#Documentation
|
81
|
+
--------------
|
82
|
+
|
83
|
+
This gem is 100% documented with YARD, an exceptional documentation library. To see documentation for this, and all the gems installed on your system use:
|
84
|
+
|
85
|
+
$ gem install yard
|
86
|
+
$ yard server -g
|
87
|
+
|
88
|
+
#Links
|
89
|
+
------
|
90
|
+
|
91
|
+
Elasticsearch::API
|
92
|
+
|
93
|
+
https://github.com/elasticsearch/elasticsearch-ruby/tree/master/elasticsearch-api
|
94
|
+
|
95
|
+
#Copyright and License
|
96
|
+
----------------------
|
97
|
+
|
98
|
+
Elastirad © 2014 by [John Wang](mailto:johncwang@gmail.com).
|
99
|
+
|
100
|
+
Elastirad is licensed under the MIT license. Please see the LICENSE document for more information.
|
101
|
+
|
102
|
+
Warranty
|
103
|
+
--------
|
104
|
+
|
105
|
+
This software is provided "as is" and without any express or implied warranties, including, without limitation, the implied warranties of merchantibility and fitness for a particular purpose.
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
desc 'Default: run unit tests.'
|
5
|
+
task :default => :test
|
6
|
+
|
7
|
+
desc 'Test the JsonDoc library.'
|
8
|
+
Rake::TestTask.new do |t|
|
9
|
+
t.libs << 'lib'
|
10
|
+
t.pattern = 'test/**/test_*.rb'
|
11
|
+
t.verbose = false
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Generate YARD documentation.'
|
15
|
+
task :gendoc do
|
16
|
+
#puts 'yard doc generation disabled until JRuby build native extensions for redcarpet or yard removes the dependency.'
|
17
|
+
system "yardoc"
|
18
|
+
system "yard stats --list-undoc"
|
19
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.2
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'multi_json'
|
2
|
+
require 'faraday'
|
3
|
+
require 'elasticsearch/api'
|
4
|
+
|
5
|
+
module Elastirad
|
6
|
+
class Client
|
7
|
+
include Elasticsearch::API
|
8
|
+
|
9
|
+
def initialize(dOptions={})
|
10
|
+
iPort = iPort.to_i if iPort.is_a?(String)
|
11
|
+
@sProtocol = dOptions.has_key?(:protocol) && dOptions[:protocol] \
|
12
|
+
? dOptions[:protocol] : 'http'
|
13
|
+
@sHostname = dOptions.has_key?(:hostname) && dOptions[:hostname] \
|
14
|
+
? dOptions[:hostname] : 'localhost'
|
15
|
+
@iPort = dOptions.has_key?(:port) && dOptions[:port] \
|
16
|
+
? dOptions[:port].to_i : 9200
|
17
|
+
@sIndex = dOptions.has_key?(:index) && dOptions[:index] \
|
18
|
+
? dOptions[:index].strip : nil
|
19
|
+
@sUrl = self.makeUrl(@sProtocol,@sHostname,@iPort)
|
20
|
+
@oFaraday = Faraday::Connection.new url: @sUrl || 'http://localhost:9200'
|
21
|
+
@dVerbs = {:put=>1,:get=>1,:post=>1,:delete=>1}
|
22
|
+
end
|
23
|
+
|
24
|
+
def makeUrl(sProtocol='http',sHostname='localhost',iPort=9200)
|
25
|
+
if sHostname.nil?
|
26
|
+
sHostname = 'localhost'
|
27
|
+
elsif sHostname.is_a?(String)
|
28
|
+
sHostname.strip!
|
29
|
+
if sHostname.length < 1
|
30
|
+
sHostname = 'localhost'
|
31
|
+
end
|
32
|
+
else
|
33
|
+
raise ArgumentError, 'E_HOSTNAME_IS_NOT_A_STRING'
|
34
|
+
end
|
35
|
+
if iPort.nil?
|
36
|
+
iPort = 9200
|
37
|
+
elsif iPort.is_a?(String) && iPort =~ /^[0-9]+$/
|
38
|
+
iPort = iPort.to_i
|
39
|
+
elsif ! iPort.kind_of?(Integer)
|
40
|
+
raise ArgumentError, 'E_PORT_IS_NOT_AN_INTEGER'
|
41
|
+
end
|
42
|
+
sBaseUrl = "#{sProtocol}://#{sHostname}"
|
43
|
+
sBaseUrl.sub!(/\/+\s*$/,'')
|
44
|
+
sBaseUrl += ':' + iPort.to_s if iPort != 80
|
45
|
+
return sBaseUrl
|
46
|
+
end
|
47
|
+
|
48
|
+
def rad_index(dEsRes={})
|
49
|
+
dEsRes[:verb] = :put
|
50
|
+
return self.request(dEsRes)
|
51
|
+
end
|
52
|
+
|
53
|
+
def rad_request(dEsReq={})
|
54
|
+
oEsRes = self.perform_request \
|
55
|
+
getVerbFromEsReq(dEsReq),
|
56
|
+
getPathFromEsReq(dEsReq),
|
57
|
+
nil,
|
58
|
+
getBodyFromEsReq(dEsReq)
|
59
|
+
|
60
|
+
dEsResBody = oEsRes.body \
|
61
|
+
? MultiJson.load( oEsRes.body, :symbolize_keys => true ) : nil
|
62
|
+
end
|
63
|
+
|
64
|
+
def perform_request(method,path,params,body)
|
65
|
+
@oFaraday.run_request \
|
66
|
+
method.downcase.to_sym,
|
67
|
+
path,
|
68
|
+
body,
|
69
|
+
{'Content-Type' => 'application/json'}
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def getVerbFromEsReq(dEsReq={})
|
75
|
+
sVerb = dEsReq.has_key?(:verb) ? dEsReq[:verb] : :get
|
76
|
+
yVerb = sVerb.downcase.to_sym
|
77
|
+
unless @dVerbs.has_key?( yVerb )
|
78
|
+
raise ArgumentError, 'E_BAD_VERB'
|
79
|
+
end
|
80
|
+
return yVerb
|
81
|
+
end
|
82
|
+
|
83
|
+
def getPathFromEsReq(dEsReq={})
|
84
|
+
aPath = []
|
85
|
+
bHasIndex = false
|
86
|
+
|
87
|
+
if dEsReq.has_key?(:path)
|
88
|
+
if dEsReq[:path].is_a?(Array)
|
89
|
+
aPath.push(*dEsReq[:path])
|
90
|
+
elsif dEsReq[:path].is_a?(String)
|
91
|
+
aPath.push(dEsReq[:path])
|
92
|
+
end
|
93
|
+
else
|
94
|
+
if dEsReq.has_key?(:index) && dEsReq[:index].is_a?(String)
|
95
|
+
aPath.push(dEsReq[:index])
|
96
|
+
bHasIndex = true
|
97
|
+
end
|
98
|
+
if dEsReq.has_key?(:type) && dEsReq[:type].is_a?(String)
|
99
|
+
aPath.push(dEsReq[:type])
|
100
|
+
end
|
101
|
+
if dEsReq.has_key?(:id) && dEsReq[:id].is_a?(String)
|
102
|
+
aPath.push(dEsReq[:id])
|
103
|
+
end
|
104
|
+
end
|
105
|
+
sPath = aPath.join('/')
|
106
|
+
sPath.strip!
|
107
|
+
sPath.gsub!(/\/+/,'/')
|
108
|
+
if (sPath.index('/')!=0 || !bHasIndex) && ( @sIndex.is_a?(String) && @sIndex.length>0 )
|
109
|
+
sPath = "#{@sIndex}/#{sPath}"
|
110
|
+
end
|
111
|
+
return sPath
|
112
|
+
end
|
113
|
+
|
114
|
+
def getBodyFromEsReq(dEsReq={})
|
115
|
+
jBody = nil
|
116
|
+
if dEsReq.has_key?(:body)
|
117
|
+
if dEsReq[:body].is_a?(Hash)
|
118
|
+
jBody = MultiJson.dump(dEsReq[:body])
|
119
|
+
elsif dEsReq[:body].is_a?(String) && dEsReq[:body].length > 0
|
120
|
+
jBody = dEsReq[:body]
|
121
|
+
end
|
122
|
+
jBody = nil if jBody == '{}' || jBody.length < 1
|
123
|
+
end
|
124
|
+
return jBody
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
data/lib/elastirad.rb
ADDED
data/test/test_setup.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'elastirad'
|
3
|
+
|
4
|
+
class ElastiradTest < Test::Unit::TestCase
|
5
|
+
def testSetup
|
6
|
+
|
7
|
+
rad1 = Elastirad::Client.new
|
8
|
+
|
9
|
+
assert_equal 'elastirad/objects1', rad1.instance_eval{ getPathFromEsReq({:path=>"elastirad/objects1"}) }
|
10
|
+
assert_equal 'elastirad/objects2', rad1.instance_eval{ getPathFromEsReq({:path=>["elastirad/objects2"]}) }
|
11
|
+
assert_equal 'elastirad/objects3', rad1.instance_eval{ getPathFromEsReq({:path=>["elastirad/","/objects3"]}) }
|
12
|
+
assert_equal '{"query":{"match_all":{}}}', rad1.instance_eval{ getBodyFromEsReq({:body=>{:query=>{:match_all=>{}}}}) }
|
13
|
+
|
14
|
+
rad2 = Elastirad::Client.new(:index => 'elastirad')
|
15
|
+
|
16
|
+
assert_equal 'elastirad/objects/id', rad2.instance_eval{ getPathFromEsReq({:path=>"objects/id"}) }
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: elastirad
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John Wang
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-03-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: elasticsearch
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.0.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: faraday
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: multi_json
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
description: A simple Elasticsearch client
|
74
|
+
email: john@johnwang.com
|
75
|
+
executables: []
|
76
|
+
extensions: []
|
77
|
+
extra_rdoc_files: []
|
78
|
+
files:
|
79
|
+
- CHANGELOG.md
|
80
|
+
- LICENSE
|
81
|
+
- README.md
|
82
|
+
- Rakefile
|
83
|
+
- VERSION
|
84
|
+
- lib/elastirad.rb
|
85
|
+
- lib/elastirad/client.rb
|
86
|
+
- test/test_setup.rb
|
87
|
+
homepage: http://johnwang.com/
|
88
|
+
licenses:
|
89
|
+
- MIT
|
90
|
+
metadata: {}
|
91
|
+
post_install_message:
|
92
|
+
rdoc_options: []
|
93
|
+
require_paths:
|
94
|
+
- lib
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
requirements: []
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 2.2.1
|
108
|
+
signing_key:
|
109
|
+
specification_version: 4
|
110
|
+
summary: Elastirad - a RAD Elasticsearch client supporting minimal reading of documentation
|
111
|
+
test_files: []
|