dbee 2.0.0.pre.alpha → 2.1.0.pre.alpha

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ccd40ea06b62b782bc525c069d38b01fc4c486b42507dd8f70e915ba197f01b6
4
- data.tar.gz: a2f2fac76927357e5187d922c3da1ffd8e102430a878f8dedbec3aeb654ad0be
3
+ metadata.gz: acc518f50b6b9e95165347240882ca415194e6b641e68ff292d5b2a6d3937527
4
+ data.tar.gz: 954dbcdfac112f2098e7c1828d8c243369092526ee65179c9819ceaafddc70f7
5
5
  SHA512:
6
- metadata.gz: ea4bfb0f14b33d70b7704ba8006189d5d725f90cf7de89d321d7147ab75c7b068644dd4d483b2aa7c1ee187080ae438096d05856b4c9d2b46265b5548a481d4a
7
- data.tar.gz: ee4ecf4505be3b1911662de5553a3b38606af539a0bfadbc243fb2d38bf6d11310945bf2664d10795c97d0e6a82bc49262ae9550c0c7a867b25a4c1d9f3a4503
6
+ metadata.gz: 5731c83ec9b0ded7f36c6b07d16597f97337240bd65bbec7dc82a9ca7f4de4da0cac9063a6e9aa9cf8199e6f5c32e7ab0a2904684b64bebde9e996f9bceb8e41
7
+ data.tar.gz: c47a038d7fac640a620a13373460bbd8df05a35b209264de1b0fedd727eab072925d0f2cfa82a800ddd2362756f887b0cd227d1e1cd01c98a0334b1c3cd55cd0
@@ -1,6 +1,18 @@
1
- Metrics/LineLength:
1
+ AllCops:
2
+ TargetRubyVersion: 2.5
3
+
4
+ Layout/LineLength:
2
5
  Max: 100
3
6
 
7
+ Lint/RaiseException:
8
+ Enabled: True
9
+
10
+ Lint/StructNewOverride:
11
+ Enabled: True
12
+
13
+ Metrics/AbcSize:
14
+ Max: 16
15
+
4
16
  Metrics/BlockLength:
5
17
  ExcludedMethods:
6
18
  - let
@@ -10,14 +22,17 @@ Metrics/BlockLength:
10
22
  - specify
11
23
  - define
12
24
 
25
+ Metrics/ClassLength:
26
+ Max: 125
27
+
13
28
  Metrics/MethodLength:
14
29
  Max: 25
15
30
 
16
- AllCops:
17
- TargetRubyVersion: 2.4
31
+ Style/HashEachMethods:
32
+ Enabled: True
18
33
 
19
- Metrics/AbcSize:
20
- Max: 16
34
+ Style/HashTransformKeys:
35
+ Enabled: True
21
36
 
22
- Metrics/ClassLength:
23
- Max: 125
37
+ Style/HashTransformValues:
38
+ Enabled: True
@@ -1 +1 @@
1
- 2.6.3
1
+ 2.6.6
@@ -4,9 +4,9 @@ env:
4
4
  language: ruby
5
5
  rvm:
6
6
  # Build on the latest stable of all supported Rubies (https://www.ruby-lang.org/en/downloads/):
7
- - 2.4.6
8
- - 2.5.5
9
- - 2.6.3
7
+ - 2.5.8
8
+ - 2.6.6
9
+ - 2.7.1
10
10
  cache: bundler
11
11
  before_script:
12
12
  - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
@@ -1,3 +1,41 @@
1
+ # 2.1.0 (TBD)
2
+
3
+ ### Additions:
4
+
5
+ * Added Dbee::Query::Field#aggregator (such as ave, min, max, sum, etc.)
6
+ * Added Dbee::Query::Field#filters (allows for doing select column filtering)
7
+
8
+ ### Changes:
9
+
10
+ * Bumped minimum Ruby version to 2.5
11
+
12
+ # 2.0.3 (January 7th, 2020)
13
+
14
+ ### Fixes:
15
+
16
+ * Constant resolution will now explicitly set inherit to false when calling `Object#const_defined?` and `Object#const_get`. This should equate to less false positives. For example:
17
+
18
+ ```ruby
19
+ class A; end
20
+
21
+ module B
22
+ class A; end
23
+ class C; end
24
+ end
25
+ ```
26
+
27
+ If `B::A` is the desired class, it would not be suitable to just declare an association on `A` as that would resolve explicitly to `::A`. It also means C cannot be auto-resolved without prefixing/sharing the namespace with parent association `A`.
28
+
29
+ # 2.0.2 (November 7th, 2019)
30
+
31
+ ### Additions:
32
+
33
+ * As of 2019-11-07, it is not recommended to use Ruby 2.3, but support was requested and added for Ruby 2.3.8. This is subject to being deprecated with next version.
34
+
35
+ ### Fixes:
36
+
37
+ * Constantizing during inflection will now first check Object#const_defined? and if it is missing, it will now call Object#const_missing. This should work better with auto-loaded environments where constant names may collide, since Object#const_get will traverse down the entire hierarchy and may lead to false positives.
38
+
1
39
  # 2.0.0 (September 3rd, 2019)
