detour 0.0.12 → 0.0.13

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
  SHA1:
3
- metadata.gz: 80d487ed6d4c933fbf39a7743ae7f14583c58335
4
- data.tar.gz: b07a8fd7a7e3d6d430c1e7708edf77eae200b2de
3
+ metadata.gz: e523669f071b4f7fafbedabf9f38352bb33cc014
4
+ data.tar.gz: d8a1cdbcec53f6c854db8626e47bab1037dcdbcf
5
5
  SHA512:
6
- metadata.gz: cf2629eb8e3d045326c69997e05f4a009918ead2a123ef903359d8ac8a39837dfa00d8984ea3205771b5a8edbb49ea4f4411c3b76d7045041df255e1f6b56ddc
7
- data.tar.gz: b40978ca2f160e271bbb7495ab26e81378b4e4da3ce7cc0e2a7c84c196d6c0bb3c96a51425d8485ef4a558d66b2629fe3076a4b468977f3ffe4a2eb3aa84ee33
6
+ metadata.gz: fa7e64b13cbee206eef6b6f458ffb8a3e8dd9552e8ad157c77a81a68bb8715cfc974c393baadd01610c6d4eb49add4852e0fd2e39c9716c8e24e66445d931a44
7
+ data.tar.gz: bafb4b8f3fe1105dc4f71d7ba3a1093933bf273f7c0e921ed426ef4c86e596958ed311dd17e5a16eab15d1e5010be6c8729d96f4a51ce984232756e520552ea5
@@ -2,6 +2,7 @@ class Detour::Group < ActiveRecord::Base
2
2
  validates :name, presence: true, uniqueness: { scope: :flaggable_type }
3
3
  validates :flaggable_type, presence: true, inclusion: { in: Detour.config.flaggable_types }
4
4
  has_many :memberships, dependent: :destroy
5
+ has_many :database_group_flags, dependent: :destroy
5
6
 
6
7
  accepts_nested_attributes_for :memberships, allow_destroy: true
7
8
 
@@ -67,6 +67,18 @@ module Detour::ActsAsFlaggable
67
67
  as: :flaggable,
68
68
  class_name: "Detour::FlagInFlag"
69
69
 
70
+ has_many :memberships,
71
+ as: :member,
72
+ class_name: "Detour::Membership"
73
+
74
+ has_many :groups,
75
+ through: :memberships,
76
+ class_name: "Detour::Group"
77
+
78
+ has_many :database_group_flags,
79
+ through: :groups,
80
+ class_name: "Detour::DatabaseGroupFlag"
81
+
70
82
  has_many :opt_out_flags,
71
83
  as: :flaggable,
72
84
  class_name: "Detour::OptOutFlag"
@@ -75,6 +87,16 @@ module Detour::ActsAsFlaggable
75
87
  @detour_flaggable_find_by = options[:find_by]
76
88
  end
77
89
 
90
+ def defined_group_flags
91
+ @defined_group_flags ||= Detour::DefinedGroupFlag.where(flaggable_type: self.class.to_s)
92
+ end
93
+
94
+ def percentage_flags
95
+ @percentage_flags ||= Detour::PercentageFlag
96
+ .where(flaggable_type: self.class.to_s)
97
+ .where("? % 10 < detour_flags.percentage / 10", id)
98
+ end
99
+
78
100
  def self.detour_flaggable_find_by
79
101
  @detour_flaggable_find_by
80
102
  end
@@ -16,7 +16,7 @@ module Detour::Flaggable
16
16
  defined_group = Detour::DefinedGroup.by_type(self.class)[defined_group_flag.group_name]
17
17
 
18
18
  unless defined_group && defined_group.test(self)
19
- feeatures.delete defined_group_flag.feature
19
+ features.delete defined_group_flag.feature
20
20
  end
21
21
  end
22
22
 
@@ -47,45 +47,14 @@ module Detour::Flaggable
47
47
  private
48
48
 
49
49
  def unfiltered_features
