active_mocker 2.4.4 → 2.5.0

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: e23446ffbd114cb1cc70afd86eb8e1f359abc760
4
- data.tar.gz: 68cc169cc6eacf73b16f96932d7bf25786b8be0f
3
+ metadata.gz: 9471f85889f657625b27471d107dacf1f2a1e356
4
+ data.tar.gz: 36ca7ce095b75166f8148a11a39ab8f0ce502dd1
5
5
  SHA512:
6
- metadata.gz: efff2e22e9b36d613afebff85f06b14878553c102d12f89e40c81a5ccfb57730f57c030b65a3506d63b4166292187b5e498ace9f2cfd36835ef0120f5b99227d
7
- data.tar.gz: 332b954724a2f12ef89684f7f503d0e68ef56fbe4593ce88a4a58f88a545191e0f71f4c22580e2bc32e8f04cac455900e217f16b6135120e04d4e2f6ad54e167
6
+ metadata.gz: 7cf121a9c56ed305c01c1b5445cb855f95e807f8475f1993e6f6e664da8b1cbfa9c648c553476aa1cca7bcc2ae6bd7e9277d13d6388ceec4379e21f8aed3f09a
7
+ data.tar.gz: f9d5c52020ae381bab78685780d0eeefa784de91348643196e5f5053539b0e7d59679e1c786372e1e6d0058b275dcb83f7d652c48f29adf97805692fc210dae2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
  All notable changes to this project will be documented in this file.
3
+
4
+ ## 2.5.0 - 2017-03-17
5
+ ### Feature
6
+ - In comment Macro `ActiveMocker.safe_methods(*instance_methods, scopes: [], instance_methods: [])` Now accepts scope methods
7
+
3
8
  ## 2.4.4 - 2017-03-10
4
9
  ### Fix
5
10
  - Really fix: scope methods returned `undefined method `call_mock_method' for nil:NilClass` for Mocks nested in modules.
data/README.md CHANGED
@@ -221,10 +221,10 @@ ActiveMocker::LoadedMocks.features.enable(:stub_active_record_exceptions)
221
221
  Be careful that it does not contain anything that ActiveMocker cannot run.
222
222
 
223
223
  ```ruby
224
- # ActiveMocker.safe_methods :full_name
224
+ # ActiveMocker.safe_methods(scopes: [], instance_methods: [:full_name])
225
225
  class User
226
226
  def full_name
227
- "#{first_name} + #{last_name}
227
+ "#{first_name} + #{last_name}"
228
228
  end
229
229
  end
230
230
  ```
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
+ require_relative "safe_methods"
2
3
  module ActiveMocker
3
4
  class MockCreator
4
5
  module DefinedMethods
6
+ include SafeMethods
5
7
  Method = Struct.new(:name, :arguments, :body)
6
8
 
7
9
  def instance_methods
8
10
  meths = class_introspector.get_class.public_instance_methods(false).sort
9
- if safe_methods.include?(:initialize)
10
- meths << :initialize
11
- end
11
+ meths << :initialize if safe_methods[:instance_methods].include?(:initialize)
12
12
  meths.map { |m| create_method(m, :instance_method) }
13
13
  end
14
14
 
@@ -22,22 +22,10 @@ module ActiveMocker
22
22
 
23
23
  private
24
24
 
25
- def safe_methods
26
- @safe_methods ||= class_introspector.parsed_source.comments.flat_map do |comment|
27
- if comment.text.include?("ActiveMocker.safe_methods")
28
- ActiveMocker.module_eval(comment.text.delete("#"))
29
- end
30
- end
31
- end
32
-
33
- module ActiveMocker
34
- def self.safe_methods(*methods)
35
- methods
36
- end
37
- end
38
-
39
25
  def create_method(m, type)
40
- if safe_methods.include?(m)
26
+ plural_type = (type.to_s + "s").to_sym
27
+ if safe_methods[plural_type].include?(m)
28
+ raise "ActiveMocker.safe_methods(class_methods: []) is currently unsupported." if type == :method
41
29
  def_method = class_introspector.parsed_source.defs.detect { |meth| meth.name == m }
