scopiform 0.1.4 → 0.2.4

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: 1434c2a39865b2f08dcb918354dad1523cd53d9aa8363f4a699fbcb9ddec537c
4
- data.tar.gz: 7930cc5a93d5f71dfe6e3ced466b3d39b2d68730b65528e2630febbeb8b5388d
3
+ metadata.gz: 60fdf69684da8b4a16efc5b52b69bcae18d30824b844fb57fdc3219780ed2894
4
+ data.tar.gz: fbc86f9e966127b7c64546adc46b805e1c78caaa6d8aa9c49acceaeea7120639
5
5
  SHA512:
6
- metadata.gz: d67daa8c043e7edaaf459da62baa64108b2554f81867ca0a24d97d52816a2b887aaa93249def97b1650d102d98d42149414f5e6740c4687ac2762c96b0d0001c
7
- data.tar.gz: 8b6d543af8a98acf91c5f8d0c4de23a812c40b0304c755412427d860d4ab7ab9baabbe477ead4d43a16a3eca1c61107012ff9a963688b889d029d8e851302a19
6
+ metadata.gz: 6165fbab6073d4ec637aed25cfb58d2f13ef7ecd590724b17374f47e9718850c62740655768f11f1e1b7f14a119a30eba863897c6189b620844e03b0c54fa0ee
7
+ data.tar.gz: 5730438bea472073e31a9f37d45ce3de8e066615e9dea0b0fa99af5bb955d5b3192cd068898c6367515d959d84354a202c90d405f5a08f488f8f07f342439aa7
data/README.md CHANGED
@@ -24,7 +24,7 @@ $ gem install scopiform
24
24
  ## Public ActiveRecord Methods
25
25
  :aliases_for
26
26
  :apply_filters
27
- :apply_orders
27
+ :apply_sorts
28
28
  :association
29
29
  :attribute_aliases_inverted
30
30
  :auto_scope_add
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support/concern'
4
+ require 'scopiform/scope_context'
4
5
 
5
6
  module Scopiform
6
7
  module AssociationScopes
@@ -11,12 +12,25 @@ module Scopiform
11
12
  end
12
13
 
13
14
  module ClassMethods
14
- def reflection_added(_name, reflection)
15
- setup_association_auto_scopes(reflection)
15
+ def scopiform_association_scope(association, method, value, ctx:)
16
+ is_root = ctx.nil?
17
+ ctx = ScopeContext.from(ctx)
18
+ ctx.set(arel_table) if is_root || ctx.arel_table.blank?
19
+
20
+ ctx.association = association
21
+ ctx.build_joins
22
+
23
+ applied = ctx.association.klass.send(method, value, ctx: ScopeContext.from(ctx).set(ctx.association_arel_table))
24
+
25
+ if is_root
26
+ ctx.scopes.reduce(joins(ctx.joins).merge(applied)) { |chain, scope| chain.merge(scope) }
27
+ else
28
+ ctx.scopes.reduce(all.merge(applied)) { |chain, scope| chain.merge(scope) }
29
+ end
16
30
  end
17
31
 
18
- def scopiform_joins(*args, **kargs)
19
- respond_to?(:left_outer_joins) ? left_outer_joins(*args, **kargs) : eager_load(*args, **kargs)
32
+ def reflection_added(_name, reflection)
33
+ setup_association_auto_scopes(reflection)
20
34
  end
21
35
 
22
36
  private
@@ -30,30 +44,22 @@ module Scopiform
30
44
  def setup_association_auto_scopes(association)