50
- Detour::Feature.where(%Q{
51
- detour_features.id IN (
52
- -- Get features the record has been individually flagged in to
53
- SELECT feature_id FROM detour_flags
54
- WHERE detour_flags.type = 'Detour::FlagInFlag'
55
- AND detour_flags.flaggable_type = '#{self.class.to_s}'
56
- AND detour_flags.flaggable_id = '#{id}'
57
- ) OR detour_features.id IN (
58
- -- Get features the record has been flagged into via group membership
59
- SELECT feature_id FROM detour_flags
60
- INNER JOIN detour_groups
61
- ON detour_groups.id = detour_flags.group_id
62
- INNER JOIN detour_memberships
63
- ON detour_memberships.group_id = detour_groups.id
64
- AND detour_memberships.member_id = '#{id}'
65
- WHERE detour_flags.type = 'Detour::DatabaseGroupFlag'
66
- AND detour_flags.flaggable_type = '#{self.class}'
67
- ) OR detour_features.id IN (
68
- -- Get features the record has been flagged into via defined membership
69
- -- We'll test them later
70
- SELECT feature_id FROM detour_flags
71
- WHERE detour_flags.type = 'Detour::DefinedGroupFlag'
72
- AND detour_flags.flaggable_type = '#{self.class}'
73
- ) OR detour_features.id IN (
74
- -- Get features the record has been flagged into via percentage
75
- SELECT feature_id FROM detour_flags
76
- WHERE detour_flags.type = 'Detour::PercentageFlag'
77
- AND detour_flags.flaggable_type = '#{self.class}'
78
- AND '#{id}' % 10 < detour_flags.percentage / 10
79
- )
80
- }).where(%Q{
81
- -- Exclude features the record has been opted out of.
82
- detour_features.id NOT IN (
83
- SELECT feature_id FROM detour_flags
84
- WHERE detour_flags.type = 'Detour::OptOutFlag'
85
- AND detour_flags.flaggable_type = '#{self.class}'
86
- AND detour_flags.flaggable_id = '#{id}'
87
- )
88
- })
50
+ table = Detour::Feature.arel_table
51
+ query = table[:id].in(flag_in_flags.select(:feature_id).arel)
52
+ .or(table[:id].in(database_group_flags.select(:feature_id).arel))
53
+ .or(table[:id].in(defined_group_flags.select(:feature_id).arel))
54
+ .or(table[:id].in(percentage_flags.select(:feature_id).arel))
55
+ .and(table[:id].not_in(opt_out_flags.select(:feature_id).arel))
56
+
57
+ Detour::Feature.where(query)
89
58
  end
90
59
 
91
60
  included do
@@ -1,3 +1,3 @@
1
1
  module Detour
2
- VERSION = "0.0.12"
2
+ VERSION = "0.0.13"
3
3
  end
@@ -5,6 +5,31 @@ describe Detour::ActsAsFlaggable do
5
5
 
6
6
  it { should have_many :flag_in_flags }
7
7
  it { should have_many :opt_out_flags }
8
+ it { should have_many(:memberships).class_name("Detour::Membership") }
9
+ it { should have_many(:groups).through(:memberships).class_name("Detour::Group") }
10
+ it { should have_many(:database_group_flags).through(:groups).class_name("Detour::DatabaseGroupFlag") }
11
+
12
+ describe "#defined_group_flags" do
13
+ it "returns the defined group flags for the class" do
14
+ Detour::DefinedGroupFlag.should_receive(:where).with(flaggable_type: "User")
15
+ subject.defined_group_flags
16
+ end
17
+ end
18
+
19
+ describe "#percentage_flags" do
20
+ it "returns the percentage flags for the class" do
21
+ Detour::PercentageFlag.should_receive(:where).with(flaggable_type: "User").and_call_original
22
+ subject.percentage_flags
23
+ end
24
+
25
+ it "returns the percentage flags with the correct formula" do
26
+ subject.save!
27
+ where_double = double(where: true)
28
+ Detour::PercentageFlag.stub(:where) { where_double }
29
+ where_double.should_receive(:where).with("? % 10 < detour_flags.percentage / 10", subject.id)
30
+ subject.percentage_flags
31
+ end
32
+ end
8
33
 
