xquery 0.2.0 → 0.2.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 +4 -4
- data/lib/xquery.rb +11 -2
- data/lib/xquery/abstract.rb +23 -19
- data/lib/xquery/errors.rb +4 -3
- data/lib/xquery/generic.rb +0 -10
- data/lib/xquery/query_proxy.rb +3 -2
- data/lib/xquery/version.rb +1 -1
- metadata +75 -109
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 876688b968422788335514201e580c31a562daf3
|
4
|
+
data.tar.gz: 5ed3c53f8347b42cfd3fef711512fe49d6b2a005
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95462d4e6f98c48e113a046a664ba08b2acb5919c886a836c95781856beb91ecb61576c9ca958a60ea02dbb79a42e788d6946bcdb24842e937330794e42db617
|
7
|
+
data.tar.gz: bafcc91a9b266af4a91388238cd289fd4ee019d36633dcb37bbff6fe11fd63ed317041a722d961bcc56c2775b06d993662393e3bacf12c9edec60689033d5042
|
data/lib/xquery.rb
CHANGED
@@ -4,7 +4,16 @@ require 'active_support'
|
|
4
4
|
# convert it in a builder classes
|
5
5
|
# see [README.md] for more information
|
6
6
|
module XQuery
|
7
|
+
autoload :Abstract, 'xquery/abstract'
|
8
|
+
autoload :QuerySuperclassChanged, 'xquery/errors'
|
9
|
+
autoload :Generic, 'xquery/generic'
|
10
|
+
autoload :QueryProxy, 'xquery/query_proxy'
|
11
|
+
autoload :VERSION, 'xquery/version'
|
7
12
|
end
|
8
13
|
|
9
|
-
|
10
|
-
|
14
|
+
# Allows you to do all query magic on a generic object
|
15
|
+
# @param model [Object] any object
|
16
|
+
# @yield block where instance will be yielded
|
17
|
+
def XQuery(model)
|
18
|
+
XQuery::Generic.with(model) { |instance| yield(instance) }
|
19
|
+
end
|
data/lib/xquery/abstract.rb
CHANGED
@@ -5,22 +5,27 @@ require 'xquery/errors'
|
|
5
5
|
|
6
6
|
module XQuery
|
7
7
|
# Abstract superclass, should be inherited, not used
|
8
|
+
# @attr query
|
9
|
+
# contains current state of wrapped query
|
8
10
|
class Abstract
|
9
11
|
class_attribute :query_superclass
|
12
|
+
self.query_superclass = Object
|
13
|
+
|
14
|
+
attr_reader :query
|
10
15
|
|
11
16
|
# Yields instance inside block. I suggest to name it `q`
|
12
|
-
# @param args [Array(Object)]
|
13
|
-
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
instance
|
17
|
+
# @param args [Array(Object)]
|
18
|
+
# array of arguments would be passed to `new`
|
19
|
+
# @yield [XQuery::Abstract] new intance
|
20
|
+
# @return resulting query
|
21
|
+
def self.with(*args)
|
22
|
+
new(*args).with { |instance| yield(instance) }
|
18
23
|
end
|
19
24
|
|
20
25
|
# Defines `method`, `__method` and `q.method`.
|
21
|
-
# Both of
|
26
|
+
# Both of witch changes query to query.method
|
22
27
|
# @param name [#to_sym] name of method on query
|
23
|
-
# @
|
28
|
+
# @option as [#to_sym] name of method defined
|
24
29
|
def self.wrap_method(name, as: name)
|
25
30
|
define_method(as) { |*args, &block| _update_query(name, *args, &block) }
|
26
31
|
alias_on_q(as, true)
|
@@ -51,13 +56,12 @@ module XQuery
|
|
51
56
|
end
|
52
57
|
|
53
58
|
# inherited classes should also have their query_proxies inherited
|
59
|
+
# @api private
|
60
|
+
# @param child [Class] class inheriting this
|
54
61
|
def self.inherited(child)
|
55
62
|
child.instance_variable_set(:@query_proxy, Class.new(query_proxy))
|
56
63
|
end
|
57
64
|
|
58
|
-
# contains current state of wrapped query
|
59
|
-
attr_reader :query
|
60
|
-
|
61
65
|
# @param query [Object] generic query
|
62
66
|
def initialize(query)
|
63
67
|
self.query = query
|
@@ -65,10 +69,10 @@ module XQuery
|
|
65
69
|
end
|
66
70
|
|
67
71
|
# Yields iteself inside block. I suggest to name it `q`
|
68
|
-
# @
|
72
|
+
# @yield [XQuery::Abstract] itself
|
69
73
|
# @return [Object] query
|
70
|
-
def with
|
71
|
-
|
74
|
+
def with
|
75
|
+
yield(self)
|
72
76
|
query
|
73
77
|
end
|
74
78
|
|
@@ -85,17 +89,17 @@ module XQuery
|
|
85
89
|
end
|
86
90
|
|
87
91
|
# Yields query inside block
|
88
|
-
# @
|
92
|
+
# @yield query
|
89
93
|
# @return [XQuery::Abstract] self
|
90
|
-
def apply
|
91
|
-
self.query =
|
94
|
+
def apply
|
95
|
+
self.query = yield(query)
|
92
96
|
self
|
93
97
|
end
|
94
98
|
|
95
99
|
private
|
96
100
|
|
97
|
-
# Private Api!
|
98
101
|
# Updates query by calling method on it and storing the result
|
102
|
+
# @api private
|
99
103
|
# @return [XQuery::Abstract] self
|
100
104
|
def _update_query(method, *args, &block)
|
101
105
|
apply { |x| x.public_send(method, *args, &block) }
|
@@ -105,7 +109,7 @@ module XQuery
|
|
105
109
|
# @raise XQuery::QuerySuperclassChanged
|
106
110
|
def query=(x)
|
107
111
|
unless x.is_a?(query_superclass)
|
108
|
-
|
112
|
+
raise QuerySuperclassChanged.new(x, query_superclass)
|
109
113
|
end
|
110
114
|
|
111
115
|
@query = x
|
data/lib/xquery/errors.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module XQuery
|
2
2
|
# raised when superclass of query changed
|
3
|
+
# @attr result
|
4
|
+
# query on which constraint failed
|
5
|
+
# @attr [Class] expectation
|
6
|
+
# expected superclass of query
|
3
7
|
class QuerySuperclassChanged < StandardError
|
4
|
-
# query on which constraint failed
|
5
8
|
attr_reader :result
|
6
|
-
|
7
|
-
# expected superclass of query
|
8
9
|
attr_reader :expectation
|
9
10
|
|
10
11
|
# @param result [Object] query on which constraint failed
|
data/lib/xquery/generic.rb
CHANGED
@@ -3,9 +3,6 @@ require 'xquery/abstract'
|
|
3
3
|
module XQuery
|
4
4
|
# delegates all operations to model
|
5
5
|
class Generic < Abstract
|
6
|
-
# never used but defined in case of need
|
7
|
-
self.query_superclass = Object
|
8
|
-
|
9
6
|
# all missing methods would be delegated to query
|
10
7
|
# and processed as wrappers process them
|
11
8
|
def method_missing(name, *args, &block)
|
@@ -26,10 +23,3 @@ module XQuery
|
|
26
23
|
end
|
27
24
|
end
|
28
25
|
end
|
29
|
-
|
30
|
-
# Allows you to do all query magic on a generic object
|
31
|
-
# @param model [Object] any object
|
32
|
-
# @param block [#to_proc] block where instance will be yielded
|
33
|
-
def XQuery(model, &block)
|
34
|
-
XQuery::Generic.with(model, &block)
|
35
|
-
end
|
data/lib/xquery/query_proxy.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
module XQuery
|
2
2
|
# This proxy can be used to access raw wrappers inside classes,
|
3
3
|
# inherited from XQuery::Abstract
|
4
|
+
# @attr instance [XQuery::Abstract]
|
5
|
+
# Wrapped instance
|
4
6
|
class QueryProxy
|
5
|
-
# @param instance [
|
7
|
+
# @param instance [XQuery::Abstract] instance to delegate methods
|
6
8
|
def initialize(instance)
|
7
9
|
self.instance = instance
|
8
10
|
end
|
9
11
|
|
10
12
|
private
|
11
13
|
|
12
|
-
# instance of Xquery::Abstract
|
13
14
|
attr_accessor :instance
|
14
15
|
end
|
15
16
|
end
|
data/lib/xquery/version.rb
CHANGED
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xquery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jelf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '4.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
@@ -30,72 +30,72 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.12'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.12'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '10.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '10.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0
|
61
|
+
version: '3.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0
|
68
|
+
version: '3.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rubocop
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '0.47'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '0.47'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: pry
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
89
|
+
version: '0.10'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0.
|
96
|
+
version: '0.10'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: coveralls
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
@@ -109,104 +109,71 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0.8'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: yard
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.9'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.9'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: launchy
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - "~>"
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
131
|
+
version: 2.4.3
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - "~>"
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
125
|
-
description:
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
`
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
#
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
### `
|
162
|
-
|
163
|
-
but not methods you defined inside your class.
|
164
|
-
E.g. i have defined `wrap_method(:foo)`, but also delegated `#foo` to some
|
165
|
-
another object. If i call `q.foo`, i will get wrapped method.
|
166
|
-
Note, that if you redefine `#__foo` method, q.foo will call it instead of
|
167
|
-
normal work.
|
168
|
-
You can add additional methods to `q` using something like `alias_on_q :foo`.
|
169
|
-
I used it with `kaminary` and it was useful
|
170
|
-
```
|
171
|
-
def page=(x)
|
172
|
-
apply { |query| query.page(x) }
|
173
|
-
end
|
174
|
-
alias_on_q :page=
|
175
|
-
|
176
|
-
def page
|
177
|
-
query.current_page
|
178
|
-
end
|
179
|
-
alias_on_q :page
|
180
|
-
```
|
181
|
-
|
182
|
-
### `query_superclass`
|
183
|
-
You should specify `query_superclass` class_attribute to inherit
|
184
|
-
`XQuery::Abstract`. Whenever `query.is_a?(query_superclass)` evaluate to false,
|
185
|
-
you will get `XQuery::QuerySuperclassChanged` exception.
|
186
|
-
It can save you much time when your class misconfigured.
|
187
|
-
E.g. you are using `select!` and it returns `nil`, because why not?
|
188
|
-
|
189
|
-
### `#apply` method
|
190
|
-
`#apply` does exact what it source tells
|
191
|
-
```
|
192
|
-
# yields query inside block
|
193
|
-
# @param block [#to_proc]
|
194
|
-
# @return [XQuery::Abstract] self
|
195
|
-
def apply(&block)
|
196
|
-
self.query = block.call(query)
|
197
|
-
self
|
198
|
-
end
|
199
|
-
```
|
200
|
-
It is usefull to merge different queries.
|
201
|
-
|
202
|
-
### `with` class method
|
203
|
-
You can get XQuery functionality even you have not defined a specific class
|
204
|
-
(You are still have to inherit XQuery::Abstract to use it)
|
205
|
-
You can see it in this document when i described `XQuery` function.
|
206
|
-
Note, that it yields a class instance, not `q` object.
|
207
|
-
It accepts any arguments, they will be passed to a constructor (except block)
|
208
|
-
If you want only to call one function on an instance (e.g. `#apply`),
|
209
|
-
you should prefer `execute` alias
|
138
|
+
version: 2.4.3
|
139
|
+
description: "# XQuery\n\n[](https://gitter.im/JelF/xquery?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n[](https://travis-ci.org/JelF/xquery)\n[](https://codeclimate.com/github/JelF/xquery)\n[](https://codeclimate.com/github/JelF/xquery/coverage)\n[](https://codeclimate.com/github/JelF/xquery)
|
144
|
+
\ \nXQuery is designed to replace boring method call chains and allow to easier\nconvert
|
145
|
+
it in a builder classes\n## Usage of `XQuery` function\n`XQuery` is a shortcat to
|
146
|
+
`XQuery::Generic.with`\n\n```\nr = XQuery(''.html_safe) do |q|\n # similar to tap\n
|
147
|
+
\ q << 'bla bla bla'\n q << 'bla bla bla'\n # using truncate\n q.truncate(15)\n
|
148
|
+
\ # real content (q.send(:query)) mutated\n q << '!'\nend\nr # => \"bla bla blab...!\"\n```\n##
|
149
|
+
Usage of `XQuery::Abstract`\nI designed this gem to help me with `ActiveRecord`
|
150
|
+
Queries, so i inherited\n`XQuery::Abstract` and used it's powers. It provides the
|
151
|
+
following features\n### `wrap_method` and `wrap_methods`\nwhen you call each of
|
152
|
+
this methods they became automatically wrapped\n(`XQuery::Abstract` basically wraps
|
153
|
+
all methods query `#respond_to?`)\nIt means, that there are instance methods with
|
154
|
+
same name defined and will\nchange a `#query` to their call result.\n```\nself.query
|
155
|
+
= query.foo(x)\n# is basically the same as\nfoo(x)\n# when `wrap_method :foo` called\n```\n\nYou
|
156
|
+
can also specify new name using `wrap_method :foo, as: :bar` syntax\n### `q` object\n`q`
|
157
|
+
is a proxy object which holds all of wrapped methods,\nbut not methods you defined
|
158
|
+
inside your class.\nE.g. i have defined `wrap_method(:foo)`, but also delegated
|
159
|
+
`#foo` to some\nanother object. If i call `q.foo`, i will get wrapped method.\nNote,
|
160
|
+
that if you redefine `#__foo` method, q.foo will call it instead of\nnormal work.\nYou
|
161
|
+
can add additional methods to `q` using something like `alias_on_q :foo`.\nI used
|
162
|
+
it with `kaminary` and it was useful\n```\ndef page=(x)\n apply { |query| query.page(x)
|
163
|
+
}\nend\nalias_on_q :page=\n\ndef page\n query.current_page\nend\nalias_on_q :page\n```\n\n###
|
164
|
+
`query_superclass`\nYou should specify `query_superclass` class_attribute to inherit\n`XQuery::Abstract`.
|
165
|
+
Whenever `query.is_a?(query_superclass)` evaluate to false,\nyou will get `XQuery::QuerySuperclassChanged`
|
166
|
+
exception.\nIt can save you much time when your class misconfigured.\nE.g. you are
|
167
|
+
using `select!` and it returns `nil`, because why not?\n\n### `#apply` method\n`#apply`
|
168
|
+
does exact what it source tells\n```\n# yields query inside block\n# @param block
|
169
|
+
[#to_proc]\n# @return [XQuery::Abstract] self\ndef apply(&block)\n self.query =
|
170
|
+
block.call(query)\n self\nend\n```\nIt is usefull to merge different queries.\n\n###
|
171
|
+
`with` class method\nYou can get XQuery functionality even you have not defined
|
172
|
+
a specific class\n(You are still have to inherit XQuery::Abstract to use it)\nYou
|
173
|
+
can see it in this document when i described `XQuery` function.\nNote, that it yields
|
174
|
+
a class instance, not `q` object.\nIt accepts any arguments, they will be passed
|
175
|
+
to a constructor (except block)\n\n### `execute` method\nPreferred way to call public
|
176
|
+
instance methods.\nResulting query would be returned\n"
|
210
177
|
email:
|
211
178
|
- begdory4+xquery@gmail.com
|
212
179
|
executables: []
|
@@ -239,10 +206,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
239
206
|
version: '0'
|
240
207
|
requirements: []
|
241
208
|
rubyforge_project:
|
242
|
-
rubygems_version: 2.
|
209
|
+
rubygems_version: 2.5.1
|
243
210
|
signing_key:
|
244
211
|
specification_version: 4
|
245
212
|
summary: XQuery is designed to replace boring method call chains and allow to easier
|
246
213
|
convert it in a builder classes see README.md for more information
|
247
214
|
test_files: []
|
248
|
-
has_rdoc:
|