31
45
  auto_scope_add(
32
46
  association.name,
33
- Proc.new { |value, joins: nil|
34
- is_root = joins.nil?
35
- joins = {} if is_root
36
-
37
- joins[association.name] ||= {}
38
- applied = association.klass.apply_filters(value, joins: joins[association.name])
39
-
40
- if is_root
41
- scopiform_joins(joins).merge(applied)
42
- else
43
- all.merge(applied)
44
- end
47
+ proc { |value, ctx: nil|
48
+ scopiform_association_scope(association, :apply_filters, value, ctx: ctx)
45
49
  },
46
50
  suffix: '_is',
47
51
  argument_type: :hash
48
52
  )
49
53
 
50
- # Ordering
54
+ # Sorting
51
55
  auto_scope_add(
52
56
  association.name,
53
- Proc.new { |value| scopiform_joins(association.name).merge(association.klass.apply_orders(value)) },
54
- prefix: 'order_by_',
57
+ proc { |value, ctx: nil|
58
+ scopiform_association_scope(association, :apply_sorts, value, ctx: ctx)
59
+ },
60
+ prefix: 'sort_by_',
55
61
  argument_type: :hash,
56
- type: :order
62
+ type: :sort
57
63
  )
58
64
  end
59
65
  end
@@ -21,24 +21,24 @@ module Scopiform
21
21
 
22
22
  auto_scope_add(
23
23
  name,
24
- Proc.new { |value| where(name_sym => value) },
24
+ proc { |value, ctx: nil, **| where(scopiform_arel(ctx)[name_sym].eq(value)) },
25
25
  suffix: '_is',
26
26
  argument_type: type
27
27
  )
28
28
  auto_scope_add(
29
29
  name,
30
- Proc.new { |value| where.not(name_sym => value) },
30
+ proc { |value, ctx: nil, **| where.not(scopiform_arel(ctx)[name_sym].eq(value)) },
31
31
  suffix: '_not',
32
32
  argument_type: type
33
33
  )
34
34
 
35
- # Ordering
35
+ # Sorting
36
36
  auto_scope_add(
37
37
  name,
38
- ->(value = :asc) { order(name_sym => value) },
39
- prefix: 'order_by_',
38
+ proc { |value = :asc, ctx: nil, **| order(scopiform_arel(ctx)[name_sym].send(value.to_s.downcase)) },
39
+ prefix: 'sort_by_',
40
40
  argument_type: :string,
41
- type: :order
41
+ type: :sort
42
42
  )
43
43
  end
44
44
  end
@@ -8,6 +8,8 @@ module Scopiform
8
8
  extend ActiveSupport::Concern
9
9
 
10
10
  module ClassMethods
11
+ attr_accessor :scopiform_ctx
12
+
11
13
  def auto_scopes
12
14
  @auto_scopes || []
13
15
  end
@@ -18,16 +20,14 @@ module Scopiform
18
20
  end
19
21
 
20
22
  def auto_scope?(name)
21
- auto_scopes.find { |scope| scope.name == name }
23
+ auto_scopes.find { |scope| scope.name == name }.present?
22
24
  end
23
25
 
24
26
  def auto_scope_add(attribute, block, prefix: nil, suffix: nil, **options)
25
- scope_name = "#{prefix}#{attribute}#{suffix}".underscore
26
- scope_name_sym = scope_name.to_sym
27
- scope scope_name_sym, block
28
-
29
27
  scope_definition = auto_scope_add_definition(attribute, prefix: prefix, suffix: suffix, **options)
30
28
 
29
+ scope scope_definition.name, block
30
+
31
31
  aliases_for(attribute).each do |alias_name|
32
32
  auto_scope_for_alias(alias_name, scope_definition)
33
33
  end
@@ -41,8 +41,31 @@ module Scopiform
41
41
  end
42
42
  end
43
43
 
44
+ def enum(definitions)
45
+ super(definitions)
46
+
47
+ definitions.each_key { |name| update_scope_to_enum(name) }
48
+ end
49
+
44
50
  private
45
51
 
52
+ def update_scope_to_enum(name)
53
+ scopes = auto_scopes_by_attribute(name)
54
+
55
+ scopes.each do |scope|
56
+ if scope.options[:type].blank?
57
+ argument_type = scope.options[:argument_type]
58
+ scope.options[:argument_type] = argument_type.is_a?(Array) ? [:string] : :string if argument_type
59
+ scope.options[:type] = :enum
60
+ end
61
+
62
+ if scope.options[:remove_for_enum]
63
+ singleton_class.send(:remove_method, scope.name)
64
+ @auto_scopes.delete(scope)
65
+ end
66
+ end
67
+ end
68
+
46
69
  def auto_scope_add_definition(attribute, **options)
47
70
  definition = ScopeDefinition.new(attribute, **options)
48
71
  @auto_scopes ||= []
@@ -52,10 +75,13 @@ module Scopiform
52
75
  end
53
76
 
54
77
  def auto_scope_for_alias(alias_name, scope_definition)
55
- scope_name = "#{scope_definition.prefix}#{scope_definition.attribute}#{scope_definition.suffix}".underscore
56
- alias_method_name = "#{scope_definition.prefix}#{alias_name}#{scope_definition.suffix}".underscore
57
- singleton_class.send(:alias_method, alias_method_name.to_sym, scope_name.to_sym)
58
- auto_scope_add_definition(alias_name, prefix: scope_definition.prefix, suffix: scope_definition.suffix, **scope_definition.options)
78
+ alias_scope_definition = scope_definition.dup
79
+ alias_scope_definition.attribute = alias_name.to_sym
80
+
81
+ @auto_scopes ||= []
82
+ @auto_scopes << alias_scope_definition
83
+
84
+ singleton_class.send(:alias_method, alias_scope_definition.name, scope_definition.name)
59
85
  end
60
86
  end
61
87
  end
@@ -1,39 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support/concern'
4
+ require 'scopiform/scope_context'
4
5
 
5
6
  module Scopiform
6
7
  module Filters
7
8
  extend ActiveSupport::Concern
8
9
 
9
10
  module ClassMethods
10
- def apply_filters(filters_hash, injecting: all, joins: nil)
11
- filters_hash.keys.inject(injecting) { |out, filter_name| resolve_filter(out, filter_name, filters_hash[filter_name], joins) }
11
+ def apply_filters(filters_hash, injecting: all, ctx: nil)
12
+ filters_hash.keys.inject(injecting) { |out, filter_name| resolve_filter(out, filter_name, filters_hash[filter_name], ctx: ctx) }
12
13
  end
13
14
 
14
- def apply_orders(orders_hash, injecting = all)
15
- orders_hash.keys.inject(injecting) { |out, order_name| resolve_order(out, order_name, orders_hash[order_name]) }
15
+ def apply_sorts(sorts_hash, injecting = all, ctx: nil)
16
+ sorts_hash.keys.inject(injecting) { |out, sort_name| resolve_sort(out, sort_name, sorts_hash[sort_name], ctx: ctx) }
16
17
  end
17
18
 
18
19
  private
19
20
 
20
- def resolve_filter(out, filter_name, filter_argument, joins)
21
+ def resolve_filter(out, filter_name, filter_argument, ctx:)
21
22
  if filter_name.to_s.casecmp('OR').zero?
22
- or_joins = {}
23
+ ctx ||= ScopeContext.new
24
+ ctx.joins = []
23
25
 
24
26
  return (
25
27
  filter_argument
26
- .map { |or_filters_hash| apply_filters(or_filters_hash, injecting: out, joins: or_joins) }
27
- .map { |a| a.scopiform_joins(or_joins) }
28
+ .map { |or_filters_hash| apply_filters(or_filters_hash, injecting: out, ctx: ctx) }
29
+ .map { |a| a.joins(ctx.joins) }
28
30
  .inject { |chain, applied| chain.or(applied) }
29
31
  )
30
32
  end
31
- out.send(filter_name, filter_argument, joins: joins)
33
+ out.send(filter_name, filter_argument, ctx: ctx)
32
34
  end
33
35
 
34
- def resolve_order(out, order_name, order_argument)
35
- method_name = "order_by_#{order_name}"
36
- out.send(method_name, order_argument)
36
+ def resolve_sort(out, sort_name, sort_argument, ctx:)
37
+ method_name = "sort_by_#{sort_name}"
38
+ out.send(method_name, sort_argument, ctx: ctx)
37
39
  end
38
40
  end
39
41
  end
@@ -43,7 +43,7 @@ module Scopiform
43
43
  def association(name)
44
44
  name = resolve_alias(name)
45
45
  association = reflect_on_association(name)
46
-
46
+
47
47
  association.klass if association.present?
48
48
  association
49
49
  rescue NameError
@@ -51,6 +51,14 @@ module Scopiform
51
51
  nil
52
52
  end
53
53
 
54
+ def enum_attribute?(name)
55
+ defined_enums.include? name.to_s
56
+ end
57
+
58
+ def scopiform_arel(ctx)
59
+ ctx&.arel_table || arel_table
60
+ end
61
+
54
62
  protected
55
63
 
56
64
  def safe_columns
@@ -1,9 +1,9 @@
1
1
  module Scopiform
2
2
  module ReflectionPlugin
3
- def add_reflection(ar, name, reflection)
4
- super(ar, name, reflection)
3
+ def add_reflection(record, name, reflection)
4
+ super(record, name, reflection)
5
5
 
6
- ar.reflection_added(name, reflection) if ar.respond_to? :reflection_added
6
+ record.reflection_added(name, reflection) if record.respond_to? :reflection_added
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,81 @@
1
+ module Scopiform
2
+ class ScopeContext
3
+ attr_accessor :association, :arel_table, :association_arel_table, :joins, :ancestors, :scopes
4
+
5
+ def self.from(ctx)
6
+ created = new
7
+
8
+ if ctx
9
+ created.set(ctx.arel_table)
10
+ created.association = ctx.association
11
+ created.association_arel_table = ctx.association_arel_table
12
+ created.joins = ctx.joins
13
+ created.ancestors = [*ctx.ancestors]
14
+ end
15
+
16
+ created
17
+ end
18
+
19
+ def initialize
20
+ @joins = []
21
+ @ancestors = []
22
+ @scopes = []
23
+ end
24
+
25
+ def set(arel_table)
26
+ @arel_table = arel_table
27
+
28
+ self
29
+ end
30
+
31
+ def build_joins
32
+ loop do
33
+ if association.through_reflection
34
+ source_reflection_name = association.source_reflection_name
35
+ self.association = association.through_reflection
36
+ end
37
+
38
+ ancestors << association.name.to_s.pluralize
39
+ self.association_arel_table = association.klass.arel_table.alias(alias_name)
40
+
41
+ joins << create_join
42
+
43
+ if association.scope.present? && association.scope.arity.zero?
44
+ association.klass.scopiform_ctx = ScopeContext.from(self).set(association_arel_table)
45
+ scopes << association.klass.instance_exec(&association.scope)
46
+ association.klass.scopiform_ctx = nil
47
+ end
48
+
49
+ break if source_reflection_name.blank?
50
+
51
+ self.association = association.klass.reflect_on_association(source_reflection_name)
52
+ self.arel_table = association_arel_table
53
+ end
54
+
55
+ joins
56
+ end
57
+
58
+ def alias_name
59
+ ancestors.join('_').downcase
60
+ end
61
+
62
+ private
63
+
64
+ def conditions
65
+ # Rails 4 join_keys has arity of 1, expecting a klass as an argument
66
+ keys = association.method(:join_keys).arity == 1 ? association.join_keys(association.klass) : association.join_keys
67
+ [*keys.foreign_key]
68
+ .zip([*keys.key])
69
+ .map { |foreign, primary| arel_table[foreign].eq(association_arel_table[primary]) }
70
+ .reduce { |acc, cond| acc.and(cond) }
71
+ end
72
+
73
+ def create_join
74
+ arel_table.create_join(
75
+ association_arel_table,
76
+ association_arel_table.create_on(conditions),
77
+ Arel::Nodes::OuterJoin
78
+ )
79
+ end
80
+ end
81
+ end
@@ -10,7 +10,18 @@ module Scopiform
10
10
  end
11
11
 
12
12
  def name
13
- "#{prefix}#{attribute}#{suffix}".underscore
13
+ name_for(attribute)
14
+ end
15
+
16
+ def name_for(attribute_name)
17
+ "#{prefix}#{attribute_name}#{suffix}".underscore.to_sym
18
+ end
19
+
20
+ def dup
21
+ duplicate = super
22
+ duplicate.options = options.dup
23
+
24
+ duplicate
14
25
  end
15
26
  end
16
27
  end
@@ -20,46 +20,45 @@ module Scopiform
20
20
  name = column.name
21
21
  name_sym = name.to_sym
22
22
  type = column.type
23
- arel_column = arel_table[name]
24
23
 
25
24
  auto_scope_add(
26
25
  name,
27
- Proc.new { |value| where(name_sym => value) },
26
+ proc { |*value, ctx: nil, **| where(scopiform_arel(ctx)[name_sym].in(value.flatten)) },
28
27
  suffix: '_in',
29
28
  argument_type: [type]
30
29
  )
31
30
 
32
31
  auto_scope_add(
33
32
  name,
34
- Proc.new { |value| where.not(name_sym => value) },
33
+ proc { |*value, ctx: nil, **| where.not(scopiform_arel(ctx)[name_sym].in(value.flatten)) },
35
34
  suffix: '_not_in',
36
35
  argument_type: [type]
37
36
  )
38
37
 
39
38
  auto_scope_add(
40
39
  name,
41
- Proc.new { |value| where(arel_column.lt(value)) },
40
+ proc { |value, ctx: nil, **| where(scopiform_arel(ctx)[name_sym].lt(value)) },
42
41
  suffix: '_lt',
43
42
  argument_type: type
44
43
  )
45
44
 
46
45
  auto_scope_add(
47
46
  name,
48
- Proc.new { |value| where(arel_column.lteq(value)) },
47
+ proc { |value, ctx: nil, **| where(scopiform_arel(ctx)[name_sym].lteq(value)) },
49
48
  suffix: '_lte',
50
49
  argument_type: type
51
50
  )
52
51
 
53
52
  auto_scope_add(
54
53
  name,
55
- Proc.new { |value| where(arel_column.gt(value)) },
54
+ proc { |value, ctx: nil, **| where(scopiform_arel(ctx)[name_sym].gt(value)) },
56
55
  suffix: '_gt',
57
56
  argument_type: type
58
57
  )
59
58
 
60
59
  auto_scope_add(
61
60
  name,
62
- Proc.new { |value| where(arel_column.gteq(value)) },
61
+ proc { |value, ctx: nil, **| where(scopiform_arel(ctx)[name_sym].gteq(value)) },
63
62
  suffix: '_gte',
64
63
  argument_type: type
65
64
  )
@@ -13,65 +13,101 @@ module Scopiform
13
13
  module ClassMethods
14
14
  private
15
15
 
16
+ def cast_to_text(arel_column)
17
+ cast_to = connection.adapter_name.downcase.starts_with?('mysql') ? 'CHAR' : 'TEXT'
18
+ Arel::Nodes::NamedFunction.new(
19
+ 'CAST',
20
+ [arel_column.as(cast_to)]
21
+ )
22
+ end
23
+
16
24
  def setup_string_and_number_auto_scopes
17
25
  string_numbers = Helpers::STRING_TYPES + Helpers::NUMBER_TYPES
18
- string_number_columns = safe_columns.select { |column| string_numbers.include? column.type }
26
+ string_number_columns = safe_columns.select do |column|
27
+ string_numbers.include?(column.type) && !enum_attribute?(column.name)
28
+ end
19
29
  string_number_columns.each do |column|
20
30
  name = column.name
21
31
  type = column.type
22
- arel_column = arel_table[name]
32
+ cast = false
23
33
 
24
34
  # Numeric values don't work properly with `.matches`. Using workaround
25
35
  # https://coderwall.com/p/qtgvdq/using-arel_table-for-ilike-yes-even-with-integers
26
- if Helpers::NUMBER_TYPES.include? column.type
27
- arel_column = Arel::Nodes::NamedFunction.new(
28
- 'CAST',
29
- [arel_column.as('TEXT')]
30
- )
31
-
36
+ if Helpers::NUMBER_TYPES.include? type
37
+ cast = true
32
38
  type = :string
33
39
  end
34
40
 
35
41
  auto_scope_add(
36
42
  name,
37
- Proc.new { |value| where(arel_column.matches("%#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}%")) },
43
+ proc { |value, ctx: nil, **|
44
+ arel_column = scopiform_arel(ctx)[name]
45
+ arel_column = cast_to_text(arel_column) if cast
46
+ where(arel_column.matches("%#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}%"))
47
+ },
38
48
  suffix: '_contains',
39
- type: type
49
+ argument_type: type,
50
+ remove_for_enum: true
40
51
  )
41
52
 
42
53
  auto_scope_add(
43
54
  name,
44
- Proc.new { |value| where.not(arel_column.matches("%#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}%")) },
55
+ proc { |value, ctx: nil, **|
56
+ arel_column = scopiform_arel(ctx)[name]
57
+ arel_column = cast_to_text(arel_column) if cast
58
+ where.not(arel_column.matches("%#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}%"))
59
+ },
45
60
  suffix: '_not_contains',
46
- type: type
61
+ argument_type: type,
62
+ remove_for_enum: true
47
63
  )
48
64
 
49
65
  auto_scope_add(
50
66
  name,
51
- Proc.new { |value| where(arel_column.matches("#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}%")) },
67
+ proc { |value, ctx: nil, **|
68
+ arel_column = scopiform_arel(ctx)[name]
69
+ arel_column = cast_to_text(arel_column) if cast
70
+ where(arel_column.matches("#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}%"))
71
+ },
52
72
  suffix: '_starts_with',
53
- type: type
73
+ argument_type: type,
74
+ remove_for_enum: true
54
75
  )
55
76
 
56
77
  auto_scope_add(
57
78
  name,
58
- Proc.new { |value| where.not(arel_column.matches("#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}%")) },
79
+ proc { |value, ctx: nil, **|
80
+ arel_column = scopiform_arel(ctx)[name]
81
+ arel_column = cast_to_text(arel_column) if cast
82
+ where.not(arel_column.matches("#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}%"))
83
+ },
59
84
  suffix: '_not_starts_with',
60
- type: type
85
+ argument_type: type,
86
+ remove_for_enum: true
61
87
  )
62
88
 
63
89
  auto_scope_add(
64
90
  name,
65
- Proc.new { |value| where(arel_column.matches("%#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}")) },
91
+ proc { |value, ctx: nil, **|
92
+ arel_column = scopiform_arel(ctx)[name]
93
+ arel_column = cast_to_text(arel_column) if cast
94
+ where(arel_column.matches("%#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}"))
95
+ },
66
96
  suffix: '_ends_with',
67
- type: type
97
+ argument_type: type,
98
+ remove_for_enum: true
68
99
  )
69
100
 
70
101
  auto_scope_add(
71
102
  name,
72
- Proc.new { |value| where.not(arel_column.matches("%#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}")) },
103
+ proc { |value, ctx: nil, **|
104
+ arel_column = scopiform_arel(ctx)[name]
105
+ arel_column = cast_to_text(arel_column) if cast
106
+ where.not(arel_column.matches("%#{ActiveRecord::Base.sanitize_sql_like(value.to_s)}"))
107
+ },
73
108
  suffix: '_not_ends_with',
74
- type: type
109
+ argument_type: type,
110
+ remove_for_enum: true
75
111
  )
76
112
  end
77
113
  end
@@ -1,3 +1,3 @@
1
1
  module Scopiform
2
- VERSION = '0.1.4'
2
+ VERSION = '0.2.4'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scopiform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - jayce.pulsipher
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-15 00:00:00.000000000 Z
11
+ date: 2020-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: warning
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: composite_primary_keys
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  description:
56
84
  email:
57
85
  - jayce.pulsipher@3-form.com
@@ -69,6 +97,7 @@ files:
69
97
  - lib/scopiform/filters.rb
70
98
  - lib/scopiform/helpers.rb
71
99
  - lib/scopiform/reflection_plugin.rb
100
+ - lib/scopiform/scope_context.rb
72
101
  - lib/scopiform/scope_definition.rb
73
102
  - lib/scopiform/string_number_date_scopes.rb
74
103
  - lib/scopiform/string_number_scopes.rb