9
34
  it "includes Detour::Flaggable" do
10
35
  subject.class.ancestors.should include Detour::Flaggable
@@ -4,13 +4,14 @@ describe Detour::Flaggable do
4
4
  subject { create :user }
5
5
 
6
6
  describe "#features" do
7
- let(:feature1) { create :feature }
8
- let(:feature2) { create :feature }
9
- let(:feature3) { create :feature }
10
- let(:feature4) { create :feature }
11
- let(:feature5) { create :feature }
12
- let(:membership) { create :membership, member: subject }
13
- let(:defined_group) { Detour::DefinedGroup.new "foo", ->(user){true} }
7
+ let(:feature1) { create :feature }
8
+ let(:feature2) { create :feature }
9
+ let(:feature3) { create :feature }
10
+ let(:feature4) { create :feature }
11
+ let(:feature5) { create :feature }
12
+ let(:membership) { create :membership, member: subject }
13
+ let(:defined_group) { Detour::DefinedGroup.new "foo", ->(user){true} }
14
+ let(:defined_group2) { Detour::DefinedGroup.new "foo2", ->(user){false} }
14
15
 
15
16
  before do
16
17
  Detour.config.defined_groups["User"] = { foo: defined_group }
@@ -20,6 +21,7 @@ describe Detour::Flaggable do
20
21
  create :database_group_flag, flaggable_type: "User", feature: feature4, group: membership.group
21
22
  create :opt_out_flag, flaggable: subject, feature: feature4
22
23
  create :defined_group_flag, flaggable_type: "User", feature: feature5, group_name: "foo"
24
+ create :defined_group_flag, flaggable_type: "User", feature: feature5, group_name: "foo2"
23
25
  end
24
26
 
25
27
  it "finds every feature for a record" do
@@ -9,6 +9,7 @@ describe Detour::Group do
9
9
  it { should accept_nested_attributes_for :memberships }
10
10
 
11
11
  it { should have_many(:memberships).dependent(:destroy) }
12
+ it { should have_many(:database_group_flags).dependent(:destroy) }
12
13
  it { should allow_mass_assignment_of :name }
13
14
  it { should allow_mass_assignment_of :flaggable_type }
14
15
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: detour
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Clem
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-09 00:00:00.000000000 Z
11
+ date: 2014-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -363,12 +363,12 @@ files:
363
363
  - spec/lib/detour/flag_form_spec.rb
364
364
  - spec/lib/detour/flaggable_spec.rb
365
365
  - spec/models/detour/database_group_flag_spec.rb
366
- - spec/models/detour/defined_group_spec.rb
367
366
  - spec/models/detour/feature_spec.rb
368
367
  - spec/models/detour/flag_in_flag_spec.rb
369
368
  - spec/models/detour/flag_spec.rb
370
369
  - spec/models/detour/flaggable_flag_spec.rb
371
370
  - spec/models/detour/group_flag_spec.rb
371
+ - spec/models/detour/group_spec.rb
372
372
  - spec/models/detour/membership_spec.rb
373
373
  - spec/models/detour/opt_out_flag_spec.rb
374
374
  - spec/models/detour/percentage_flag_spec.rb
@@ -471,12 +471,12 @@ test_files:
471
471
  - spec/lib/detour/flag_form_spec.rb
472
472
  - spec/lib/detour/flaggable_spec.rb
473
473
  - spec/models/detour/database_group_flag_spec.rb
474
- - spec/models/detour/defined_group_spec.rb
475
474
  - spec/models/detour/feature_spec.rb
476
475
  - spec/models/detour/flag_in_flag_spec.rb
477
476
  - spec/models/detour/flag_spec.rb
478
477
  - spec/models/detour/flaggable_flag_spec.rb
479
478
  - spec/models/detour/group_flag_spec.rb
479
+ - spec/models/detour/group_spec.rb
480
480
  - spec/models/detour/membership_spec.rb
481
481
  - spec/models/detour/opt_out_flag_spec.rb
482
482
  - spec/models/detour/percentage_flag_spec.rb