interest 0.0.1 → 0.0.2

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
  SHA1:
3
- metadata.gz: fc82c4e1059269fa9b2883ec3e3b44a5abeb3b13
4
- data.tar.gz: 3261ddd2763d276aeb65f99d2aed75385a0870a8
3
+ metadata.gz: db3f3e5e177d1f9cadc4cc8e9e47db3da053fb8c
4
+ data.tar.gz: 7f519de87a569330f0912e46e0ccb86fac2aa836
5
5
  SHA512:
6
- metadata.gz: d0d24030c45c3fa07c7cecf3936324f7b24215bb55485982582568856fa4253d9602fe454cfa8fdb05bc0935923e0069acf6a586d97c9800dbc773fce7825385
7
- data.tar.gz: f0de0016b106f52a0baa34f6d78ae2e115d4f84d3cdb83c1de75427a90c84288e097e7f715a3ea2612f99582af6497db3c60fb0347debfa08d13d6a3047f19f9
6
+ metadata.gz: 5c2b439fadd5dc295e4c65f20e1b33863195149694bc885c989d84a6665d4a967ea5aed2ecc20e80900bcadea66cf01164ae5aa2460a51a0e8557ab37a041f3f
7
+ data.tar.gz: aa3732ae39b50117f043adb9a2355fafd03d4532ee055c64d3f08a9708bc9c81105710fb064561041445cbeda2e8a2581e3441d5c42f65b3f76ab023744571d0
@@ -14,7 +14,7 @@ module Interest
14
14
  define_method :method_missing do |name, *args, &block|
15
15
  return super(name, *args, &block) unless matches = /\A#{target}_(?<type>.+)\Z/.match(name.to_s)
16
16
 
17
- self.class.__send__ :"define_#{source}_association_method", Interest::Utils.source_type_of(matches[:type])
17
+ self.class.__send__ :"define_#{source}_association_method", Interest::Utils.source_type_of(matches[:type], self.class.model_name.to_s)
18
18
 
19
19
  __send__ name, *args, &block
20
20
  end
@@ -1,27 +1,64 @@
1
1
  require "active_support"
2
2
  require "active_support/core_ext/string/inflections"
3
3
  require "active_record"
4
+ require "active_model/naming"
4
5
 
5
6
  module Interest
6
7
  module Utils
7
8
  class << self
8
9
  def symbolic_name_of(object)
9
- if object.is_a?(ActiveRecord::Base)
10
- object.class.name
11
- elsif object.is_a?(Class) and object < ActiveRecord::Base
12
- object.name
10
+ if model_class_or_instance(object)
11
+ ActiveModel::Naming.plural(object)
12
+ else
13
+ object.to_s.underscore.gsub("/", "_").pluralize
14
+ end
15
+ end
16
+
17
+ def source_type_of(object, prefix = nil)
18
+ case model_class_or_instance(object)
19
+ when :instance
20
+ object.class.model_name.to_s
21
+ when :class
22
+ object.model_name.to_s
13
23
  else
14
- object.to_s
15
- end.underscore.pluralize
24
+ source_type_from_letter_of(object, prefix)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def source_types_from_letter_of(object, prefix = nil)
31
+ return to_enum(:source_types_from_letter_of, object, prefix) unless block_given?
32
+
33
+ parts = object.to_s.split("_")
34
+
35
+ ["", "::"].repeated_permutation(parts.size - 1).each do |permutation|
36
+ name = permutation.map.with_index {|value, i| parts[i].camelize + value }.join
37
+
38
+ yield(name << parts.last.classify)
39
+ yield("#{prefix}::#{name}") unless prefix.nil?
40
+ end
41
+ end
42
+
43
+ def source_type_from_letter_of(object, prefix = nil)
44
+ source_types_from_letter_of(object, prefix).each do |source_type|
45
+ begin
46
+ source_type.constantize
47
+ return source_type
48
+ rescue
49
+ end
50
+ end
51
+
52
+ raise "Could not determine source type from #{object.inspect}"
16
53
  end
17
54
 