42
30
  Method.new(
43
31
  m,
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module ActiveMocker
3
+ class MockCreator
4
+ module SafeMethods
5
+ BASE = { instance_methods: [], scopes: [], methods: [] }.freeze
6
+
7
+ def safe_methods
8
+ @safe_methods ||= class_introspector.parsed_source.comments.each_with_object(BASE.dup) do |comment, hash|
9
+ if comment.text.include?("ActiveMocker.safe_methods")
10
+ hash.merge!(ActiveMocker.module_eval(comment.text.delete("#")))
11
+ else
12
+ hash
13
+ end
14
+ end
15
+ end
16
+
17
+ module ActiveMocker
18
+ def self.safe_methods(*arg_methods, scopes: [], instance_methods: [], class_methods: [])
19
+ { instance_methods: arg_methods.concat(instance_methods), scopes: scopes, methods: class_methods }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,15 +1,43 @@
1
1
  # frozen_string_literal: true
2
+ require_relative "safe_methods"
2
3
  module ActiveMocker
3
4
  class MockCreator
4
5
  module Scopes
5
6
  Method = Struct.new(:name, :arguments, :body)
7
+ include SafeMethods
6
8
 
7
9
  def scope_methods
8
10
  class_introspector.class_macros.select { |h| h.keys.first == :scope }.map do |h|
9
- a = h.values.first.first
10
- Method.new(a[0], ReverseParameters.new(a[1], blocks_as_values: true), nil)
11
+ name, args = h.values.first.first
12
+ arguments = ReverseParameters.new(args, blocks_as_values: true)
13
+ body = scope_body(arguments, name)
14
+ Method.new(name, arguments, body)
11
15
  end
12
16
  end
17
+
18
+ def scope_body(arguments, name)
19
+ if safe_methods[:scopes].include?(name)
20
+ find_scope_body_from_ast(name)
21
+ else
22
+ "#{class_name}.send(:call_mock_method, " \
23
+ "method: '#{name}', " \
24
+ "caller: Kernel.caller, " \
25
+ "arguments: [#{arguments.arguments}])"
26
+ end
27
+ end
28
+
29
+ def ast_scopes
30
+ @ast_scopes ||= class_introspector
31
+ .parsed_source
32
+ .class_begin
33
+ .children
34
+ .select { |n| n.try(:type) == :send && n.try { children[1] == :scope } }
35
+ end
36
+
37
+ def find_scope_body_from_ast(name)
38
+ scope = ast_scopes.detect { |n| n.children[2].children.first == name }
39
+ DissociatedIntrospection::RubyCode.build_from_ast(scope.children[3].children[2]).source
40
+ end
13
41
  end
14
42
  end
15
43
  end
@@ -4,7 +4,7 @@ include <%= parent_class_inspector.parent_mock_name %>::Scopes
4
4
 
5
5
  <% scope_methods.each do |method| -%>
6
6
  def <%= method.name %><%= "(#{method.arguments.parameters})" unless method.arguments.parameters.to_a.empty? %>
7
- <%= class_name %>.send(:call_mock_method, method: '<%= method.name %>', caller: Kernel.caller, arguments: [<%= method.arguments.arguments %>])
7
+ <%= method.body %>
8
8
  end
9
9
 
10
10
  <% end -%>
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module ActiveMocker
3
- VERSION = "2.4.4"
3
+ VERSION = "2.5.0"
4
4
  module Mock
5
5
  VERSION = "1" # This increments when breaking changes happen in the generated mocks
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_mocker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.4
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dustin Zeisler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-10 00:00:00.000000000 Z
11
+ date: 2017-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -233,6 +233,7 @@ files:
233
233
  - lib/active_mocker/mock_creator/defined_methods.rb
234
234
  - lib/active_mocker/mock_creator/modules_constants.rb
235
235
  - lib/active_mocker/mock_creator/recreate_class_method_calls.rb
236
+ - lib/active_mocker/mock_creator/safe_methods.rb
236
237
  - lib/active_mocker/mock_creator/scopes.rb
237
238
  - lib/active_mocker/mock_template.erb
238
239
  - lib/active_mocker/mock_template/_associations.erb