sequel-through 0.3.0 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f97ae5f870b6431b6a0d8186421ad8422ce24b58de83205b377e0c854d832578
4
- data.tar.gz: 7eba0d88aa13b1908dbc2a39e48b2c2b43879a623ca51d7f933519a008bf12e4
3
+ metadata.gz: 052c754323070df67e30e29c408efacdd3fc04da4a973e84551fe0d3ee6ed730
4
+ data.tar.gz: 1f8ab70b4bb87ed7889e2fd9339c56328e09fbe1f4e7c493cc5fb799955db37e
5
5
  SHA512:
6
- metadata.gz: 52aa46a33e6162b18d0df2b5e3d401010fc32ac0984d776bb25db4ce3d7dc5672b94ec8a789c91dafa199018160e7a6a76a6804557a7b886fc88614b412f159f
7
- data.tar.gz: cd274aa38361bda1aba76e5e779d647262efbeaefcfb9015b8fde65c6b27d846348ae9bd64647a27e09687657a2b1127e138db0c5149ada8744ce17fc4865241
6
+ metadata.gz: c6264ff5cb4701d009e11e5cfaec4bc8e5d02696f5bd634605b2e3f3eff5aeaae505be0495c806ccd4daf6e489a205dadeca19341fe4bec985d1fbb28e167c09
7
+ data.tar.gz: 5f749f13768fb60fa0c1dabbc56de70f6adaab0db284cbc3a0ac2988a3b6fb887fa809ae205cbf2dce06d1d7b81267ce14772d7e71c951f747ff8651a4e8a7a3
data/README.md CHANGED
@@ -24,7 +24,40 @@ Or install it yourself as:
24
24
 
25
25
  ## Usage
26
26
 
27
- TODO: Write usage instructions here
27
+ ```ruby
28
+ # Load the plugin
29
+ Sequel::Model.plugin :cyclical_through_associations
30
+
31
+ class User < Sequel::Model
32
+ one_to_many :user_has_security_groups
33
+ one_to_many :security_groups, through: :user_has_security_groups
34
+ one_to_many :privileges, through: :security_groups
35
+ end
36
+ class SecurityGroup < Sequel::Model
37
+ one_to_many :security_group_has_privileges
38
+ one_to_many :privileges, through: :security_group_has_privileges
39
+ end
40
+ class Privilege < Sequel::Model
41
+ end
42
+ class UserHasSecurityGroup < Sequel::Model
43
+ many_to_one :user
44
+ many_to_one :security_group
45
+ one_to_many :privileges, through: :security_group
46
+ end
47
+ class SecurityGroupHasPrivilege < Sequel::Model
48
+ many_to_one :security_group
49
+ many_to_one :privilege
50
+ end
51
+
52
+ # Solve any cyclical dependencies (when :cyclical_through_associations is used)
53
+ Sequel::Model.solve_cyclical_associations!
54
+
55
+ # Use the intermediate associations
56
+ User.first.security_groups # => [#<SecurityGroup 1>, #<SecurityGroup 2> ...]
57
+ User.first.privileges # => [#<Privilege A>, #<Privilege B> ...]
58
+ ```
59
+
60
+ This plugin adds an optional `:through` key for `*_to_one` and `*_to_many` associations. When `:through` is provided, intermediary associations are traversed and a single `one_through_many` or `many_through_many` association is added to the base model using a JOIN structure calculated from the associations traversed.
28
61
 
29
62
  ## Development
30
63
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "bundler/setup"
4
- require "sequel/through"
4
+ require_relative "../test/test_helper"
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -1,10 +1,10 @@
1
1
  module Sequel
2
2
  module Plugins
3
- module CyclicalAssociationSolver
3
+ module CyclicalThroughAssociations
4
4
 
5
5
  # Ensure through associations are loaded
6
6
  def self.apply mod
7
- mod.plugin(:through_associations)
7
+ mod.plugin :through_associations
8
8
  end
9
9
 
10
10
  module ClassMethods
@@ -25,7 +25,7 @@ module Sequel
25
25
  # Attempt to solve remaining cyclical associations
26
26
  @@_resolver_stack = []
27
27
  stack.each do |klass, assoc_type, name, opts, block|
28
- klass.send(assoc_type, name, **opts, &block)
28
+ klass.send assoc_type, name, **opts, &block
29
29
  end
30
30
 
31
31
  end
@@ -33,13 +33,13 @@ module Sequel
33
33
  # Output errors for any unsolved associations
34
34
  @@_resolving = true
35
35
  @@_resolver_stack.each do |klass, assoc_type, name, opts, block|
36
- klass.send(assoc_type, name, **opts, &block)
36
+ klass.send assoc_type, name, **opts, &block
37
37
  end
38
38
  @@_resolving = false
39
39
 
40
40
  end
41
41
 
42
- def associate_through(type, name, opts, &block)
42
+ def associate_through type, name, opts, &block
43
43
  begin
44
44
  result = super
45
45
  rescue \
