acts_as_recursive_tree 2.0.2 → 2.2.1

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
- SHA1:
3
- metadata.gz: 064f977e7f4e77083f3a967fce16c6c47fc29ee9
4
- data.tar.gz: 2b8e5949381e248c33034868ee816126367e19bd
2
+ SHA256:
3
+ metadata.gz: ea1cf22b09ed91c55f3388b8c794a3d820eb353896feca3df3cd16bfadd1e1fb
4
+ data.tar.gz: 55605034be64624f710175f2bc5714273f87e39124799fa4952dfb8425f9719d
5
5
  SHA512:
6
- metadata.gz: 91e3f8cdf111f4efed5618391d806ccab6e5bdb2c8e5325862292e23a67d990aaa86de199dfffabade3f0ee6a18ba501d9032e9a700b9dba567eb75e0d6265ec
7
- data.tar.gz: cb6576280d42539dc013e96b07414cae5ad49b416a28518c742731fb43697ec9fc997da237cf8f0cbc5f53c01bf530fd37353bb3108cf9e1e06313c2174aecc9
6
+ metadata.gz: 4e357b5809c1aa3c28789af9c81d6ac17739f04b40cec8e43a6ecb2b690ea69e9d3752aab7cf3579fb38042b387132c9e02ddf5b3facc54b1206b33eb184d194
7
+ data.tar.gz: 97a0ecfa41d4085f2a6a14a964be479747f4857af9400e9412699f6b7a21324c2af3632bba5831576ac08156fa8ff01ff06025e09c46b0e51fe64221b8a8bef6
data/.gitignore CHANGED
@@ -14,4 +14,5 @@
14
14
  mkmf.log
15
15
  /.idea
16
16
  db.log
17
- test.sqlite3
17
+ test.sqlite3
18
+ /gemfiles
data/Appraisals ADDED
@@ -0,0 +1,26 @@
1
+ appraise "ar-50" do
2
+ ruby '~> 2'
3
+
4
+ gem 'activerecord', '~> 5.0.0'
5
+ gem 'sqlite3', '~> 1.3.6'
6
+ end
7
+
8
+ appraise "ar-51" do
9
+ ruby '~> 2'
10
+
11
+ gem 'activerecord', '~> 5.1.0'
12
+ end
13
+
14
+ appraise "ar-52" do
15
+ ruby '~> 2'
16
+
17
+ gem 'activerecord', '~> 5.2.0'
18
+ end
19
+
20
+ appraise "ar-60" do
21
+ gem 'activerecord', '~> 6.0.0'
22
+ end
23
+
24
+ appraise "ar-61" do
25
+ gem 'activerecord', '~> 6.1.0'
26
+ end
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ### Version 2.2.0
2
+ - Rails 6.0 support
3
+
4
+ ### Version 2.1.1
5
+ - Enabled subselect query when using depth
6
+ - new QueryOption query_strategy for forcing a specific strategy (:join, :subselect)
7
+
8
+ ### Version 2.1.0
9
+ - BUGFIX association self_and_siblings not working
10
+ - BUGFIX primary_key of model is retrieved on first usage and not on setup
11
+ - NEW when no ordering/depth is required, then use subselect instead of joining the temp table
12
+
1
13
  ### Version 2.0.2
2
14
  - fix for condition relation was executed before merging
3
15
 
@@ -6,8 +6,8 @@ require 'acts_as_recursive_tree/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'acts_as_recursive_tree'
8
8
  spec.version = ActsAsRecursiveTree::VERSION
9
- spec.authors = ['Wolfgang Wedelich-John']
10
- spec.email = ['wolfgang.wedelich@1und1.de']
9
+ spec.authors = ['Wolfgang Wedelich-John', 'Willem Mulder']
10
+ spec.email = ['wolfgang.wedelich@1und1.de', '14mRh4X0r@gmail.com']
11
11
  spec.summary = %q{Drop in replacement for acts_as_tree but using recursive queries}
12
12
  spec.description = %q{
13
13
  This is a ruby gem that provides drop in replacement for acts_as_tree but makes use of SQL recursive statement. Be sure to have a DBMS that supports recursive queries when using this gem (e.g. PostgreSQL or SQLite). }
@@ -20,11 +20,11 @@ Gem::Specification.new do |spec|
20
20
  spec.test_files = spec.files.grep(%r{^spec/})
21
21
  spec.require_paths = ['lib']
22
22
 
