easy-exist 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.
- checksums.yaml +7 -0
- data/lib/easy-exist/db.rb +109 -0
- data/lib/easy-exist/query_request.rb +45 -0
- data/lib/easy-exist.rb +12 -0
- metadata +167 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 737047bef920cbfe0d8eea570262ffb60373384f
|
4
|
+
data.tar.gz: 7961d81d7d2acd4040ebc52c3f21e4697d3bad46
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 87a2179c43a6c3e4813a76b0411687b36d46581a1ce02ec3369a3f2cbb9cdeb6264eaa6ef25ae931a3964f9e5ea2b1dead020141e13e2936ed9bd6ff9f7da747
|
7
|
+
data.tar.gz: f1d0167739ae35fdef4991c9aa4711fafe09104d43cc25a56478edfa6f45354b1cc6dfba4baf4680bcc162fb54beb1a93836999a115fd63fa3c6378691c4e114
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module EasyExist
|
2
|
+
|
3
|
+
# Responsible for communicating with the eXist-db server
|
4
|
+
class DB
|
5
|
+
|
6
|
+
# Initializes an EasyExist::DB.
|
7
|
+
#
|
8
|
+
# @param url [String] the url to the eXist-db server, include protocol.
|
9
|
+
# @param opts [Hash] options to initialize the DB with.
|
10
|
+
# @option opts :collection [String] The collection for which all GET, PUT and DELETE requests will be relative to.
|
11
|
+
# @option opts :username [String] Username for Basic HTTP Authentication.
|
12
|
+
# @option opts :password [String] Password for Basic HTTP Authentication.
|
13
|
+
# @return [EasyExist::DB] an instance of an EasyExist::DB.
|
14
|
+
def initialize(url, opts = {})
|
15
|
+
validate_opts(opts)
|
16
|
+
@default_opts = { base_uri: url + "/exist/rest/db#{opts[:collection] ||= ''}" }
|
17
|
+
if(opts[:username] && opts[:password])
|
18
|
+
@default_opts[:basic_auth] = { username: opts[:username], password: opts[:password] }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Retrieves the document at the specified document_uri from the store.
|
23
|
+
#
|
24
|
+
# @param document_uri [String] the uri of the document to retrieve.
|
25
|
+
# relative to the collection specified on initialization otherwise '/db'.
|
26
|
+
# @return [String] the contents of the document at 'document_uri'
|
27
|
+
def get(document_uri)
|
28
|
+
validate_uri(document_uri)
|
29
|
+
res = HTTParty.get(document_uri, @default_opts)
|
30
|
+
res.success? ? res.body : handle_error(res)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Puts the given document content at the specified document_uri
|
34
|
+
#
|
35
|
+
# @param document_uri [String] the uri of the document to store.
|
36
|
+
# relative to the collection specified on initialization otherwise '/db'.
|
37
|
+
# @return [HTTParty::Response] the response object
|
38
|
+
def put(document_uri, document)
|
39
|
+
validate_uri(document_uri)
|
40
|
+
res = HTTParty.put(document_uri, @default_opts.merge({
|
41
|
+
body: document,
|
42
|
+
headers: { "Content-Type" => "application/xml"},
|
43
|
+
}))
|
44
|
+
res.success? ? res : handle_error(res)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Deletes the document at the specified document_uri from the store
|
48
|
+
#
|
49
|
+
# @param document_uri [String] the uri of the document to delete.
|
50
|
+
# relative to the collection specified on initialization otherwise '/db'.
|
51
|
+
# @return [HTTParty::Response] the response object
|
52
|
+
def delete(document_uri)
|
53
|
+
validate_uri(document_uri)
|
54
|
+
res = HTTParty.delete(document_uri, @default_opts)
|
55
|
+
res.success? ? res : handle_error(res)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Determines if the document at the specified document_uri exists in the store
|
59
|
+
#
|
60
|
+
# @param document_uri [String] the uri of the document to check.
|
61
|
+
# relative to the collection specified on initialization otherwise '/db'.
|
62
|
+
# @return [TrueClass | FalseClass]
|
63
|
+
def exists?(document_uri)
|
64
|
+
validate_uri(document_uri)
|
65
|
+
HTTParty.get(document_uri, @default_opts).success?
|
66
|
+
end
|
67
|
+
|
68
|
+
# Runs the given XQuery against the store and returns the results
|
69
|
+
#
|
70
|
+
# @param query [String] XQuery to run against the store
|
71
|
+
# @param opts [Hash] options for the query request.
|
72
|
+
# @option opts :start [Integer] Index of first item to be returned.
|
73
|
+
# @option opts :max [Integer] The maximum number of items to be returned.
|
74
|
+
# @return [String] the query results
|
75
|
+
def query(query, opts = {})
|
76
|
+
body = EasyExist::QueryRequest.new(query, opts).body
|
77
|
+
res = HTTParty.post("", @default_opts.merge({
|
78
|
+
body: body,
|
79
|
+
headers: { 'Content-Type' => 'application/xml', 'Content-Length' => body.length.to_s }
|
80
|
+
}))
|
81
|
+
res.success? ? res.body : handle_error(res)
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
# Raises an error based on a HTTParty::Response.
|
86
|
+
# HTTParty:Response objects contain a reference to the Net::HTTResponse object.
|
87
|
+
# Where a request is unsuccessful, the reference can be raised as an exception for clients to rescue
|
88
|
+
# and decide on next steps.
|
89
|
+
#
|
90
|
+
# @param res [HTTParty::Response] the response
|
91
|
+
def handle_error(res)
|
92
|
+
res.response.value
|
93
|
+
end
|
94
|
+
|
95
|
+
# Raises an error if the given uri does not start with a '/'
|
96
|
+
#
|
97
|
+
# @param uri [String] the uri to validate
|
98
|
+
def validate_uri(uri)
|
99
|
+
raise ArgumentError, 'URI must contain preceding "/"' if uri[0] != '/';
|
100
|
+
end
|
101
|
+
|
102
|
+
# Raises an error if any of the given opts are invalid
|
103
|
+
#
|
104
|
+
# @param opts [Hash] options to validate.
|
105
|
+
def validate_opts(opts)
|
106
|
+
validate_uri(opts[:collection]) unless opts[:collection].nil? || opts[:collection].empty?
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module EasyExist
|
2
|
+
|
3
|
+
# Representation of an eXist-db query request.
|
4
|
+
# Responsible for encapsulating the XQuery text ready to POST to server.
|
5
|
+
class QueryRequest
|
6
|
+
|
7
|
+
using EasyExist::RefinedTrue
|
8
|
+
using EasyExist::RefinedFalse
|
9
|
+
using EasyExist::RefinedObject
|
10
|
+
|
11
|
+
# Initializes an EasyExist::QueryRequest.
|
12
|
+
# Takes the given XQuery text and builds an Nokogiri::XML object around it.
|
13
|
+
#
|
14
|
+
# @param text [String] the XQuery text
|
15
|
+
# @param opts [Hash] options for the query request.
|
16
|
+
# @option opts :start [Integer] Index of first item to be returned.
|
17
|
+
# @option opts :max [Integer] The maximum number of items to be returned.
|
18
|
+
# @option opts :wrap [Boolean] Wrap results in exist:result element.
|
19
|
+
# @return [EasyExist::QueryRequest] an instance of an EasyExist::QueryRequest.
|
20
|
+
def initialize(text, opts = {})
|
21
|
+
@body = Nokogiri::XML::Builder.new do |xml|
|
22
|
+
xml.query({ xmlns: EXIST_NAMESPACE }.merge(parse_opts(opts))) {
|
23
|
+
xml.text_ text
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns the request body as xml
|
29
|
+
#
|
30
|
+
# @return [String] the request body
|
31
|
+
def body
|
32
|
+
@body.to_xml
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def parse_opts(opts)
|
37
|
+
if(opts.key?(:wrap)) then
|
38
|
+
raise(ArgumentError, ":wrap must be a TrueClass or FalseClass") unless opts[:wrap].is_a_boolean?
|
39
|
+
opts[:wrap] = opts[:wrap].to_yes_no
|
40
|
+
end
|
41
|
+
opts
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
data/lib/easy-exist.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'nokogiri'
|
3
|
+
require_relative "./easy-exist/refinements"
|
4
|
+
require_relative "./easy-exist/query_request"
|
5
|
+
require_relative "./easy-exist/db"
|
6
|
+
|
7
|
+
# The EasyExist module
|
8
|
+
module EasyExist
|
9
|
+
|
10
|
+
# Defines the eXist-db xml namespace
|
11
|
+
EXIST_NAMESPACE = "http://exist.sourceforge.net/NS/exist"
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: easy-exist
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tom Cass
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httparty
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.13'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.13.3
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.13'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.13.3
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: nokogiri
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.6'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.6.6.2
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.6'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.6.6.2
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rspec
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '3.1'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 3.1.0
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '3.1'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 3.1.0
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: rack-test
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0.6'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.6.3
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.6'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 0.6.3
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: shoulda-matchers
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '2.7'
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.7.0
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '2.7'
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 2.7.0
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: pry-debugger
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0.2'
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 0.2.3
|
123
|
+
type: :development
|
124
|
+
prerelease: false
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0.2'
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 0.2.3
|
133
|
+
description: An easy to use gem to interact with eXist-db via its REST API.
|
134
|
+
email: easy.exist.gem@gmail.com
|
135
|
+
executables: []
|
136
|
+
extensions: []
|
137
|
+
extra_rdoc_files: []
|
138
|
+
files:
|
139
|
+
- lib/easy-exist.rb
|
140
|
+
- lib/easy-exist/db.rb
|
141
|
+
- lib/easy-exist/query_request.rb
|
142
|
+
homepage: http://rubygems.org/gems/easy-exist
|
143
|
+
licenses:
|
144
|
+
- MIT
|
145
|
+
metadata: {}
|
146
|
+
post_install_message:
|
147
|
+
rdoc_options: []
|
148
|
+
require_paths:
|
149
|
+
- lib
|
150
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - ">="
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0'
|
155
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
requirements: []
|
161
|
+
rubyforge_project:
|
162
|
+
rubygems_version: 2.2.2
|
163
|
+
signing_key:
|
164
|
+
specification_version: 4
|
165
|
+
summary: eXist-db made easy!
|
166
|
+
test_files: []
|
167
|
+
has_rdoc:
|