@@ -52,7 +52,7 @@ module Sequel
52
52
 
53
53
  # Otherwise, attempt to resolve later
54
54
  unless result
55
- @@_resolver_stack.push([self, type, name, opts, block])
55
+ @@_resolver_stack.push [self, type, name, opts, block]
56
56
  return
57
57
  end
58
58
 
@@ -3,10 +3,10 @@ module Sequel
3
3
  module ThroughAssociations
4
4
 
5
5
  ASSOCIATION_THROUGH_TYPES = {
6
- :one_to_many => :one_through_many,
6
+ :one_to_one => :one_through_many,
7
+ :one_to_many => :many_through_many,
7
8
  :many_to_one => :one_through_many,
8
9
  :many_to_many => :many_through_many
9
- # one_to_one
10
10
  # many_to_pg_array
11
11
  # pg_array_to_many
12
12
  }
@@ -16,6 +16,7 @@ module Sequel
16
16
 
17
17
  # Ensure associations are loaded
18
18
  def self.apply mod
19
+ Sequel.extension :inflector unless "".respond_to?(:pluralize)
19
20
  mod.plugin :many_through_many
20
21
  end
21
22
 
@@ -37,7 +38,7 @@ module Sequel
37
38
  def associate_through type, name, opts, &block
38
39
  raise Error, "#{type} does not support through associations" unless assoc_type = Sequel.synchronize{ASSOCIATION_THROUGH_TYPES[type]}
39
40
 
40
- result = find_association_path **opts, name: name, models: self, from_through: true
41
+ result = find_association_path(**opts, name: name, models: self, from_through: true)
41
42
 
42
43
  # Remove the last table if it matches the destination table
43
44
  dest_model = result[:models].pop
@@ -51,7 +52,7 @@ module Sequel
51
52
  end
52
53
 
53
54
  # Create the association
54
- if assoc_type.to_s.ends_with? "_through_many"
55
+ if assoc_type.to_s.end_with? "_through_many"
55
56
  # *_through_many has a path argument
56
57
  self.send(assoc_type,
57
58
  name,
@@ -78,7 +79,7 @@ module Sequel
78
79
  end
79
80
 
80
81
  # Recurses through associations until a path to the destination is completed
81
- def find_association_path opts
82
+ def find_association_path **opts
82
83
 
83
84
  # Initialize arguments
84
85
  [:tables, :keys, :through, :models, :assocs].each do |k|
@@ -125,7 +126,7 @@ module Sequel
125
126
  opts[:assocs].push assoc
126
127
 
127
128
  # Handle *_through_many associations
128
- if assoc[:type].to_s.ends_with? "_through_many"
129
+ if assoc[:type].to_s.end_with? "_through_many"
129
130
 
130
131
  opts[:through].push assoc[:originally_through]
131
132
  opts[:from_through] = true
@@ -138,7 +139,7 @@ module Sequel
138
139
  return begin
139
140
  model = search.shift
140
141
  raise NoAssociationPath, opts unless model
141
- self.find_association_path **opts, models: opts[:models] + [model]
142
+ self.find_association_path(**opts, models: opts[:models] + [model])
142
143
  rescue MissingAssociation
143
144
  # Try the next model in the search path
144
145
  retry
@@ -154,7 +155,7 @@ module Sequel
154
155
  opts[:through].push assoc[:using] || assoc[:through]
155
156
  opts[:from_through] = true
156
157
  opts[:using] = nil
157
- return self.find_association_path **opts
158
+ return self.find_association_path(**opts)
158
159
  end
159
160
 
160
161
  # Otherwise, add the new table to the stack
@@ -187,7 +188,7 @@ module Sequel
187
188
  # Check for a source association
188
189
  opts[:through].push opts[:using] || opts[:name]
189
190
  opts[:from_through] = false
190
- return self.find_association_path **opts
191
+ return self.find_association_path(**opts)
191
192
 
192
193
  end
193
194
 
@@ -1,3 +1,3 @@
1
1
  require "sequel"
2
2
  require "sequel/plugins/through_associations"
3
- require "sequel/plugins/cyclical_association_solver"
3
+ require "sequel/plugins/cyclical_through_associations"
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = "sequel-through"
6
- spec.version = "0.3.0"
6
+ spec.version = "0.3.1"
7
7
  spec.authors = ["Kenaniah Cerny"]
8
8
  spec.email = ["kenaniah@gmail.com"]
9
9
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel-through
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenaniah Cerny
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-03-04 00:00:00.000000000 Z
11
+ date: 2019-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -81,7 +81,7 @@ files:
81
81
  - Rakefile
82
82
  - bin/console
83
83
  - bin/setup
84
- - lib/sequel/plugins/cyclical_association_solver.rb
84
+ - lib/sequel/plugins/cyclical_through_associations.rb
85
85
  - lib/sequel/plugins/through_associations.rb
86
86
  - lib/sequel/through.rb
87
87
  - sequel-through.gemspec