sbf-dm-aggregates 1.3.0.beta

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d13671554c17a83be45ab2b8fa3735b520f14415b7b3166bbfd9d4480a1a48d3
4
+ data.tar.gz: 6fbbcc1e4c927ee75754ca0d312c0f92daf2090028f5509c165d7e8bfe9d622a
5
+ SHA512:
6
+ metadata.gz: 43dc0503cca2e6976e4acdd733f87715da349ed1bd0ca6f511c0e303142b0b12ffa7d070f25e214fe3063e6166372710a8eabd9835669eb06f1e939a9abd00bd
7
+ data.tar.gz: 398142dfece8549b452a490452cc740d2d8756e969d15cd934ce01194d1a566d5510d7b6652a49b4fd426a234e44865c0a7c71ed9defdff9b0528f78a9797042
data/.gitignore ADDED
@@ -0,0 +1,38 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## Rubinius
17
+ *.rbc
18
+
19
+ ## RubyMine
20
+ .idea
21
+
22
+ ## PROJECT::GENERAL
23
+ *.gem
24
+ coverage
25
+ rdoc
26
+ pkg
27
+ tmp
28
+ doc
29
+ log
30
+ .yardoc
31
+ measurements
32
+
33
+ ## BUNDLER
34
+ .bundle
35
+ Gemfile.*
36
+
37
+ ## PROJECT::SPECIFIC
38
+ spec/db/
data/.rspec ADDED
@@ -0,0 +1,5 @@
1
+ --colour
2
+ --order rand
3
+ --format documentation
4
+ --profile
5
+ --backtrace
data/.rubocop.yml ADDED
@@ -0,0 +1,468 @@
1
+ #require: rubocop-performance
2
+
3
+ AllCops:
4
+ TargetRubyVersion: 2.7
5
+
6
+ Gemspec/DeprecatedAttributeAssignment:
7
+ Enabled: true
8
+
9
+ Gemspec/DevelopmentDependencies: # new in 1.44
10
+ Enabled: true
11
+
12
+ Gemspec/RequireMFA:
13
+ Enabled: false
14
+
15
+ Layout/LineContinuationLeadingSpace: # new in 1.31
16
+ Enabled: true
17
+
18
+ Layout/LineContinuationSpacing: # new in 1.31
19
+ Enabled: true
20
+
21
+ Layout/LineEndStringConcatenationIndentation:
22
+ Enabled: true
23
+
24
+ Layout/LineLength:
25
+ Max: 150
26
+
27
+ Layout/MultilineOperationIndentation:
28
+ EnforcedStyle: aligned
29
+
30
+ Layout/SpaceAfterSemicolon:
31
+ Enabled: true
32
+
33
+ Layout/SpaceBeforeBrackets: # new in 1.7
34
+ Enabled: true
35
+
36
+ Layout/SpaceInsideHashLiteralBraces:
37
+ EnforcedStyle: no_space
38
+
39
+ Lint/AmbiguousAssignment: # new in 1.7
40
+ Enabled: true
41
+
42
+ Lint/AmbiguousBlockAssociation:
43
+ Enabled: true
44
+ Exclude:
45
+ - 'spec/**/*'
46
+
47
+ Lint/AmbiguousOperatorPrecedence: # new in 1.21
48
+ Enabled: true
49
+
50
+ Lint/AmbiguousRange: # new in 1.19
51
+ Enabled: true
52
+
53
+ Lint/ConstantDefinitionInBlock:
54
+ Enabled: true
55
+
56
+ Lint/ConstantOverwrittenInRescue: # new in 1.31
57
+ Enabled: true
58
+
59
+ Lint/DeprecatedConstants: # new in 1.8
60
+ Enabled: true
61
+
62
+ Lint/DuplicateBranch: # new in 1.3
63
+ Enabled: true
64
+
65
+ Lint/DuplicateMagicComment: # new in 1.37
66
+ Enabled: true
67
+
68
+ Lint/DuplicateMatchPattern: # new in 1.50
69
+ Enabled: true
70
+
71
+ Lint/DuplicateMethods:
72
+ Enabled: false
73
+
74
+ Lint/DuplicateRegexpCharacterClassElement: # new in 1.1
75
+ Enabled: true
76
+
77
+ Lint/EmptyBlock:
78
+ Enabled: true
79
+
80
+ Lint/EmptyClass: # new in 1.3
81
+ Enabled: true
82
+
83
+ Lint/EmptyFile:
84
+ Enabled: true
85
+
86
+ Lint/EmptyInPattern: # new in 1.16
87
+ Enabled: true
88
+
89
+ Lint/FloatComparison:
90
+ Enabled: true
91
+
92
+ Lint/IncompatibleIoSelectWithFiberScheduler: # new in 1.21
93
+ Enabled: true
94
+
95
+ Lint/ItWithoutArgumentsInBlock: # new in 1.59
96
+ Enabled: true
97
+
98
+ Lint/LambdaWithoutLiteralBlock: # new in 1.8
99
+ Enabled: true
100
+
101
+ Lint/LiteralAssignmentInCondition: # new in 1.58
102
+ Enabled: true
103
+
104
+ Lint/MissingSuper:
105
+ Enabled: true
106
+
107
+ Lint/MixedCaseRange: # new in 1.53
108
+ Enabled: true
109
+
110
+ Lint/NoReturnInBeginEndBlocks: # new in 1.2
111
+ Enabled: true
112
+
113
+ Lint/NonAtomicFileOperation: # new in 1.31
114
+ Enabled: true
115
+
116
+ Lint/NumberedParameterAssignment: # new in 1.9
117
+ Enabled: true
118
+
119
+ Lint/OrAssignmentToConstant: # new in 1.9
120
+ Enabled: true
121
+
122
+ Lint/RaiseException:
123
+ Enabled: false
124
+
125
+ Lint/RedundantDirGlobSort: # new in 1.8
126
+ Enabled: true
127
+
128
+ Lint/RedundantRegexpQuantifiers: # new in 1.53
129
+ Enabled: true
130
+
131
+ Lint/RefinementImportMethods: # new in 1.27
132
+ Enabled: true
133
+
134
+ Lint/RequireRangeParentheses: # new in 1.32
135
+ Enabled: true
136
+
137
+ Lint/RequireRelativeSelfPath: # new in 1.22
138
+ Enabled: true
139
+
140
+ Lint/SafeNavigationChain:
141
+ Enabled: true
142
+ AllowedMethods:
143
+ - present?
144
+ - blank?
145
+ - presence
146
+ - try
147
+ - try!
148
+ - empty?
149
+ - nil?
150
+ - blank?
151
+
152
+ Lint/SymbolConversion:
153
+ Enabled: false
154
+
155
+ Lint/ToEnumArguments: # new in 1.1
156
+ Enabled: true
157
+
158
+ Lint/TripleQuotes: # new in 1.9
159
+ Enabled: true
160
+
161
+ Lint/UnexpectedBlockArity: # new in 1.5
162
+ Enabled: true
163
+
164
+ Lint/UnmodifiedReduceAccumulator: # new in 1.1
165
+ Enabled: true
166
+
167
+ Lint/UnreachableLoop:
168
+ Enabled: true
169
+
170
+ Lint/UselessRescue: # new in 1.43
171
+ Enabled: true
172
+
173
+ Lint/UselessRuby2Keywords: # new in 1.23
174
+ Enabled: true
175
+
176
+ Metrics/AbcSize:
177
+ Enabled: false
178
+
179
+ Metrics/BlockLength:
180
+ Enabled: false
181
+
182
+ Metrics/BlockNesting:
183
+ Max: 4
184
+
185
+ Metrics/ClassLength:
186
+ Enabled: false
187
+
188
+ Metrics/CollectionLiteralLength: # new in 1.47
189
+ Enabled: true
190
+
191
+ Metrics/CyclomaticComplexity:
192
+ Max: 15
193
+
194
+ Metrics/MethodLength:
195
+ Max: 30
196
+
197
+ Metrics/ModuleLength:
198
+ Enabled: false
199
+
200
+ Metrics/ParameterLists:
201
+ Max: 5
202
+ CountKeywordArgs: false
203
+
204
+ Metrics/PerceivedComplexity:
205
+ Max: 20
206
+
207
+ Naming/BlockForwarding: # new in 1.24
208
+ Enabled: true
209
+
210
+ Naming/HeredocDelimiterNaming:
211
+ Enabled: false
212
+
213
+ Naming/MethodParameterName:
214
+ AllowedNames: [a, _, id]
215
+
216
+ Naming/VariableNumber:
217
+ Enabled: true
218
+ # EnforcedStyle: snake_case
219
+
220
+ #Performance/CollectionLiteralInLoop:
221
+ # Enabled: true
222
+ #
223
+ #Performance/RangeInclude:
224
+ # Enabled: false
225
+ #
226
+ #Performance/RedundantEqualityComparisonBlock:
227
+ # Enabled: true
228
+
229
+ Security/CompoundHash: # new in 1.28
230
+ Enabled: true
231
+
232
+ Security/IoMethods: # new in 1.22
233
+ Enabled: true
234
+
235
+ Style/AccessModifierDeclarations:
236
+ EnforcedStyle: inline
237
+
238
+ Style/Alias:
239
+ Enabled: false
240
+ EnforcedStyle: prefer_alias_method
241
+
242
+ Style/ArgumentsForwarding: # new in 1.1
243
+ Enabled: true
244
+
245
+ Style/ArrayIntersect: # new in 1.40
246
+ Enabled: true
247
+
248
+ Style/CaseLikeIf:
249
+ Enabled: true
250
+
251
+ Style/CollectionCompact: # new in 1.2
252
+ Enabled: true
253
+
254
+ Style/CombinableLoops:
255
+ Enabled: true
256
+
257
+ Style/ComparableClamp: # new in 1.44
258
+ Enabled: true
259
+
260
+ Style/ConcatArrayLiterals: # new in 1.41
261
+ Enabled: true
262
+
263
+ Style/DataInheritance: # new in 1.49
264
+ Enabled: true
265
+
266
+ Style/DirEmpty: # new in 1.48
267
+ Enabled: true
268
+
269
+ Style/Documentation:
270
+ Enabled: false
271
+
272
+ Style/DocumentDynamicEvalDefinition: # new in 1.1
273
+ Enabled: true
274
+
275
+ Style/EmptyHeredoc: # new in 1.32
276
+ Enabled: true
277
+
278
+ Style/EndlessMethod: # new in 1.8
279
+ Enabled: true
280
+
281
+ Style/EnvHome: # new in 1.29
282
+ Enabled: true
283
+
284
+ Style/ExactRegexpMatch: # new in 1.51
285
+ Enabled: true
286
+
287
+ Style/FetchEnvVar:
288
+ Enabled: true
289
+
290
+ Style/FileEmpty: # new in 1.48
291
+ Enabled: true
292
+
293
+ Style/FileRead: # new in 1.24
294
+ Enabled: true
295
+
296
+ Style/FileWrite: # new in 1.24
297
+ Enabled: true
298
+
299
+ Style/FormatStringToken:
300
+ Enabled: false
301
+
302
+ Style/FrozenStringLiteralComment:
303
+ Enabled: false
304
+
305
+ Style/HashConversion: # new in 1.10
306
+ Enabled: true
307
+
308
+ Style/HashExcept: # new in 1.7
309
+ Enabled: true
310
+
311
+ Style/HashLikeCase:
312
+ Enabled: true
313
+
314
+ Style/HashSyntax:
315
+ Enabled: true
316
+ EnforcedShorthandSyntax: consistent
317
+
318
+ Style/IfWithBooleanLiteralBranches: # new in 1.9
319
+ Enabled: true
320
+
321
+ Style/InPatternThen: # new in 1.16
322
+ Enabled: true
323
+
324
+ Style/MagicCommentFormat: # new in 1.35
325
+ Enabled: true
326
+
327
+ Style/MapCompactWithConditionalBlock: # new in 1.30
328
+ Enabled: true
329
+
330
+ Style/MapToHash: # new in 1.24
331
+ Enabled: true
332
+
333
+ Style/MapToSet: # new in 1.42
334
+ Enabled: true
335
+
336
+ Style/MinMaxComparison: # new in 1.42
337
+ Enabled: true
338
+
339
+ Style/MixinGrouping:
340
+ Enabled: true
341
+ EnforcedStyle: grouped
342
+
343
+ Style/MultilineInPatternThen: # new in 1.16
344
+ Enabled: true
345
+
346
+ Style/NegatedIfElseCondition: # new in 1.2
347
+ Enabled: true
348
+
349
+ Style/NestedFileDirname: # new in 1.26
350
+ Enabled: true
351
+
352
+ Style/NilLambda: # new in 1.3
353
+ Enabled: true
354
+
355
+ Style/NumberedParameters: # new in 1.22
356
+ Enabled: true
357
+
358
+ Style/NumberedParametersLimit: # new in 1.22
359
+ Enabled: true
360
+
361
+ Style/NumericPredicate:
362
+ Enabled: false
363
+
364
+ Style/ObjectThen: # new in 1.28
365
+ Enabled: true
366
+
367
+ Style/OpenStructUse:
368
+ Enabled: false
369
+
370
+ Style/OperatorMethodCall: # new in 1.37
371
+ Enabled: true
372
+
373
+ Style/OptionalBooleanParameter:
374
+ Enabled: true
375
+
376
+ Style/PercentLiteralDelimiters:
377
+ PreferredDelimiters:
378
+ default: ()
379
+ '%i': '()'
380
+ '%I': '()'
381
+ '%r': '{}'
382
+ '%w': '()'
383
+ '%W': '()'
384
+
385
+ Style/QuotedSymbols: # new in 1.16
386
+ Enabled: true
387
+
388
+ Style/RedundantArgument: # new in 1.4
389
+ Enabled: true
390
+
391
+ Style/RedundantArrayConstructor: # new in 1.52
392
+ Enabled: true
393
+
394
+ Style/RedundantConstantBase: # new in 1.40
395
+ Enabled: true
396
+
397
+ Style/RedundantCurrentDirectoryInPath: # new in 1.53
398
+ Enabled: true
399
+
400
+ Style/RedundantDoubleSplatHashBraces: # new in 1.41
401
+ Enabled: true
402
+
403
+ Style/RedundantEach: # new in 1.38
404
+ Enabled: true
405
+
406
+ Style/RedundantFilterChain: # new in 1.52
407
+ Enabled: true
408
+
409
+ Style/RedundantHeredocDelimiterQuotes: # new in 1.45
410
+ Enabled: true
411
+
412
+ Style/RedundantInitialize: # new in 1.27
413
+ Enabled: true
414
+
415
+ Style/RedundantLineContinuation: # new in 1.49
416
+ Enabled: true
417
+
418
+ Style/RedundantParentheses:
419
+ Enabled: true
420
+
421
+ Style/RedundantRegexpArgument: # new in 1.53
422
+ Enabled: true
423
+
424
+ Style/RedundantRegexpConstructor: # new in 1.52
425
+ Enabled: true
426
+
427
+ Style/RedundantSelfAssignmentBranch: # new in 1.19
428
+ Enabled: true
429
+
430
+ Style/RedundantStringEscape: # new in 1.37
431
+ Enabled: true
432
+
433
+ Style/RegexpLiteral:
434
+ Enabled: true
435
+ EnforcedStyle: mixed
436
+
437
+ Style/RescueStandardError:
438
+ EnforcedStyle: implicit
439
+
440
+ Style/ReturnNilInPredicateMethodDefinition: # new in 1.53
441
+ Enabled: true
442
+
443
+ Style/SelectByRegexp: # new in 1.22
444
+ Enabled: true
445
+
446
+ Style/SingleArgumentDig:
447
+ Enabled: true
448
+
449
+ Style/SignalException:
450
+ EnforcedStyle: only_raise
451
+
452
+ Style/SingleLineDoEndBlock: # new in 1.57
453
+ Enabled: true
454
+
455
+ Style/StringChars: # new in 1.12
456
+ Enabled: true
457
+
458
+ Style/SuperWithArgsParentheses: # new in 1.58
459
+ Enabled: true
460
+
461
+ Style/SwapValues: # new in 1.1
462
+ Enabled: true
463
+
464
+ Style/TernaryParentheses:
465
+ EnforcedStyle: require_parentheses_when_complex
466
+
467
+ Style/YAMLFileRead: # new in 1.53
468
+ Enabled: true
data/Gemfile ADDED
@@ -0,0 +1,68 @@
1
+ require 'pathname'
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ SOURCE = ENV.fetch('SOURCE', :git).to_sym
8
+ REPO_POSTFIX = (SOURCE == :path) ? '' : '.git'
9
+ DATAMAPPER = (SOURCE == :path) ? Pathname(__FILE__).dirname.parent : 'https://github.com/firespring'
10
+ DM_VERSION = '~> 1.3.0.beta'.freeze
11
+ DO_VERSION = '~> 0.10.17'.freeze
12
+ DM_DO_ADAPTERS = %w(sqlite postgres mysql oracle sqlserver).freeze
13
+ CURRENT_BRANCH = ENV.fetch('GIT_BRANCH', 'master')
14
+
15
+ # development dependencies
16
+ gem 'pry'
17
+ gem 'pry-byebug'
18
+ gem 'rake'
19
+ gem 'rspec'
20
+ gem 'simplecov'
21
+
22
+ options = {}
23
+ options[SOURCE] = "#{DATAMAPPER}/dm-core#{REPO_POSTFIX}"
24
+ options[:branch] = CURRENT_BRANCH unless SOURCE == :path
25
+ gem 'sbf-dm-core', DM_VERSION, options.dup
26
+
27
+ platforms :mri_18 do
28
+ group :quality do
29
+ gem 'yard'
30
+ gem 'yardstick'
31
+ end
32
+ end
33
+
34
+ group :datamapper do
35
+ adapters = ENV['ADAPTER'] || ENV.fetch('ADAPTERS', nil)
36
+ adapters = adapters.to_s.tr(',', ' ').split.uniq - %w(in_memory)
37
+
38
+ if (do_adapters = DM_DO_ADAPTERS & adapters).any?
39
+ do_options = {}
40
+ if ENV['DO_GIT'] == 'true'
41
+ do_options = options.dup
42
+ do_options[SOURCE] = "#{DATAMAPPER}/datamapper-do#{REPO_POSTFIX}"
43
+ end
44
+ gem 'sbf-data_objects', DO_VERSION, do_options.dup
45
+
46
+ do_adapters.each do |adapter|
47
+ adapter = 'sqlite3' if adapter == 'sqlite'
48
+
49
+ gem "sbf-do_#{adapter}", DO_VERSION, do_options.dup
50
+ end
51
+
52
+ options[SOURCE] = "#{DATAMAPPER}/dm-do-adapter#{REPO_POSTFIX}"
53
+ gem 'sbf-dm-do-adapter', DM_VERSION, options.dup
54
+ end
55
+
56
+ adapters.each do |adapter|
57
+ options[SOURCE] = "#{DATAMAPPER}/dm-#{adapter}-adapter#{REPO_POSTFIX}"
58
+ gem "sbf-dm-#{adapter}-adapter", DM_VERSION, options.dup
59
+ end
60
+
61
+ plugins = ENV['PLUGINS'] || ENV.fetch('PLUGIN', nil)
62
+ plugins = plugins.to_s.tr(',', ' ').split.push('dm-migrations').uniq
63
+
64
+ plugins.each do |plugin|
65
+ options[SOURCE] = "#{DATAMAPPER}/#{plugin}#{REPO_POSTFIX}"
66
+ gem "sbf-#{plugin}", DM_VERSION, options.dup
67
+ end
68
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Foy Savas
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.rdoc ADDED
@@ -0,0 +1,45 @@
1
+ dm-aggregates
2
+ =============
3
+
4
+ DataMapper plugin providing support for aggregates, functions on collections and datasets.
5
+
6
+ It provides the following functions:
7
+
8
+ == count
9
+
10
+ Count results (given the conditions)
11
+
12
+ Friend.count # returns count of all friends
13
+ Friend.count(:age.gt => 18) # returns count of all friends older then 18
14
+ Friend.count(:conditions => [ 'gender = ?', 'female' ]) # returns count of all your female friends
15
+ Friend.count(:address) # returns count of all friends with an address (NULL values are not included)
16
+ Friend.count(:address, :age.gt => 18) # returns count of all friends with an address that are older then 18
17
+ Friend.count(:address, :conditions => [ 'gender = ?', 'female' ]) # returns count of all your female friends with an address
18
+
19
+ == min
20
+
21
+ Get the lowest value of a property
22
+
23
+ Friend.min(:age) # returns the age of the youngest friend
24
+ Friend.min(:age, :conditions => [ 'gender = ?', 'female' ]) # returns the age of the youngest female friends
25
+
26
+ == max
27
+
28
+ Get the highest value of a property
29
+
30
+ Friend.max(:age) # returns the age of the oldest friend
31
+ Friend.max(:age, :conditions => [ 'gender = ?', 'female' ]) # returns the age of the oldest female friends
32
+
33
+ == avg
34
+
35
+ Get the average value of a property
36
+
37
+ Friend.avg(:age) # returns the average age of friends
38
+ Friend.avg(:age, :conditions => [ 'gender = ?', 'female' ]) # returns the average age of the female friends
39
+
40
+ == sum
41
+
42
+ Get the total value of a property
43
+
44
+ Friend.sum(:age) # returns total age of all friends
45
+ Friend.sum(:age, :conditions => [ 'gender = ?', 'female' ]) # returns the total age of all female friends
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ FileList['tasks/**/*.rake'].each { |task| import task }
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.3.0.beta
@@ -0,0 +1,20 @@
1
+ require File.expand_path('lib/dm-aggregates/version', __dir__)
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.authors = ['Emmanuel Gomez']
5
+ gem.email = ['emmanuel.gomez@gmail.com']
6
+ gem.summary = 'DataMapper plugin providing support for aggregates on collections'
7
+ gem.description = 'DataMapper plugin providing support for aggregates, functions on collections and datasets.'
8
+ gem.license = 'Nonstandard'
9
+ gem.homepage = 'https://datamapper.org'
10
+
11
+ gem.files = `git ls-files`.split("\n")
12
+ gem.extra_rdoc_files = %w(LICENSE README.rdoc)
13
+
14
+ gem.name = 'sbf-dm-aggregates'
15
+ gem.require_paths = ['lib']
16
+ gem.version = DataMapper::Aggregates::VERSION
17
+ gem.required_ruby_version = '>= 2.7.8'
18
+
19
+ gem.add_runtime_dependency('sbf-dm-core', '~> 1.3.0.beta')
20
+ end