23
- spec.add_runtime_dependency 'activerecord', '>= 5.0.0', '< 6.0.0'
23
+ spec.add_runtime_dependency 'activerecord', '>= 5.0.0', '< 6.2.0'
24
24
 
25
- spec.add_development_dependency 'bundler', '~> 1.7'
26
25
  spec.add_development_dependency 'database_cleaner', '~> 1.5'
27
26
  spec.add_development_dependency 'rake', '~> 10.0'
28
27
  spec.add_development_dependency 'rspec-rails', '~> 3.5'
29
28
  spec.add_development_dependency 'sqlite3', '~> 1.3'
29
+ spec.add_development_dependency 'appraisal', '~> 2.4'
30
30
  end
@@ -4,6 +4,7 @@ require_relative 'acts_as_recursive_tree/railtie' if defined?(Rails)
4
4
  module ActsAsRecursiveTree
5
5
  extend ActiveSupport::Autoload
6
6
 
7
+ autoload :Config
7
8
  autoload :ActsMacro
8
9
  autoload :Model
9
10
  autoload :Associations
@@ -1,5 +1,3 @@
1
- require 'ostruct'
2
-
3
1
  module ActsAsRecursiveTree
4
2
  module ActsMacro
5
3
 
@@ -11,11 +9,10 @@ module ActsAsRecursiveTree
11
9
  def recursive_tree(parent_key: :parent_id, parent_type_column: nil)
12
10
 
13
11
  class_attribute :_recursive_tree_config