18
- def source_type_of(object)
55
+ def model_class_or_instance(object)
19
56
  if object.is_a?(ActiveRecord::Base)
20
- object.class.name
21
- elsif object.is_a?(Class) and object < ActiveRecord::Base
22
- object.name
57
+ :instance
58
+ elsif object.is_a?(Class) && object < ActiveRecord::Base
59
+ :class
23
60
  else
24
- object.to_s.classify
61
+ nil
25
62
  end
26
63
  end
27
64
  end
@@ -1,3 +1,3 @@
1
1
  module Interest
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -124,4 +124,14 @@ describe "Blockable" do
124
124
  expect(user.blocker_relationships.of(BlockableUser)).to have_exactly(2).items
125
125
  expect(user.blocker_relationships.of(Collection)).to have_exactly(1).items
126
126
  end
127
+
128
+ it "should be defined association method for namespaced class" do
129
+ user = BlockableUser.create!
130
+ stuff = Deeply::Nested::Namespace::Stuff.create!
131
+
132
+ user.block(stuff)
133
+
134
+ expect { user.blocking_deeply_nested_namespace_stuffs }.not_to raise_error
135
+ expect { stuff.blocker_blockable_users }.not_to raise_error
136
+ end
127
137
  end
@@ -123,4 +123,14 @@ describe "FollowRequestable" do
123
123
  expect(user.incoming_follow_requests.of(FollowRequestableUser)).to have_exactly(2).items
124
124
  expect(user.incoming_follow_requests.of(Collection)).to have_exactly(1).items
125
125
  end
126
+
127
+ it "should be defined association method for namespaced class" do
128
+ user = FollowRequestableUser.create!
129
+ stuff = Deeply::Nested::Namespace::Stuff.create!
130
+
131
+ user.request_to_follow(stuff)
132
+
133
+ expect { user.follow_requestee_deeply_nested_namespace_stuffs }.not_to raise_error
134
+ expect { stuff.follow_requester_follow_requestable_users }.not_to raise_error
135
+ end
126
136
  end
@@ -168,4 +168,14 @@ describe "Followable" do
168
168
  expect(user.follower_relationships.of(FollowableUser)).to have_exactly(2).items
169
169
  expect(user.follower_relationships.of(Collection)).to have_exactly(1).items
170
170
  end
171
+
172
+ it "should be defined association method for namespaced class" do
173
+ user = FollowableUser.create!
174
+ stuff = Deeply::Nested::Namespace::Stuff.create!
175
+
176
+ user.follow(stuff)
177
+
178
+ expect { user.following_deeply_nested_namespace_stuffs }.not_to raise_error
179
+ expect { stuff.follower_followable_users }.not_to raise_error
180
+ end
171
181
  end
@@ -0,0 +1,12 @@
1
+ require "active_record"
2
+ require "interest"
3
+
4
+ module Deeply
5
+ module Nested
6
+ module Namespace
7
+ class Stuff < ActiveRecord::Base
8
+ interest
9
+ end
10
+ end
11
+ end
12
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - tatat
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-31 00:00:00.000000000 Z
11
+ date: 2014-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -159,6 +159,7 @@ files:
159
159
  - spec/support/models/blockable_user.rb
160
160
  - spec/support/models/blocking.rb
161
161
  - spec/support/models/collection.rb
162
+ - spec/support/models/deeply_nested_namespace_stuff.rb
162
163
  - spec/support/models/follow_requestable_and_blockable_user.rb
163
164
  - spec/support/models/follow_requestable_user.rb
164
165
  - spec/support/models/followable_and_blockable_user.rb
@@ -202,6 +203,7 @@ test_files:
202
203
  - spec/support/models/blockable_user.rb
203
204
  - spec/support/models/blocking.rb
204
205
  - spec/support/models/collection.rb
206
+ - spec/support/models/deeply_nested_namespace_stuff.rb
205
207
  - spec/support/models/follow_requestable_and_blockable_user.rb
206
208
  - spec/support/models/follow_requestable_user.rb
207
209
  - spec/support/models/followable_and_blockable_user.rb