xquery 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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[![Join the chat at https://gitter.im/JelF/xquery](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/JelF/xquery?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n[![Build
|
140
|
+
Status](https://travis-ci.org/JelF/xquery.svg?branch=master)](https://travis-ci.org/JelF/xquery)\n[![Code
|
141
|
+
Climate](https://codeclimate.com/github/JelF/xquery/badges/gpa.svg)](https://codeclimate.com/github/JelF/xquery)\n[![Test
|
142
|
+
Coverage](https://codeclimate.com/github/JelF/xquery/badges/coverage.svg)](https://codeclimate.com/github/JelF/xquery/coverage)\n[![Issue
|
143
|
+
Count](https://codeclimate.com/github/JelF/xquery/badges/issue_count.svg)](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:
|