active_node 2.2.0 → 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
2
  SHA1:
3
- metadata.gz: 19347532b691863f735cdb799989cf68a1bc624b
4
- data.tar.gz: 71833a5ff1029940a6965c90c9f86504747f5c6a
3
+ metadata.gz: b3c0d2fe8c063ac29c20b91a568919d9723d5b3e
4
+ data.tar.gz: 11522535a767b8709c00420e83e9e2f2340f9a65
5
5
  SHA512:
6
- metadata.gz: 9017661492388db4212a1674c9364ff182ea756f48252a8de0221e1194e0697ab2faf2964182d6f5ac310ea9deee3e4045556389ab50ecac4898747009ef301a
7
- data.tar.gz: 63610493b0a11263928de9fab5bbe3f79741a82e54dd8869f87d9d733444046da275816d803d78946e6f42f7f0cafb213fcd57bc1fc6d88834cb69a75eb1e453
6
+ metadata.gz: 81912f84e1e63e9fa220b0b67c07b15e58a30af7f8780e34cf72d68552e0a3347e7f6d6a2bcf59cd34d244f43afdd4b43ef2b2339b7fcefccdb1603bc77ebe33
7
+ data.tar.gz: d38f3caad3486c0504d1aa51b40ec1433dd11a5b135ad0c3fca5c7c787b8219e06e3aa0585d345bbaa42bfe192d5d742f3e728c995cb4154e9b328ca0ff73eee
@@ -0,0 +1,35 @@
1
+ require 'set'
2
+ require 'active_support/concern'
3
+
4
+ module ActiveNode
5
+ module Delegation # :nodoc:
6
+ extend ActiveSupport::Concern
7
+
8
+ # This module creates compiled delegation methods dynamically at runtime, which makes
9
+ # subsequent calls to that method faster by avoiding method_missing. The delegations
10
+ # may vary depending on the klass of a relation, so we create a subclass of Relation
11
+ # for each different klass, and the delegations are compiled into that subclass only.
12
+
13
+ BLACKLISTED_ARRAY_METHODS = [
14
+ :compact!, :flatten!, :reject!, :reverse!, :rotate!, :map!,
15
+ :shuffle!, :slice!, :sort!, :sort_by!, :delete_if,
16
+ :keep_if, :pop, :shift, :delete_at, :compact
17
+ ].to_set # :nodoc:
18
+
19
+ delegate :to_xml, :to_yaml, :length, :collect, :map, :each, :all?, :include?, :to_ary, to: :to_a
20
+
21
+ protected
22
+
23
+ def array_delegable?(method)
24
+ Array.method_defined?(method) && BLACKLISTED_ARRAY_METHODS.exclude?(method)
25
+ end
26
+
27
+ def method_missing(method, *args, &block)
28
+ if array_delegable?(method)
29
+ to_a.public_send(method, *args, &block)
30
+ else
31
+ super
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,13 +1,11 @@
1
1
  module ActiveNode
2
2
  class Graph
3
3
  include Neography::Rest::Helpers
4
- include FinderMethods, QueryMethods
4
+ include FinderMethods, QueryMethods, Delegation
5
5
 
6
6
  attr_reader :reflections, :matches, :klass, :loaded
7
7
  alias :loaded? :loaded
8
8
 
9
- delegate :to_xml, :to_yaml, :length, :collect, :map, :each, :all?, :include?, :to_ary, to: :to_a
10
-
11
9
  def initialize klass, *includes
12
10
  @klass = klass if klass < ActiveNode::Base
13
11
  @matches = []
@@ -57,6 +55,46 @@ module ActiveNode
57
55
  @records
58
56
  end
59
57
 
58
+ def as_json(options = nil) #:nodoc:
59
+ to_a.as_json(options)
60
+ end
61
+
62
+ # Returns size of the records.
63
+ def size
64
+ loaded? ? @records.length : count
65
+ end
66
+
67
+ # Returns true if there are no records.
68
+ def empty?
69
+ return @records.empty? if loaded?
70
+
71
+ if limit_value == 0
72
+ true
73
+ else
74
+ # FIXME: This count is not compatible with #select('authors.*') or other select narrows
75
+ c = count
76
+ c.respond_to?(:zero?) ? c.zero? : c.empty?
77
+ end
78
+ end
79
+
80
+ # Returns true if there are any records.
81
+ def any?
82
+ if block_given?
83
+ to_a.any? { |*block_args| yield(*block_args) }
84
+ else
85
+ !empty?
86
+ end
87
+ end
88
+
89
+ # Returns true if there is more than one record.
90
+ def many?
91
+ if block_given?
92
+ to_a.many? { |*block_args| yield(*block_args) }
93
+ else
94
+ limit_value ? to_a.many? : size > 1
95
+ end
96
+ end
97
+
60
98
  # Compares two relations for equality.
61
99
  def ==(other)
62
100
  case other
@@ -177,7 +177,7 @@ module ActiveNode
177
177
 
178
178
  def create_or_update
179
179
  fresh = new_record?
180
- write; true
180
+ write
181
181
  association_cache.values.each { |assoc| assoc.save(fresh) }
182
182
  end
183
183
 
@@ -222,13 +222,9 @@ module ActiveNode
222
222
 
223
223
  private
224
224
  def derive_class_name
225
- if direction == :outgoing
226
- class_name = type.to_s
227
- else
228
- class_name = name.to_s
229
- class_name = class_name.singularize if collection?
230
- end
231
- model.name.sub(/[^:]*$/, class_name.camelize)
225
+ class_name = name.to_s.camelize
226
+ class_name = class_name.singularize if collection?
227
+ model.name.sub(/[^:]*$/, class_name)
232
228
  end
233
229
  end
234
230
 
@@ -1,3 +1,3 @@
1
1
  module ActiveNode
2
- VERSION = "2.2.0"
2
+ VERSION = "2.2.1"
3
3
  end
data/lib/active_node.rb CHANGED
@@ -17,6 +17,7 @@ module ActiveNode
17
17
  autoload_under 'graph' do
18
18
  autoload :QueryMethods
19
19
  autoload :FinderMethods
20
+ autoload :Delegation
20
21
  end
21
22
 
22
23
  eager_autoload do
@@ -32,4 +32,16 @@ describe ActiveNode::Graph do
32
32
  person.children
33
33
  end
34
34
  end
35
+
36
+ describe '#empty?' do
37
+ it 'should return true' do
38
+ Person.all.should be_empty
39
+ end
40
+ end
41
+
42
+ describe '#detect' do
43
+ it 'should return nil' do
44
+ Person.all.detect{|p| true}.should be_nil
45
+ end
46
+ end
35
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_node
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Heinrich Klobuczek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-05 00:00:00.000000000 Z
11
+ date: 2014-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_attr
@@ -168,6 +168,7 @@ files:
168
168
  - lib/active_node/dirty.rb
169
169
  - lib/active_node/errors.rb
170
170
  - lib/active_node/graph.rb
171
+ - lib/active_node/graph/delegation.rb
171
172
  - lib/active_node/graph/finder_methods.rb
172
173
  - lib/active_node/graph/query_methods.rb
173
174
  - lib/active_node/neo.rb