db_mod 0.0.5 → 0.0.6
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/CHANGELOG.md +9 -0
- data/Gemfile +1 -3
- data/Guardfile +4 -0
- data/README.md +173 -2
- data/Rakefile +7 -1
- data/db_mod.gemspec +7 -2
- data/lib/db_mod.rb +35 -2
- data/lib/db_mod/create.rb +6 -3
- data/lib/db_mod/statements.rb +8 -0
- data/lib/db_mod/statements/configuration.rb +20 -3
- data/lib/db_mod/statements/configuration/as.rb +3 -1
- data/lib/db_mod/statements/configuration/defaults.rb +55 -8
- data/lib/db_mod/statements/configuration/method_configuration.rb +74 -1
- data/lib/db_mod/statements/configuration/returning.rb +31 -0
- data/lib/db_mod/statements/configuration/single.rb +3 -1
- data/lib/db_mod/statements/default_method_settings.rb +81 -0
- data/lib/db_mod/statements/parameters.rb +13 -0
- data/lib/db_mod/statements/prepared.rb +27 -8
- data/lib/db_mod/statements/statement.rb +10 -5
- data/lib/db_mod/transaction.rb +5 -0
- data/lib/db_mod/version.rb +1 -1
- data/spec/db_mod/statements/configuration/defaults_spec.rb +61 -0
- data/spec/db_mod/statements/configuration/method_configuration_spec.rb +41 -0
- data/spec/db_mod/statements/configuration/returning_spec.rb +69 -0
- data/spec/db_mod/statements/default_method_settings_spec.rb +63 -0
- data/spec/spec_helper.rb +8 -2
- metadata +83 -5
@@ -24,10 +24,12 @@ module DbMod
|
|
24
24
|
}
|
25
25
|
|
26
26
|
# Extend the given method definition with additional
|
27
|
-
# result coercion.
|
27
|
+
# result coercion, if specified using {MethodConfiguration#as}.
|
28
28
|
#
|
29
29
|
# @param definition [Proc] base method definition
|
30
30
|
# @param config [MethodConfiguration] method configuration
|
31
|
+
# @return [Proc] wrapped method definition, or the original
|
32
|
+
# definition if no coercion has been specified
|
31
33
|
def self.extend(definition, config)
|
32
34
|
type = config[:as]
|
33
35
|
return definition if type.nil?
|
@@ -14,6 +14,11 @@ module DbMod
|
|
14
14
|
# RETURNING p, q, r
|
15
15
|
# )) { defaults(5, 6).single(:row) }
|
16
16
|
#
|
17
|
+
# def_prepared(:c, 'SELECT a FROM b WHERE d = $e AND f > $g') do
|
18
|
+
# # procs may be used
|
19
|
+
# defaults g: ->(args) { args[:e] * 10 }
|
20
|
+
# end
|
21
|
+
#
|
17
22
|
# # ...
|
18
23
|
#
|
19
24
|
# a # y => 10
|
@@ -21,6 +26,9 @@ module DbMod
|
|
21
26
|
#
|
22
27
|
# # defaults filled in from the right
|
23
28
|
# b 1, 2 # => { 'p' => '1', 'q' => '2', 'r' => '6' }
|
29
|
+
#
|
30
|
+
# # proc defaults executed when method is called
|
31
|
+
# c e: 2 # === c e: 2, g: 20
|
24
32
|
module Defaults
|
25
33
|
# Extend a method definition by wrapping it with a proc that will
|
26
34
|
# try to fill in any omitted arguments with given defaults.
|
@@ -32,7 +40,10 @@ module DbMod
|
|
32
40
|
# @param defaults [Hash<Symbol,value,Array<value>]
|
33
41
|
# default values, in the same form as they would be provided
|
34
42
|
# to the original method definition except that some values
|
35
|
-
# may be omitted
|
43
|
+
# may be omitted. Defaults may either be constant values, or
|
44
|
+
# a lambda proc may be given, which will be passed the
|
45
|
+
# entirety of the argument list and should return a single
|
46
|
+
# value to be used when none is given
|
36
47
|
# @return [Proc] new method definition, or the same one
|
37
48
|
# if no default values have been appended
|
38
49
|
def self.extend(definition, params, defaults)
|
@@ -57,14 +68,15 @@ module DbMod
|
|
57
68
|
# @param definition [Proc] base method definition,
|
58
69
|
# with parameter validation already attached
|
59
70
|
# @param defaults [Hash<Symbol,value>]
|
60
|
-
#
|
71
|
+
# see {Defaults.extend}
|
72
|
+
# @return [Proc] wrapped method definition
|
61
73
|
def self.extend_named_args_method(definition, defaults)
|
62
74
|
unless defaults.is_a? Hash
|
63
75
|
fail ArgumentError, 'hash expected for defaults'
|
64
76
|
end
|
65
77
|
|
66
78
|
lambda do |*args|
|
67
|
-
Defaults.use_named_defaults(args, defaults)
|
79
|
+
Defaults.use_named_defaults(self, args, defaults)
|
68
80
|
instance_exec(*args, &definition)
|
69
81
|
end
|
70
82
|
end
|
@@ -72,11 +84,16 @@ module DbMod
|
|
72
84
|
# Fill in any missing parameter arguments using default
|
73
85
|
# values where available.
|
74
86
|
#
|
87
|
+
# @param scope [Object] scope to be used for executing
|
88
|
+
# default values that are lambda procedures. Should
|
89
|
+
# be the instance object where the method has been
|
90
|
+
# defined.
|
75
91
|
# @param args [[Hash<Symbol,value>]] method arguments
|
76
92
|
# before processing and validation
|
77
93
|
# @param defaults [Hash<Symbol,value>]
|
78
94
|
# default parameter values
|
79
|
-
|
95
|
+
# @see Defaults.extend_named_args_method
|
96
|
+
def self.use_named_defaults(scope, args, defaults)
|
80
97
|
# Special case when no args given.
|
81
98
|
args << {} if args.empty?
|
82
99
|
|
@@ -85,7 +102,30 @@ module DbMod
|
|
85
102
|
return args unless args.last.is_a? Hash
|
86
103
|
|
87
104
|
defaults.each do |arg, value|
|
88
|
-
|
105
|
+
next if args.last.key? arg
|
106
|
+
|
107
|
+
args.last[arg] = value! value, scope, args.last
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Execute the default 'value' if it is a +Proc+,
|
112
|
+
# or just return it.
|
113
|
+
#
|
114
|
+
# @param value [Proc,Object] default value as specified
|
115
|
+
# by {MethodConfiguration#defaults}
|
116
|
+
# @param scope [Object] scope to be used for executing
|
117
|
+
# default values that are lambda procedures. Should
|
118
|
+
# be the instance object where the method has been
|
119
|
+
# defined.
|
120
|
+
# @param args [Hash,Array] fixed or named argument
|
121
|
+
# list, to be passed to the 'value' if it is a proc
|
122
|
+
# @return [Object] value to be passed to the parametered
|
123
|
+
# database query
|
124
|
+
def self.value!(value, scope, args)
|
125
|
+
if value.is_a? Proc
|
126
|
+
scope.instance_exec(args, &value)
|
127
|
+
else
|
128
|
+
value
|
89
129
|
end
|
90
130
|
end
|
91
131
|
|
@@ -101,6 +141,7 @@ module DbMod
|
|
101
141
|
# by the base method definition
|
102
142
|
# @param defaults [Array]
|
103
143
|
# default parameter values
|
144
|
+
# @return [Proc] wrapped method definition
|
104
145
|
def self.extend_fixed_args_method(definition, arity, defaults)
|
105
146
|
fail ArgumentError, 'too many defaults' if defaults.size > arity
|
106
147
|
|
@@ -112,7 +153,7 @@ module DbMod
|
|
112
153
|
fail ArgumentError, 'too many defaults' if arity.min < 0
|
113
154
|
|
114
155
|
lambda do |*args|
|
115
|
-
Defaults.use_fixed_defaults(args, defaults, arity)
|
156
|
+
Defaults.use_fixed_defaults(self, args, defaults, arity)
|
116
157
|
instance_exec(*args, &definition)
|
117
158
|
end
|
118
159
|
end
|
@@ -120,18 +161,24 @@ module DbMod
|
|
120
161
|
# Fill in any missing parameter arguments using default values
|
121
162
|
# where available.
|
122
163
|
#
|
164
|
+
# @param scope [Object] scope to be used for executing
|
165
|
+
# default values that are lambda procedures. Should
|
166
|
+
# be the instance object where the method has been
|
167
|
+
# defined.
|
123
168
|
# @param args [Array] method arguments
|
124
169
|
# before processing and validation
|
125
170
|
# @param defaults [Array] default parameter values
|
126
171
|
# @param arity [Range<Fixnum>] number of arguments
|
127
172
|
# expected by the base method definition
|
128
|
-
|
173
|
+
# @raise [ArgumentError] if there are not enough or too many args
|
174
|
+
# @see Defaults.extend_fixed_args_method
|
175
|
+
def self.use_fixed_defaults(scope, args, defaults, arity)
|
129
176
|
unless arity.include? args.count
|
130
177
|
fail ArgumentError, "#{args.count} given, (#{arity}) expected"
|
131
178
|
end
|
132
179
|
|
133
180
|
defaults[args.size - arity.min...defaults.size].each do |arg|
|
134
|
-
args << arg
|
181
|
+
args << value!(arg, scope, args)
|
135
182
|
end
|
136
183
|
end
|
137
184
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative 'as'
|
2
2
|
require_relative 'defaults'
|
3
|
+
require_relative 'returning'
|
3
4
|
require_relative 'single'
|
4
5
|
|
5
6
|
module DbMod
|
@@ -14,10 +15,15 @@ module DbMod
|
|
14
15
|
# Creates a new configuration object to be used as the scope for
|
15
16
|
# blocks passed to +def_statement+ and +def_prepared+ declarations.
|
16
17
|
#
|
18
|
+
# @param args [*] one or more +MethodConfiguration+ objects or hashes
|
19
|
+
# from which existing settings will be merged
|
20
|
+
# @param block [proc] block containing method configuration declaration
|
17
21
|
# @yield executes the block using +self+ as scope
|
18
|
-
def initialize(&block)
|
22
|
+
def initialize(*args, &block)
|
19
23
|
@settings = {}
|
20
24
|
instance_exec(&block) if block_given?
|
25
|
+
|
26
|
+
merge_settings(args)
|
21
27
|
end
|
22
28
|
|
23
29
|
# Extend the method by converting results into a given
|
@@ -25,6 +31,8 @@ module DbMod
|
|
25
31
|
# under {DbMod::Statements::Configuration::As}.
|
26
32
|
#
|
27
33
|
# @param type [:csv,:json] output format for the method
|
34
|
+
# may be set to +nil+ or +false+ to un-set any
|
35
|
+
# inherited setting
|
28
36
|
# @return [self]
|
29
37
|
def as(type)
|
30
38
|
one_of! type, Configuration::As::COERCERS
|
@@ -40,6 +48,8 @@ module DbMod
|
|
40
48
|
# more details.
|
41
49
|
#
|
42
50
|
# @param type [Symbol] see {Configuration::Single::COERCERS}
|
51
|
+
# may be set to +nil+ or +false+ to un-set any
|
52
|
+
# inherited setting
|
43
53
|
# @return [self]
|
44
54
|
def single(type)
|
45
55
|
one_of! type, Configuration::Single::COERCERS
|
@@ -57,8 +67,17 @@ module DbMod
|
|
57
67
|
# applied to the right-hand side of the argument list,
|
58
68
|
# as with normal parameter default rules.
|
59
69
|
#
|
70
|
+
# In place of a fixed default value, a lambda +Proc+
|
71
|
+
# may be supplied. In this case the proc will be executed,
|
72
|
+
# given the partially constructed argument list/hash and
|
73
|
+
# scoped against the instance variable where the prepared
|
74
|
+
# or statement method is defined. It should return a single
|
75
|
+
# value to be used for that particular execution of the
|
76
|
+
# method.
|
77
|
+
#
|
60
78
|
# @param defaults [Hash<Symbol,value>,Array<value>]
|
61
79
|
# default parameter values
|
80
|
+
# @return [self]
|
62
81
|
def defaults(*defaults)
|
63
82
|
if defaults.size == 1 && defaults.first.is_a?(Hash)
|
64
83
|
defaults = defaults.first
|
@@ -71,6 +90,24 @@ module DbMod
|
|
71
90
|
self
|
72
91
|
end
|
73
92
|
|
93
|
+
# Declares a block that will be used to transform or replace
|
94
|
+
# the SQL result set before it is returned from the defined
|
95
|
+
# method. The block should accept a single parameter and can
|
96
|
+
# return pretty much whatever it wants.
|
97
|
+
#
|
98
|
+
# The block will be applied after any transforms specified by
|
99
|
+
# {#as} or {#single} have already been applied.
|
100
|
+
#
|
101
|
+
# @param block [Proc] block to be executed on the method's result set
|
102
|
+
# @return [self]
|
103
|
+
def returning(&block)
|
104
|
+
fail ArgumentError, 'block required' unless block_given?
|
105
|
+
|
106
|
+
set_once! :returning, block
|
107
|
+
|
108
|
+
self
|
109
|
+
end
|
110
|
+
|
74
111
|
# Return all given settings in a hash.
|
75
112
|
# @return [Hash]
|
76
113
|
def to_hash
|
@@ -79,12 +116,47 @@ module DbMod
|
|
79
116
|
|
80
117
|
private
|
81
118
|
|
119
|
+
# Merge settings from constructor arguments. Allowed arguments
|
120
|
+
# are hashes, other {MethodConfiguration} objects, or procs that
|
121
|
+
# will be executed with a {MethodConfiguration} object as the
|
122
|
+
# scope.
|
123
|
+
#
|
124
|
+
# @param args [Array] array of objects containing method
|
125
|
+
# configuration settings
|
126
|
+
# @return [Hash] == `@settings`
|
127
|
+
# @raise [ArgumentError] if any args are invalid (see {#arg_to_hash})
|
128
|
+
def merge_settings(args)
|
129
|
+
inherited_settings = {}
|
130
|
+
args.each do |arg|
|
131
|
+
inherited_settings.merge! arg_to_hash arg
|
132
|
+
end
|
133
|
+
|
134
|
+
@settings = inherited_settings.merge @settings
|
135
|
+
end
|
136
|
+
|
137
|
+
# Convert a single constructor argument into a hash of settings
|
138
|
+
# that may be merged into this object's settings hash.
|
139
|
+
#
|
140
|
+
# @param arg [Object] see {#merge_settings}
|
141
|
+
# @return [Hash] a hash of settings derived from the object
|
142
|
+
# @raise [ArgumentError] if an unexpected argement is encountered
|
143
|
+
# @see #merge_settings
|
144
|
+
def arg_to_hash(arg)
|
145
|
+
return arg if arg.is_a? Hash
|
146
|
+
return arg.to_hash if arg.is_a? MethodConfiguration
|
147
|
+
return MethodConfiguration.new(&arg).to_hash if arg.is_a? Proc
|
148
|
+
|
149
|
+
fail ArgumentError, "unknown method setting #{arg.inspect}"
|
150
|
+
end
|
151
|
+
|
82
152
|
# Guard method which asserts that a configuration method
|
83
153
|
# may not be called more than once, or else raises
|
84
154
|
# {DbMod::Exceptions::BadMethodConfiguration}.
|
85
155
|
#
|
86
156
|
# @param setting [Symbol] setting name
|
87
157
|
# @param value [Object] setting value
|
158
|
+
# @raise [Exceptions::BadMethodConfiguration] if the settings has
|
159
|
+
# already been set
|
88
160
|
def set_once!(setting, value)
|
89
161
|
if @settings.key? setting
|
90
162
|
fail Exceptions::BadMethodConfiguration, "#{setting} already called"
|
@@ -98,6 +170,7 @@ module DbMod
|
|
98
170
|
#
|
99
171
|
# @param value [key] configuration setting
|
100
172
|
# @param allowed [Hash] set of allowed configuration settings
|
173
|
+
# @raise [ArgumentError] if the value is not allowed
|
101
174
|
def one_of!(value, allowed)
|
102
175
|
return if allowed.key? value
|
103
176
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module DbMod
|
2
|
+
module Statements
|
3
|
+
module Configuration
|
4
|
+
# Provides functionality backing the {MethodConfiguration#returning}
|
5
|
+
# setting. Allows a block to be declared that may perform additional
|
6
|
+
# processing on the SQL result set (the result of whatever other
|
7
|
+
# result transformations have been specified using
|
8
|
+
# {MethodConfiguration#as} or {MethodConfiguration#single}), and
|
9
|
+
# which may transform or replace entirely the method return value.
|
10
|
+
#
|
11
|
+
# def_statement(:csv_email, 'SELECT * FROM foo') do
|
12
|
+
# as(:csv)
|
13
|
+
# returning { |csv| build_email(csv) }
|
14
|
+
# end
|
15
|
+
module Returning
|
16
|
+
# Extend the given method definition with additional result
|
17
|
+
# coercion, if specified using {MethodConfiguration#returning}.
|
18
|
+
#
|
19
|
+
# @param definition [Proc] base method definition
|
20
|
+
# @param config [MethodConfiguration] method configuration
|
21
|
+
# @return [Proc] wrapped method definition, or the original
|
22
|
+
# definition if no coercion has been specified
|
23
|
+
def self.extend(definition, config)
|
24
|
+
return definition unless config.key? :returning
|
25
|
+
|
26
|
+
Configuration.attach_result_processor definition, config[:returning]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -41,10 +41,12 @@ module DbMod
|
|
41
41
|
}
|
42
42
|
|
43
43
|
# Extend the given method definition with additional
|
44
|
-
# result coercion.
|
44
|
+
# result coercion, if specified using {MethodConfiguration#single.
|
45
45
|
#
|
46
46
|
# @param definition [Proc] base method definition
|
47
47
|
# @param config [MethodConfiguration] method configuration
|
48
|
+
# @return [Proc] wrapped method definition, or the original
|
49
|
+
# definition if no coercion has been specified
|
48
50
|
def self.extend(definition, config)
|
49
51
|
type = config[:single]
|
50
52
|
return definition if type.nil?
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require_relative 'configuration/method_configuration'
|
2
|
+
|
3
|
+
module DbMod
|
4
|
+
module Statements
|
5
|
+
# Allows modules to declare a block of default settings that
|
6
|
+
# will be applied to all methods declared in the module using
|
7
|
+
# +def_prepared+ or +def_statement+. These default settings will
|
8
|
+
# be used for all methods in the module where no overriding
|
9
|
+
# settings are declared with the method definition.
|
10
|
+
#
|
11
|
+
# module JsonAccessors
|
12
|
+
# include DbMod
|
13
|
+
#
|
14
|
+
# default_method_settings do
|
15
|
+
# single(:row).as(:json).returning { |json| do_whatever(json) }
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# # Normal access to instance scope for `returning`
|
19
|
+
# def do_whatever(thing)
|
20
|
+
# # ...
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# def_prepared(:foo, 'SELECT * FROM foo WHERE id = $1')
|
24
|
+
#
|
25
|
+
# def_prepared(:bar, 'SELECT * FROM bar WHERE id = $1')
|
26
|
+
#
|
27
|
+
# # Overrides can be provided for any setting
|
28
|
+
# def_prepared(:all_foos, 'SELECT * FROM foo') { single(false) }
|
29
|
+
# def_prepared(:csv_foo, 'SELECT * FROM foo WHERE id = $1') do
|
30
|
+
# as(:csv)
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# Existing {Configuration::MethodConfiguration} objects may be
|
35
|
+
# passed directly to +default_method_settings+ instead of supplying
|
36
|
+
# a block. This allows configurations to be reused between modules.
|
37
|
+
#
|
38
|
+
# SETTINGS = DbMod::Statements::Configuration::MethodConfiguration.new do
|
39
|
+
# single(:row).as(:json)
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# module A
|
43
|
+
# include DbMod
|
44
|
+
#
|
45
|
+
# default_method_settings(SETTINGS)
|
46
|
+
#
|
47
|
+
# # ...
|
48
|
+
#
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# module B
|
52
|
+
# include A
|
53
|
+
#
|
54
|
+
# # This also works
|
55
|
+
# default_method_settings(A.default_method_settings)
|
56
|
+
#
|
57
|
+
# # ...
|
58
|
+
#
|
59
|
+
# end
|
60
|
+
module DefaultMethodSettings
|
61
|
+
# Defines a module-specific +default_method_settings+ function
|
62
|
+
# for a module that has just had {DbMod} included.
|
63
|
+
#
|
64
|
+
# @param mod [Module] module including {DbMod}
|
65
|
+
# @see DbMod.included
|
66
|
+
def self.setup(mod)
|
67
|
+
class << mod
|
68
|
+
define_method(:default_method_settings) do |*args, &block|
|
69
|
+
unless args.any? || block
|
70
|
+
return @default_method_settings ||=
|
71
|
+
Configuration::MethodConfiguration.new
|
72
|
+
end
|
73
|
+
|
74
|
+
@default_method_settings =
|
75
|
+
Configuration::MethodConfiguration.new(*args, &block)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -30,6 +30,7 @@ module DbMod
|
|
30
30
|
#
|
31
31
|
# @param count [Fixnum] arity of the method being called.
|
32
32
|
# @param args [Array] list of arguments given.
|
33
|
+
# @raise [ArgumentError] if the wrong number of arguments is given
|
33
34
|
def self.valid_fixed_args!(count, args)
|
34
35
|
unless args.size == count
|
35
36
|
fail ArgumentError, "#{args.size} args given, #{count} expected"
|
@@ -51,6 +52,8 @@ module DbMod
|
|
51
52
|
# @param sql [String] statement to prepare
|
52
53
|
# @return [Fixnum,Array<Symbol>] description of
|
53
54
|
# prepared statement's parameters
|
55
|
+
# @raise [ArgumentError] if there is any sort of problem
|
56
|
+
# with the parameters declared in the sql statement
|
54
57
|
def self.parse_params!(sql)
|
55
58
|
Parameters.valid_sql_params! sql
|
56
59
|
numbered = sql.scan NUMBERED_PARAM
|
@@ -81,6 +84,8 @@ module DbMod
|
|
81
84
|
# Raises +ArgumentError+ otherwise.
|
82
85
|
#
|
83
86
|
# @param args [Array<Hash<Symbol>>] method arguments being validated
|
87
|
+
# @raise [ArgumentError] if the arguments passed to the method
|
88
|
+
# do not pass validation
|
84
89
|
def self.wrapped_hash!(args)
|
85
90
|
unless args.size == 1
|
86
91
|
fail ArgumentError, "unexpected arguments: #{args.inspect}"
|
@@ -99,6 +104,7 @@ module DbMod
|
|
99
104
|
# @param expected [Array<Symbol>] the parameters expected to be present
|
100
105
|
# @param args [Hash] given parameters
|
101
106
|
# @return [Array] values to be passed to the prepared statement
|
107
|
+
# @raise [ArgumentError] if any arguments are missing
|
102
108
|
def self.parameter_array(expected, args)
|
103
109
|
expected.map do |arg|
|
104
110
|
fail(ArgumentError, "missing arg #{arg}") unless args.key? arg
|
@@ -110,6 +116,11 @@ module DbMod
|
|
110
116
|
# Fails if any parameters in an sql query aren't
|
111
117
|
# in the expected format. They must either be
|
112
118
|
# lower_case_a_to_z or digits only.
|
119
|
+
#
|
120
|
+
# @param sql [String] sql statement that may or may
|
121
|
+
# not contain parameters
|
122
|
+
# @raise [ArgumentError] if there are any invalid
|
123
|
+
# parameter declarations
|
113
124
|
def self.valid_sql_params!(sql)
|
114
125
|
sql.scan(/\$[A-Za-z0-9_]+/) do |param|
|
115
126
|
unless param =~ NAMED_OR_NUMBERED
|
@@ -123,6 +134,8 @@ module DbMod
|
|
123
134
|
#
|
124
135
|
# @param params [Array<String>] '$1','$2', etc...
|
125
136
|
# @return [Fixnum] parameter count
|
137
|
+
# @raise [ArgumentError] if there are any problems with the
|
138
|
+
# given argument list
|
126
139
|
def self.parse_numbered_params!(params)
|
127
140
|
params.sort!
|
128
141
|
params.uniq!
|