2
40
 
3
41
  ### Additions:
data/README.md CHANGED
@@ -9,7 +9,7 @@ Dbee arose out of a need for an ad-hoc reporting solution that included:
9
9
  * de-coupling from our main ORM (ActiveRecord)
10
10
  * Rails 5.2.1 and above compatibility
11
11
 
12
- Dbee provides a very simple Data Modeling and Query API's and as such it is not meant to replace a traditional ORM or your data persistence layer, but compliment them. This library's goal is to output the SQL statement needed and **nothing** more.
12
+ Dbee provides very simple Data Modeling and Query API's and as such it is not meant to replace a traditional ORM or your data persistence layer, but compliment them. This library's goal is to output the SQL statement needed and **nothing** more.
13
13
 
14
14
  Other solutions considered:
15
15
 
@@ -123,7 +123,7 @@ The two DSL methods: parent/child are very similar to ActiveRecord's belongs_to/
123
123
 
124
124
  ##### Customizing Inflection Rules
125
125
 
126
- Inflection is provided via the (Dry::Inflector gem)[https://github.com/dry-rb/dry-inflector]. There are options to add custom grammar rules which you can then pass into Dbee. For example:
126
+ Inflection is provided via the [Dry::Inflector gem](https://github.com/dry-rb/dry-inflector). There are options to add custom grammar rules which you can then pass into Dbee. For example:
127
127
 
128
128
  ````ruby
129
129
  Dbee.inflector = Dry::Inflector.new do |inflections|
@@ -407,6 +407,129 @@ sql = Dbee.sql(model, query, provider)
407
407
 
408
408
  The above examples showed how to use a plugin provider, see the plugin provider's documentation for more information about its options and use.
409
409
 
410
+ #### Aggregation
411
+
412
+ Fields can be configured to use aggregation by setting its `aggregator` attribute. For example, say we wanted to count the number of patients per practice:
413
+
414
+ **Data Model**:
415
+
416
+ ````yaml
417
+ name: practice
418
+ models:
419
+ - name: patients
420
+ constraints:
421
+ - type: reference
422
+ name: practice_id
423
+ parent: id
424
+ ````
425
+
426
+ **Query**:
427
+
428
+ ````ruby
429
+ query = {
430
+ fields: [
431
+ {
432
+ key_path: 'id',
433
+ display: 'Practice ID #',
434
+ },
435
+ {
436
+ key_path: 'name',
437
+ display: 'Practice Name',
438
+ },
439
+ {
440
+ key_path: 'patients.id',
441
+ display: 'Total Patients',
442
+ aggregator: :count
443
+ },
444
+ ]
445
+ ````
446
+
447
+ An example of a materialized result would be something akin to:
448
+
449
+ Practice ID # | Practice Name | Total Patients
450
+ ------------- | --------------- | --------------
451
+ 1 | Families Choice | 293
452
+ 2 | Awesome Choice | 2305
453
+ 3 | Best Value | 1200
454
+
455
+ A complete list of aggregator values can be found by inspecting the `Dbee::Query::Field::Aggregator` constant.
456
+
457
+ #### Field/Column Level Filtering & Pivoting
458
+
459
+ Fields can also have filters which provide post-filtering (on the select-level instead of at query-level.) This can be used in conjunction with aggregate functions to provide pivoting. For example:
460
+
461
+ **Data/Schema Example**:
462
+
463
+ patients:
464
+
465
+ id | first | last
466
+ -- | ----- | -----
467
+ 1 | frank | rizzo
468
+
469
+ patient_fields:
470
+
471
+ id | patient_id | key | value
472
+ -- | ---------- | --------------- | -----
473
+ 1 | 1 | dob | 1900-01-01
474
+ 2 | 1 | drivers_license | ABC123
475
+
476
+ **Model Configuration**:
477
+
478
+ ````yaml
479
+ name: patients
480
+ models:
481
+ - name: patient_fields
482
+ constraints:
483
+ - type: reference
484
+ parent: id
485
+ name: patient_id
486
+ ````
487
+
488
+ **Query**:
489
+
490
+ ````ruby
491
+ query = {
492
+ fields: [
493
+ {
494
+ key_path: 'id',
495
+ display: 'ID #'
496
+ },
497
+ {
498
+ key_path: 'first',
499
+ display: 'First Name'
500
+ },
501
+ {
502
+ aggregator: :max,
503
+ key_path: 'patient_fields.value',
504
+ display: 'Date of Birth',
505
+ filters: [
506
+ {
507
+ key_path: 'patient_fields.key',
508
+ value: 'dob'
509
+ }
510
+ ]
511
+ },
512
+ {
513
+ aggregator: :max,
514
+ key_path: 'patient_fields.value',
515
+ display: 'Drivers License #',
516
+ filters: [
517
+ {
518
+ key_path: 'patient_fields.key',
519
+ value: 'drivers_license'
520
+ }
521
+ ]
522
+ }
523
+ }
524
+ }
525
+ ````
526
+
527
+ Executing the query above against the data and model would yield:
528
+
529
+ ID # | First Name | Date of Birth | Drivers License #
530
+ -- | ---------- | ------------- | -----------------
531
+ 1 | frank | 1900-01-01 | ABC123
532
+
410
533
 
411
534
  ## Contributing
412
535
 
@@ -15,20 +15,28 @@ Gem::Specification.new do |s|
15
15
  s.email = ['mruggio@bluemarblepayroll.com']
16
16
  s.files = `git ls-files`.split("\n")
17
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
- s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
18
+ s.bindir = 'exe'
19
+ s.executables = []
19
20
  s.homepage = 'https://github.com/bluemarblepayroll/dbee'
20
21
  s.license = 'MIT'
22
+ s.metadata = {
23
+ 'bug_tracker_uri' => 'https://github.com/bluemarblepayroll/dbee/issues',
24
+ 'changelog_uri' => 'https://github.com/bluemarblepayroll/dbee/blob/master/CHANGELOG.md',
25
+ 'documentation_uri' => 'https://www.rubydoc.info/gems/dbee',
26
+ 'homepage_uri' => s.homepage,
27
+ 'source_code_uri' => s.homepage
28
+ }
21
29
 
22
- s.required_ruby_version = '>= 2.4.6'
30
+ s.required_ruby_version = '>= 2.5'
23
31
 
24
- s.add_dependency('acts_as_hashable', '~>1', '>=1.1.0')
32
+ s.add_dependency('acts_as_hashable', '~>1', '>=1.2.0')
25
33
  s.add_dependency('dry-inflector', '~>0')
26
34
 
27
35
  s.add_development_dependency('guard-rspec', '~>4.7')
28
36
  s.add_development_dependency('pry', '~>0')
29
- s.add_development_dependency('rake', '~> 12')
37
+ s.add_development_dependency('rake', '~> 13')
30
38
  s.add_development_dependency('rspec')
31
- s.add_development_dependency('rubocop', '~>0.74.0')
39
+ s.add_development_dependency('rubocop', '~>0.81.0')
32
40
  s.add_development_dependency('simplecov', '~>0.17.0')
33
- s.add_development_dependency('simplecov-console', '~>0.5.0')
41
+ s.add_development_dependency('simplecov-console', '~>0.7.0')
34
42
  end
File without changes
@@ -12,6 +12,7 @@ require 'dry/inflector'
12
12
  require 'forwardable'
13
13
 
14
14
  require_relative 'dbee/base'
15
+ require_relative 'dbee/constant_resolver'
15
16
  require_relative 'dbee/key_chain'
16
17
  require_relative 'dbee/key_path'
17
18
  require_relative 'dbee/model'
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2019-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Dbee
11
+ # This class is responsible for turning strings and symbols into constants.
12
+ # It does not deal with inflection, simply just constant resolution.
13
+ class ConstantResolver
14
+ # Only use Module constant resolution if a string or symbol was passed in.
15
+ # Any other type is defined as an acceptable constant and is simply returned.
16
+ def constantize(value)
17
+ value.is_a?(String) || value.is_a?(Symbol) ? object_constant(value) : value
18
+ end
19
+
20
+ private
21
+
22
+ # If the constant has been loaded, we can safely use it through const_get.
23
+ # If the constant has not been loaded, we need to defer to const_missing to resolve it.
24
+ # If we blindly call const_get, it may return false positives for namespaced constants
25
+ # or anything nested.
26
+ def object_constant(value)
27
+ if Object.const_defined?(value, false)
28
+ Object.const_get(value, false)
29
+ else
30
+ Object.const_missing(value)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -19,16 +19,17 @@ module Dbee
19
19
  raise ArgumentError, 'inflector is required' unless inflector
20
20
  raise ArgumentError, 'name is required' if name.to_s.empty?
21
21
 
22
- @on_class_name = on_class_name
23
- @inflector = inflector
24
- @name = name.to_s
25
- @opts = opts || {}
22
+ @on_class_name = on_class_name
23
+ @inflector = inflector
24
+ @name = name.to_s
25
+ @opts = opts || {}
26
+ @constant_resolver = ConstantResolver.new
26
27
 
27
28
  freeze
28
29
  end
29
30
 
30
31
  def model_constant
31
- constantize(class_name)
32
+ constant_resolver.constantize(class_name)
32
33
  end
33
34
 
34
35
  def constraints
@@ -37,17 +38,18 @@ module Dbee
37
38
 
38
39
  private
39
40
 
41
+ attr_reader :constant_resolver
42
+
40
43
  def class_name
41
44
  opts[:model] || relative_class_name
42
45
  end
43
46
 
47
+ # This will automatically prefix the name of the module within the current classes
48
+ # hierarchy. If the class does not happen to be in the same namespace then it needs
49
+ # to be explicitly set in the association using 'model' option.
44
50
  def relative_class_name
45
51
  (on_class_name.split('::')[0...-1] + [inflector.classify(name)]).join('::')
46
52
  end
47
-
48
- def constantize(value)
49
- value.is_a?(String) || value.is_a?(Symbol) ? Object.const_get(value) : value
50
- end
51
53
  end
52
54
  end
53
55
  end
@@ -39,9 +39,7 @@ module Dbee
39
39
  Dsl::Association.new(self.name, inflector, name, opts)
40
40
  end
41
41
 
42
- tap do
43
- associations_by_name[name.to_s] = value
44
- end
42
+ tap { associations_by_name[name.to_s] = value }
45
43
  end
46
44
 
47
45
  def table_name
@@ -25,10 +25,8 @@ module Dbee
25
25
 
26
26
  attr_reader :fields, :filters, :limit, :sorters
27
27
 
28
- def_delegator :fields, :sort, :sorted_fields
29
-
28
+ def_delegator :fields, :sort, :sorted_fields
30
29
  def_delegator :filters, :sort, :sorted_filters
31
-
32
30
  def_delegator :sorters, :sort, :sorted_sorters
33
31
 
34
32
  def initialize(fields:, filters: [], limit: nil, sorters: [])
@@ -15,24 +15,55 @@ module Dbee
15
15
  class Field
16
16
  acts_as_hashable
17
17
 
18
- attr_reader :key_path, :display
18
+ module Aggregator
19
+ AVE = :ave
20
+ COUNT = :count
21
+ MAX = :max
22
+ MIN = :min
23
+ SUM = :sum
24
+ end
25
+ include Aggregator
26
+
27
+ attr_reader :aggregator, :display, :filters, :key_path
19
28
 
20
- def initialize(key_path:, display: nil)
29
+ def initialize(
30
+ aggregator: nil,
31
+ display: nil,
32
+ filters: [],
33
+ key_path:
34
+ )
21
35
  raise ArgumentError, 'key_path is required' if key_path.to_s.empty?
22
36
 
23
- @key_path = KeyPath.get(key_path)
24
- @display = (display.to_s.empty? ? key_path : display).to_s
37
+ @aggregator = aggregator ? Aggregator.const_get(aggregator.to_s.upcase.to_sym) : nil
38
+ @display = (display.to_s.empty? ? key_path : display).to_s
39
+ @filters = Filters.array(filters).uniq
40
+ @key_path = KeyPath.get(key_path)
25
41
 
26
42
  freeze
27
43
  end
28
44
 
45
+ def filters?
46
+ filters.any?
47
+ end
48
+
49
+ def aggregator?
50
+ !aggregator.nil?
51
+ end
52
+
29
53
  def hash
30
- "#{key_path}#{display}".hash
54
+ [
55
+ aggregator,
56
+ display,
57
+ filters,
58
+ key_path
59
+ ].hash
31
60
  end
32
61
 
33
62
  def ==(other)
34
63
  other.instance_of?(self.class) &&
64
+ other.aggregator == aggregator &&
35
65
  other.key_path == key_path &&
66
+ other.filters == filters &&
36
67
  other.display == display
37
68
  end
38
69
  alias eql? ==
@@ -8,5 +8,5 @@
8
8
  #
9
9
 
10
10
  module Dbee
11
- VERSION = '2.0.0-alpha'
11
+ VERSION = '2.1.0-alpha'
12
12
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2019-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ require 'spec_helper'
11
+
12
+ describe Dbee::ConstantResolver do
13
+ module A
14
+ class B; end
15
+ class E; end
16
+ end
17
+
18
+ class B; end
19
+
20
+ module C
21
+ class D; end
22
+ class E; end
23
+
24
+ module F
25
+ class G; end
26
+ end
27
+ end
28
+
29
+ it 'resolves nested constant with the same as an ancestor constants sibling' do
30
+ expect(subject.constantize('A::B')).to eq(::A::B)
31
+ end
32
+
33
+ it 'resolves root constant' do
34
+ expect(subject.constantize('B')).to eq(::B)
35
+ end
36
+
37
+ it 'does not resolve constant in a different parent module' do
38
+ expect { subject.constantize('C::B') }.to raise_error(NameError)
39
+ end
40
+
41
+ it 'does not resolve constant in a different parent module' do
42
+ expect { subject.constantize('D') }.to raise_error(NameError)
43
+ end
44
+
45
+ it 'resolves same leaf constants specific to their parents' do
46
+ expect(subject.constantize('A::E')).to eq(::A::E)
47
+ expect(subject.constantize('C::E')).to eq(::C::E)
48
+ end
49
+
50
+ it 'does not resolve constant without its parent' do
51
+ expect { subject.constantize('F') }.to raise_error(NameError)
52
+ end
53
+ end
@@ -10,6 +10,31 @@
10
10
  require 'spec_helper'
11
11
 
12
12
  describe Dbee::Query::Field do
13
+ let(:config) do
14
+ {
15
+ display: 'd',
16
+ key_path: 'a.b.c'
17
+ }
18
+ end
19
+
20
+ let(:config_with_aggregation_and_filters) do
21
+ config.merge(
22
+ aggregator: :ave,
23
+ filters: [
24
+ {
25
+ key_path: 'a.b',
26
+ value: 'something'
27
+ }
28
+ ]
29
+ )
30
+ end
31
+
32
+ subject { described_class.new(config_with_aggregation_and_filters) }
33
+
34
+ let(:subject_without_aggregation_and_filters) do
35
+ described_class.new(config)
36
+ end
37
+
13
38
  it 'should act as hashable' do
14
39
  expect(described_class).to respond_to(:make)
15
40
  expect(described_class).to respond_to(:array)
@@ -24,16 +49,19 @@ describe Dbee::Query::Field do
24
49
  end
25
50
 
26
51
  context 'equality' do
27
- let(:config) { { key_path: 'a.b.c', display: 'd' } }
52
+ specify '#hash produces same output as [aggregator, key_path, and display]' do
53
+ expected = [
54
+ subject.aggregator,
55
+ subject.display,
56
+ subject.filters,
57
+ subject.key_path
58
+ ].hash
28
59
 
29
- subject { described_class.new(config) }
30
-
31
- specify '#hash produces same output as concatenated string hash of key_path and display' do
32
- expect(subject.hash).to eq("#{config[:key_path]}#{config[:display]}".hash)
60
+ expect(subject.hash).to eq(expected)
33
61
  end
34
62
 
35
63
  specify '#== and #eql? compare attributes' do
36
- object2 = described_class.new(config)
64
+ object2 = described_class.new(config_with_aggregation_and_filters)
37
65
 
38
66
  expect(subject).to eq(object2)
39
67
  expect(subject).to eql(object2)
@@ -44,4 +72,24 @@ describe Dbee::Query::Field do
44
72
  expect(subject).not_to eq(nil)
45
73
  end
46
74
  end
75
+
76
+ describe '#aggregator?' do
77
+ it 'returns true if not nil' do
78
+ expect(subject.aggregator?).to be true
79
+ end
80
+
81
+ it 'returns false if nil' do
82
+ expect(subject_without_aggregation_and_filters.aggregator?).to be false
83
+ end
84
+ end
85
+
86
+ describe '#filters?' do
87
+ it 'returns true if at least one filter' do
88
+ expect(subject.filters?).to be true
89
+ end
90
+
91
+ it 'returns false if nil' do
92
+ expect(subject_without_aggregation_and_filters.filters?).to be false
93
+ end
94
+ end
47
95
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dbee
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre.alpha
4
+ version: 2.1.0.pre.alpha
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Ruggio
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-03 00:00:00.000000000 Z
11
+ date: 2020-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: acts_as_hashable
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '1'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 1.1.0
22
+ version: 1.2.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '1'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 1.1.0
32
+ version: 1.2.0
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: dry-inflector
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -78,14 +78,14 @@ dependencies:
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '12'
81
+ version: '13'
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '12'
88
+ version: '13'
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: rspec
91
91
  requirement: !ruby/object:Gem::Requirement
@@ -106,14 +106,14 @@ dependencies:
106
106
  requirements:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: 0.74.0
109
+ version: 0.81.0
110
110
  type: :development
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: 0.74.0
116
+ version: 0.81.0
117
117
  - !ruby/object:Gem::Dependency
118
118
  name: simplecov
119
119
  requirement: !ruby/object:Gem::Requirement
@@ -134,22 +134,21 @@ dependencies:
134
134
  requirements:
135
135
  - - "~>"
136
136
  - !ruby/object:Gem::Version
137
- version: 0.5.0
137
+ version: 0.7.0
138
138
  type: :development
139
139
  prerelease: false
140
140
  version_requirements: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - "~>"
143
143
  - !ruby/object:Gem::Version
144
- version: 0.5.0
144
+ version: 0.7.0
145
145
  description: " Dbee provides a simple-to-use data modeling and query API. The
146
146
  query API can produce SQL using other ORMs, such as Arel/ActiveRecord. The targeted
147
147
  use-case for Dbee is ad-hoc reporting, so the total SQL feature-set that Dbee supports
148
148
  is rather limited.\n"
149
149
  email:
150
150
  - mruggio@bluemarblepayroll.com
151
- executables:
152
- - console
151
+ executables: []
153
152
  extensions: []
154
153
  extra_rdoc_files: []
155
154
  files:
@@ -167,8 +166,10 @@ files:
167
166
  - Rakefile
168
167
  - bin/console
169
168
  - dbee.gemspec
169
+ - exe/.gitkeep
170
170
  - lib/dbee.rb
171
171
  - lib/dbee/base.rb
172
+ - lib/dbee/constant_resolver.rb
172
173
  - lib/dbee/dsl/association.rb
173
174
  - lib/dbee/dsl/association_builder.rb
174
175
  - lib/dbee/dsl/methods.rb
@@ -203,6 +204,7 @@ files:
203
204
  - lib/dbee/query/sorters/descending.rb
204
205
  - lib/dbee/version.rb
205
206
  - spec/dbee/base_spec.rb
207
+ - spec/dbee/constant_resolver_spec.rb
206
208
  - spec/dbee/key_chain_spec.rb
207
209
  - spec/dbee/key_path_spec.rb
208
210
  - spec/dbee/model/constraints/base_spec.rb
@@ -225,7 +227,12 @@ files:
225
227
  homepage: https://github.com/bluemarblepayroll/dbee
226
228
  licenses:
227
229
  - MIT
228
- metadata: {}
230
+ metadata:
231
+ bug_tracker_uri: https://github.com/bluemarblepayroll/dbee/issues
232
+ changelog_uri: https://github.com/bluemarblepayroll/dbee/blob/master/CHANGELOG.md
233
+ documentation_uri: https://www.rubydoc.info/gems/dbee
234
+ homepage_uri: https://github.com/bluemarblepayroll/dbee
235
+ source_code_uri: https://github.com/bluemarblepayroll/dbee
229
236
  post_install_message:
230
237
  rdoc_options: []
231
238
  require_paths:
@@ -234,7 +241,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
234
241
  requirements:
235
242
  - - ">="
236
243
  - !ruby/object:Gem::Version
237
- version: 2.4.6
244
+ version: '2.5'
238
245
  required_rubygems_version: !ruby/object:Gem::Requirement
239
246
  requirements:
240
247
  - - ">"
@@ -247,6 +254,7 @@ specification_version: 4
247
254
  summary: Adhoc Reporting SQL Generator
248
255
  test_files:
249
256
  - spec/dbee/base_spec.rb
257
+ - spec/dbee/constant_resolver_spec.rb
250
258
  - spec/dbee/key_chain_spec.rb
251
259
  - spec/dbee/key_path_spec.rb
252
260
  - spec/dbee/model/constraints/base_spec.rb