14
- self._recursive_tree_config = OpenStruct.new(
15
- primary_key: self.primary_key.to_sym,
12
+ self._recursive_tree_config = Config.new(
13
+ model_class: self,
16
14
  parent_key: parent_key.to_sym,
17
- parent_type_column: parent_type_column.try(:to_sym),
18
- depth_column: :recursive_depth
15
+ parent_type_column: parent_type_column.try(:to_sym)
19
16
  )
20
17
 
21
18
  include ActsAsRecursiveTree::Model
@@ -17,9 +17,9 @@ module ActsAsRecursiveTree
17
17
  inverse_of: :parent
18
18
 
19
19
  has_many :self_and_siblings,
20
- class_name: self.base_class.to_s,
21
- primary_key: self._recursive_tree_config.parent_key,
22
- foreign_key: self._recursive_tree_config.parent_key
20
+ through: :parent,
21
+ source: :children,
22
+ class_name: self.base_class.to_s
23
23
  end
24
24
  end
25
25
  end
@@ -5,6 +5,7 @@ module ActsAsRecursiveTree
5
5
  autoload :Values
6
6
  autoload :DepthCondition
7
7
  autoload :QueryOptions
8
+ autoload :Strategy
8
9
  autoload :RelationBuilder
9
10
  autoload :Descendants
10
11
  autoload :Ancestors
@@ -1,10 +1,7 @@
1
1
  module ActsAsRecursiveTree
2
2
  module Builders
3
3
  class Ancestors < RelationBuilder
4
-
5
- def build_join_condition
6
- travers_loc_table[parent_key].eq(base_table[primary_key])
7
- end
4
+ self.traversal_strategy = ActsAsRecursiveTree::Builders::Strategy::Ancestor
8
5
 
9
6
  def get_query_options(_)
10
7
  opts = super
@@ -1,9 +1,7 @@
1
1
  module ActsAsRecursiveTree
2
2
  module Builders
3
3
  class Descendants < RelationBuilder
4
- def build_join_condition
5
- base_table[parent_key].eq(travers_loc_table[primary_key])
6
- end
4
+ self.traversal_strategy = ActsAsRecursiveTree::Builders::Strategy::Descendant
7
5
  end
8
6
  end
9
7
  end
@@ -2,7 +2,7 @@ module ActsAsRecursiveTree
2
2
  module Builders
3
3
  class Leaves < Descendants
4
4
 
5
- def create_select_manger
5
+ def create_select_manger(column = nil)
6
6
  select_manager = super
7
7
 
8
8
  select_manager.where(
@@ -1,14 +1,20 @@
1
1
  module ActsAsRecursiveTree
2
2
  module Builders
3
+ #
4
+ # Constructs the Arel necessary for recursion.
5
+ #
3
6
  class RelationBuilder
4
7
 
5
8
  def self.build(klass, ids, exclude_ids: false, &block)
6
9
  new(klass, ids, exclude_ids: exclude_ids, &block).build
7
10
  end
8
11
 
12
+ class_attribute :traversal_strategy, instance_writer: false
13
+
9
14
  attr_reader :klass, :ids, :recursive_temp_table, :travers_loc_table, :without_ids
10
15
  mattr_reader(:random) { Random.new }
11
16
 
17
+ # Delegators for easier accessing config and query options
12
18
  delegate :primary_key, :depth_column, :parent_key, :parent_type_column, to: :@config
13
19
  delegate :depth_present?, :depth, :condition, :ensure_ordering, to: :@query_opts
14
20
 
@@ -25,6 +31,13 @@ module ActsAsRecursiveTree
25
31
  @travers_loc_table = Arel::Table.new("traverse_#{rand_int}_loc")
26
32
  end
27
33
 
34
+ #
35
+ # Constructs a new QueryOptions and yield it to the proc if one is present.
36
+ # Subclasses may override this method to provide sane defaults.
37
+ #
38
+ # @param proc [Proc] a proc or nil
39
+ #
40
+ # @return [ActsAsRecursiveTree::Options::QueryOptions] the new QueryOptions instance
28
41
  def get_query_options(proc)
29
42
  opts = ActsAsRecursiveTree::Options::QueryOptions.new
30
43
 
@@ -38,18 +51,9 @@ module ActsAsRecursiveTree
38
51
  end
39
52
 
40
53
  def build
41
- final_select_mgr = base_table.join(
42
- create_select_manger.as(recursive_temp_table.name)
43
- ).on(
44
- base_table[primary_key].eq(recursive_temp_table[primary_key])
45
- )
46
-
47
- relation = klass.joins(final_select_mgr.join_sources)
54
+ relation = Strategy.for_query_options(@query_opts).build(self)
48
55
 
49
56
  relation = apply_except_id(relation)
50
- relation = apply_depth(relation)
51
- relation = apply_order(relation)
52
-
53
57
  relation
54
58
  end
55
59
 
@@ -58,19 +62,22 @@ module ActsAsRecursiveTree
58
62
  relation.where(ids.apply_negated_to(base_table[primary_key]))
59
63
  end
60
64
 
61
- def apply_depth(relation)
62
- return relation unless depth_present?
65
+ def apply_depth(select_manager)
66
+ return select_manager unless depth_present?
63
67
 
64
- relation.where(depth.apply_to(recursive_temp_table[depth_column]))
68
+ select_manager.where(depth.apply_to(travers_loc_table[depth_column]))
65
69
  end
66
70
 
67
- def apply_order(relation)
68
- return relation unless ensure_ordering
69
- relation.order(recursive_temp_table[depth_column].asc)
70
- end
71
+ def create_select_manger(column = nil)
72
+ projections = if column
73
+ travers_loc_table[column]
74
+ else
75
+ Arel.star
76
+ end
71
77
 
72
- def create_select_manger
73
- travers_loc_table.project(Arel.star).with(:recursive, build_cte_table)
78
+ select_mgr = travers_loc_table.project(projections).with(:recursive, build_cte_table)
79
+
80
+ apply_depth(select_mgr)
74
81
  end
75
82
 
76
83
  def build_cte_table
@@ -93,7 +100,9 @@ module ActsAsRecursiveTree
93
100
  end
94
101
 
95
102
  def build_union_select
96
- join_condition = apply_parent_type_column(build_join_condition)
103
+ join_condition = apply_parent_type_column(
104
+ traversal_strategy.build(self)
105
+ )
97
106
 
98
107
  select_manager = base_table.join(travers_loc_table).on(join_condition)
99
108
 
@@ -124,11 +133,6 @@ module ActsAsRecursiveTree
124
133
  return relation if condition.nil?
125
134
  relation.merge(condition)
126
135
  end
127
-
128
- def build_join_condition
129
- raise 'not implemented'
130
- end
131
-
132
136
  end
133
137
  end
134
138
  end
@@ -0,0 +1,30 @@
1
+ module ActsAsRecursiveTree
2
+ module Builders
3
+ #
4
+ # Strategy module for different strategies of how to build the resulting query.
5
+ #
6
+ module Strategy
7
+ extend ActiveSupport::Autoload
8
+
9
+ autoload :Join
10
+ autoload :Subselect
11
+
12
+ autoload :Descendant
13
+ autoload :Ancestor
14
+
15
+ #
16
+ # Returns a Strategy appropriate for query_opts
17
+ #
18
+ # @param query_opts [ActsAsRecursiveTree::Options::QueryOptions]
19
+ #
20
+ # @return a strategy class best suited for the opts
21
+ def self.for_query_options(query_opts)
22
+ if query_opts.ensure_ordering || query_opts.query_strategy == :join
23
+ Join
24
+ else
25
+ Subselect
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,17 @@
1
+ module ActsAsRecursiveTree
2
+ module Builders
3
+ module Strategy
4
+ #
5
+ # Strategy for building ancestors relation
6
+ #
7
+ module Ancestor
8
+ #
9
+ # Builds the relation
10
+ #
11
+ def self.build(builder)
12
+ builder.travers_loc_table[builder.parent_key].eq(builder.base_table[builder.primary_key])
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module ActsAsRecursiveTree
2
+ module Builders
3
+ module Strategy
4
+ #
5
+ # Strategy for building descendants relation
6
+ #
7
+ module Descendant
8
+ #
9
+ # Builds the relation
10
+ #
11
+ def self.build(builder)
12
+ builder.base_table[builder.parent_key].eq(builder.travers_loc_table[builder.primary_key])
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,33 @@
1
+ module ActsAsRecursiveTree
2
+ module Builders
3
+ module Strategy
4
+ #
5
+ # Build a relation using an INNER JOIN.
6
+ #
7
+ module Join
8
+ #
9
+ # Builds the relation.
10
+ #
11
+ # @param builder [ActsAsRecursiveTree::Builders::RelationBuilder]
12
+ # @return [ActiveRecord::Relation]
13
+ def self.build(builder)
14
+ final_select_mgr = builder.base_table.join(
15
+ builder.create_select_manger.as(builder.recursive_temp_table.name)
16
+ ).on(
17
+ builder.base_table[builder.primary_key].eq(builder.recursive_temp_table[builder.primary_key])
18
+ )
19
+
20
+ relation = builder.klass.joins(final_select_mgr.join_sources)
21
+
22
+ relation = apply_order(builder, relation)
23
+ relation
24
+ end
25
+
26
+ def self.apply_order(builder, relation)
27
+ return relation unless builder.ensure_ordering
28
+ relation.order(builder.recursive_temp_table[builder.depth_column].asc)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,23 @@
1
+ module ActsAsRecursiveTree
2
+ module Builders
3
+ module Strategy
4
+ #
5
+ # Strategy for building a relation using an WHERE ID IN(...).
6
+ #
7
+ module Subselect
8
+ #
9
+ # Builds the relation.
10
+ #
11
+ # @param builder [ActsAsRecursiveTree::Builders::RelationBuilder]
12
+ # @return [ActiveRecord::Relation]
13
+ def self.build(builder)
14
+ builder.klass.where(
15
+ builder.base_table[builder.primary_key].in(
16
+ builder.create_select_manger(builder.primary_key)
17
+ )
18
+ )
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ module ActsAsRecursiveTree
2
+ #
3
+ # Stores the configuration of one Model class
4
+ #
5
+ class Config
6
+ attr_reader :parent_key, :parent_type_column, :depth_column
7
+
8
+ def initialize(model_class:, parent_key:, parent_type_column:, depth_column: :recursive_depth)
9
+ @model_class = model_class
10
+ @parent_key = parent_key
11
+ @parent_type_column = parent_type_column
12
+ @depth_column = depth_column
13
+ end
14
+
15
+ #
16
+ # Returns the primary key for the model class.
17
+ # @return [Symbol]
18
+ def primary_key
19
+ @primary_key ||= @model_class.primary_key.to_sym
20
+ end
21
+ end
22
+ end
@@ -2,8 +2,10 @@ module ActsAsRecursiveTree
2
2
  module Options
3
3
  class QueryOptions
4
4
 
5
+ STRATEGIES = %i[subselect, join].freeze
6
+
5
7
  attr_accessor :condition
6
- attr_reader :ensure_ordering
8
+ attr_reader :ensure_ordering, :query_strategy
7
9
 
8
10
  def depth
9
11
  @depth ||= DepthCondition.new
@@ -16,6 +18,11 @@ module ActsAsRecursiveTree
16
18
  def depth_present?
17
19
  @depth.present?
18
20
  end
21
+
22
+ def query_strategy=(strategy)
23
+ raise "invalid strategy #{strategy} - only #{STRATEGIES} are allowed" unless STRATEGIES.include?(strategy)
24
+ @query_strategy = strategy
25
+ end
19
26
  end
20
27
  end
21
28
  end
@@ -38,6 +38,16 @@ module ActsAsRecursiveTree
38
38
  end
39
39
  end
40
40
 
41
+ class RangeValue < Base
42
+ def apply_to(attribute)
43
+ attribute.between(prepared_value)
44
+ end
45
+
46
+ def apply_negated_to(attribute)
47
+ attribute.not_between(prepared_value)
48
+ end
49
+ end
50
+
41
51
  class MultiValue < Base
42
52
  def apply_to(attribute)
43
53
  attribute.in(prepared_value)
@@ -62,6 +72,8 @@ module ActsAsRecursiveTree
62
72
  SingleValue
63
73
  when ::ActiveRecord::Relation
64
74
  Relation
75
+ when Range
76
+ RangeValue
65
77
  when Enumerable
66
78
  MultiValue
67
79
  when ::ActiveRecord::Base
@@ -74,4 +86,4 @@ module ActsAsRecursiveTree
74
86
  end
75
87
  end
76
88
  end
77
- end
89
+ end
@@ -1,3 +1,3 @@
1
1
  module ActsAsRecursiveTree
2
- VERSION = '2.0.2'.freeze
2
+ VERSION = '2.2.1'.freeze
3
3
  end
@@ -20,12 +20,14 @@ end
20
20
 
21
21
  shared_examples 'basic recursive examples' do
22
22
  it { is_expected.to start_with "SELECT \"#{model_class.table_name}\".* FROM \"#{model_class.table_name}\"" }
23
+
23
24
  it { is_expected.to match /WHERE "#{model_class.table_name}"."#{model_class.primary_key}" = #{model_id}/ }
25
+
24
26
  it { is_expected.to match /WITH RECURSIVE "#{builder.travers_loc_table.name}" AS/ }
27
+
25
28
  it { is_expected.to match /SELECT "#{model_class.table_name}"."#{model_class.primary_key}", "#{model_class.table_name}"."#{model_class._recursive_tree_config.parent_key}", 0 AS recursive_depth FROM "#{model_class.table_name}"/ }
29
+
26
30
  it { is_expected.to match /SELECT "#{model_class.table_name}"."#{model_class.primary_key}", "#{model_class.table_name}"."#{model_class._recursive_tree_config.parent_key}", \("#{builder.travers_loc_table.name}"."recursive_depth" \+ 1\) AS recursive_depth FROM "#{model_class.table_name}"/ }
27
- it { is_expected.to match /#{Regexp.escape(builder.travers_loc_table.project(Arel.star).to_sql)}/ }
28
- it { is_expected.to match /"#{model_class.table_name}"."#{model_class.primary_key}" = "#{builder.recursive_temp_table.name}"."#{model_class.primary_key}"/ }
29
31
  end
30
32
 
31
33
  shared_examples 'build recursive query' do
@@ -70,6 +72,7 @@ shared_examples 'descendant query' do
70
72
  include_context 'base_setup'
71
73
 
72
74
  it { is_expected.to match /"#{model_class.table_name}"."#{model_class._recursive_tree_config.parent_key}" = "#{builder.travers_loc_table.name}"."#{model_class.primary_key}"/ }
75
+ it { is_expected.to match /#{Regexp.escape(builder.travers_loc_table.project(builder.travers_loc_table[model_class.primary_key]).to_sql)}/ }
73
76
  end
74
77
 
75
78
  shared_context 'context with ordering' do
data/spec/db/database.rb CHANGED
@@ -8,10 +8,16 @@ ActiveRecord::Migration.verbose = false
8
8
 
9
9
  ActiveRecord::Base.configurations = YAML::load(File.read("#{database_folder}/database.yml"))
10
10
 
11
- config = ActiveRecord::Base.configurations[database_adapter]
11
+ if ActiveRecord.version >= Gem::Version.new('6.1.0')
12
+ config = ActiveRecord::Base.configurations.configs_for env_name: database_adapter, name: "primary"
13
+ database = config.database
14
+ else
15
+ config = ActiveRecord::Base.configurations[database_adapter]
16
+ database = config["database"]
17
+ end
12
18
 
13
19
  # remove database if present
14
- FileUtils.rm config['database'], force: true
20
+ FileUtils.rm database, force: true
15
21
 
16
22
  ActiveRecord::Base.establish_connection(database_adapter.to_sym)
17
23
  ActiveRecord::Base.establish_connection(config)
data/spec/values_spec.rb CHANGED
@@ -57,7 +57,7 @@ describe ActsAsRecursiveTree::Options::Values do
57
57
  let(:range) { 1..3 }
58
58
  subject(:value) { described_class.create(range) }
59
59
 
60
- it { is_expected.to be_a ActsAsRecursiveTree::Options::Values::MultiValue }
60
+ it { is_expected.to be_a ActsAsRecursiveTree::Options::Values::RangeValue }
61
61
 
62
62
  it 'should apply_to' do
63
63
  expect(value.apply_to(attribute).to_sql).to end_with "BETWEEN #{range.begin} AND #{range.end}"
@@ -83,4 +83,4 @@ describe ActsAsRecursiveTree::Options::Values do
83
83
  end
84
84
  end
85
85
  end
86
- end
86
+ end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_recursive_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wolfgang Wedelich-John
8
- autorequire:
8
+ - Willem Mulder
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2018-02-06 00:00:00.000000000 Z
12
+ date: 2021-07-30 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: activerecord
@@ -19,7 +20,7 @@ dependencies:
19
20
  version: 5.0.0
20
21
  - - "<"
21
22
  - !ruby/object:Gem::Version
22
- version: 6.0.0
23
+ version: 6.2.0
23
24
  type: :runtime
24
25
  prerelease: false
25
26
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,21 +30,7 @@ dependencies:
29
30
  version: 5.0.0
30
31
  - - "<"
31
32
  - !ruby/object:Gem::Version
32
- version: 6.0.0
33
- - !ruby/object:Gem::Dependency
34
- name: bundler
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '1.7'
40
- type: :development
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '1.7'
33
+ version: 6.2.0
47
34
  - !ruby/object:Gem::Dependency
48
35
  name: database_cleaner
49
36
  requirement: !ruby/object:Gem::Requirement
@@ -100,11 +87,26 @@ dependencies:
100
87
  - - "~>"
101
88
  - !ruby/object:Gem::Version
102
89
  version: '1.3'
90
+ - !ruby/object:Gem::Dependency
91
+ name: appraisal
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.4'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.4'
103
104
  description: "\n This is a ruby gem that provides drop in replacement for acts_as_tree
104
105
  but makes use of SQL recursive statement. Be sure to have a DBMS that supports recursive
105
106
  queries when using this gem (e.g. PostgreSQL or SQLite). "
106
107
  email:
107
108
  - wolfgang.wedelich@1und1.de
109
+ - 14mRh4X0r@gmail.com
108
110
  executables: []
109
111
  extensions: []
110
112
  extra_rdoc_files: []
@@ -113,6 +115,7 @@ files:
113
115
  - ".rspec"
114
116
  - ".rubocop.yml"
115
117
  - ".rubocop_todo.yml"
118
+ - Appraisals
116
119
  - CHANGELOG.md
117
120
  - Gemfile
118
121
  - LICENSE.txt
@@ -127,6 +130,12 @@ files:
127
130
  - lib/acts_as_recursive_tree/builders/descendants.rb
128
131
  - lib/acts_as_recursive_tree/builders/leaves.rb
129
132
  - lib/acts_as_recursive_tree/builders/relation_builder.rb
133
+ - lib/acts_as_recursive_tree/builders/strategy.rb
134
+ - lib/acts_as_recursive_tree/builders/strategy/ancestor.rb
135
+ - lib/acts_as_recursive_tree/builders/strategy/descendant.rb
136
+ - lib/acts_as_recursive_tree/builders/strategy/join.rb
137
+ - lib/acts_as_recursive_tree/builders/strategy/subselect.rb
138
+ - lib/acts_as_recursive_tree/config.rb
130
139
  - lib/acts_as_recursive_tree/model.rb
131
140
  - lib/acts_as_recursive_tree/options.rb
132
141
  - lib/acts_as_recursive_tree/options/depth_condition.rb
@@ -149,7 +158,7 @@ homepage: https://github.com/1and1/acts_as_recursive_tree
149
158
  licenses:
150
159
  - MIT
151
160
  metadata: {}
152
- post_install_message:
161
+ post_install_message:
153
162
  rdoc_options: []
154
163
  require_paths:
155
164
  - lib
@@ -164,9 +173,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
173
  - !ruby/object:Gem::Version
165
174
  version: '0'
166
175
  requirements: []
167
- rubyforge_project:
168
- rubygems_version: 2.6.14
169
- signing_key:
176
+ rubygems_version: 3.1.6
177
+ signing_key:
170
178
  specification_version: 4
171
179
  summary: Drop in replacement for acts_as_tree but using recursive queries
172
180
  test_files:
@@ -180,4 +188,3 @@ test_files:
180
188
  - spec/model/relation_spec.rb
181
189
  - spec/spec_helper.rb
182
190
  - spec/values_spec.rb
183
- has_rdoc: