motion-spec 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDBmZjcyMjlmMTg2NDcyMWVjN2Q5NDJmZGE3MGZlYzAzMGY1MDhhMA==
4
+ ZGVhMjk5MWRlZGU0NTEwMDNkMmQ1YTQxYzA3NGU0NGI5MjMwMjk5Nw==
5
5
  data.tar.gz: !binary |-
6
- M2ExODNlMzdhZWE2YmYwODY5OTBiY2ZhODVjNjg3ZGI1MDdmY2JjNg==
6
+ NTNiZTMwZTMyMDFjY2ZlNDcyYjNhOTJlZDM4OGI1NTdiNTgzOTYxZA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YWVjYjI1YTNhMDQxZmMwMDY3OGIzYTkyNjYzZjIzYWY5Nzk4ZjlhZDI2MjQ5
10
- ZDhhOTZhNzkwMDMwNGQ0YjlkZTI2NWQ0YmI4NzI3ZjhjY2RmNWYzMjM1MGNk
11
- MzU0OTA3YmNhOTM3MmE0OTI4MjJjNmVmNmQ5ZDQzODM4NmQzMWI=
9
+ ODdiODllYjUyODFkNzhkODM2MTY1MjQ1MDA4NmZlZWExZTA4YjU3MmYxZWRh
10
+ ZDJjMWQyOGYyYjNkNzk1NTNlMTJkYTY4YTY2YWExYzY0YjQwZDFiZGNiYjM1
11
+ YjE2OTE2ZjU3OTk2NmU5MzJhMmEzYjJkN2Y5MmFmMjdkMGIxNDQ=
12
12
  data.tar.gz: !binary |-
13
- MTg0YzkzNGYwZDZlYWYwNTlmMGNlYmQyODYwNTI5ZmVmYmM2YmQ5NWVlZWI1
14
- MGExNWNlNmQyNmM4ZGQ5MDgwMTNlMzNjYzZlOTViZGU1ZTQ5ZmExNWZjZGFk
15
- M2ZjZmMxY2U3ZjY5OTJkN2ZhMWZiN2NjNjJmMDk0MWQ5OWEwNzI=
13
+ MWIzZDdjNjI5ODhlOWIwMmNlNzQyZTg3YWQ5MzNjYTM0MjEzNzMxNDhlY2Qy
14
+ YjQ3MjMyMjQ1NTg3OGM2YmFiOWNhZDdjMzdiOTY0MGJkYzNiMjZkZDIxZWRh
15
+ ODg0MmFhNzQ1ODU2M2YxYjE2ZjE3NmU3YTQ1OWNkNjMwMDdiYjQ=
data/.rubocop.yml CHANGED
@@ -46,6 +46,12 @@ Metrics/ParameterLists:
46
46
  StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#too-many-params'
47
47
  Enabled: false
48
48
 
49
+ Style/DotPosition:
50
+ EnforcedStyle: leading
51
+ SupportedStyles:
52
+ - leading
53
+ - trailing
54
+
49
55
  Style/EmptyLineBetweenDefs:
50
56
  AllowAdjacentOneLineDefs: true
51
57
 
@@ -57,6 +63,12 @@ Style/IndentationWidth:
57
63
  Style/MethodName:
58
64
  Enabled: false
59
65
 
66
+ Style/MultilineOperationIndentation:
67
+ EnforcedStyle: indented
68
+ SupportedStyles:
69
+ - aligned
70
+ - indented
71
+
60
72
  Style/StringLiterals:
61
73
  Description: Checks if uses of quotes match the configured preference.
62
74
  StyleGuide: https://github.com/bbatsov/ruby-style-guide#consistent-string-literals
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- motion-spec (0.3.0)
4
+ motion-spec (0.4.0)
5
5
  motion-require (>= 0.0.6)
6
6
 
7
7
  GEM
@@ -4,6 +4,7 @@ module MotionSpec
4
4
  include ContextHelper::Matchers
5
5
  include ContextHelper::Should
6
6
  include ContextHelper::Expectation
7
+ include ContextHelper::MemoizedHelpers
7
8
 
8
9
  attr_reader :name, :block
9
10
 
@@ -21,8 +22,7 @@ module MotionSpec
21
22
  end
22
23
 
23
24
  def run
24
- # TODO
25
- # return unless name =~ RestrictContext
25
+ # TODO: return unless name =~ RestrictContext
26
26
 
27
27
  if Platform.android?
28
28
  @specifications.each(&:run)
@@ -69,11 +69,16 @@ module MotionSpec
69
69
  instance_eval(&Shared[name])
70
70
  end
71
71
 
72
- def it(description, &block)
72
+ def it(description = nil, &block)
73
73
  return unless description =~ RestrictName
74
+
74
75
  block ||= proc { should.flunk 'not implemented' }
76
+
75
77
  Counter[:specifications] += 1
76
- @specifications << Specification.new(self, description, block, @before, @after)
78
+
79
+ @specifications << Specification.new(
80
+ self, description, block, @before, @after
81
+ )
77
82
  end
78
83
 
79
84
  def should(*args, &block)
@@ -135,11 +140,25 @@ module MotionSpec
135
140
  private
136
141
 
137
142
  def build_ios_parent_context(context)
138
- (parent_context = self).methods(false).each do |e|
139
- class << context
140
- self
141
- end.send(:define_method, e) do |*args|
142
- parent_context.send(e, *args)
143
+ parent_context = self
144
+
145
+ # object.methods(false) returns duplicate method names where one ends in
146
+ # a ':' (e.g. ['foo:', 'foo']). This was causing a low-level Ruby error:
147
+ # Assertion failed: (b != NULL), function rb_vm_block_method_imp, file vm.cpp, line 3386.
148
+ # To fix the issue we removed the 'foo:' version of the method names.
149
+ methods = parent_context
150
+ .methods(false)
151
+ .map { |name| name.to_s.chomp(':') }
152
+ .uniq
153
+
154
+ context_eigenclass = (class << context; self; end)
155
+ context_eigenclass.send(:define_method, :parent_context) { parent_context }
156
+
157
+ methods.each do |method_name|
158
+ next if context.respond_to?(method_name)
159
+
160
+ context_eigenclass.send(:define_method, method_name) do |*args|
161
+ parent_context.send(method_name, *args)
143
162
  end
144
163
  end
145
164
  end
@@ -0,0 +1,51 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module MotionSpec
3
+ module ContextHelper
4
+ module MemoizedHelpers
5
+ attr_accessor :__memoized
6
+
7
+ def let(name, &block)
8
+ raise '#let or #subject called without a block' unless block_given?
9
+
10
+ (class << self; self; end).class_eval do
11
+ define_method(name) do
12
+ self.__memoized ||= {}
13
+ __memoized.fetch(name) { __memoized[name] = block.call }
14
+ end
15
+ end
16
+
17
+ # The way that nested contexts are implemented requires us to manually
18
+ # reset any memoized values after each spec via an 'after'.
19
+ after { reset_memoized }
20
+ end
21
+
22
+ def let!(name, &block)
23
+ let(name, &block)
24
+ before { __send__(name) }
25
+ end
26
+
27
+ def subject(name = nil, &block)
28
+ if name
29
+ let(name, &block)
30
+ alias_method :subject, name
31
+ else
32
+ let(:subject, &block)
33
+ end
34
+ end
35
+
36
+ def subject!(name = nil, &block)
37
+ subject(name, &block)
38
+ before { subject }
39
+ end
40
+
41
+ def is_expected # rubocop:disable Style/PredicateName
42
+ expect(subject)
43
+ end
44
+
45
+ def reset_memoized
46
+ @__memoized = nil
47
+ parent_context.reset_memoized if respond_to?(:parent_context)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  module MotionSpec
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motion-spec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Bender
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-05 00:00:00.000000000 Z
11
+ date: 2015-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: motion-require
@@ -60,6 +60,7 @@ files:
60
60
  - lib/motion-spec/context.rb
61
61
  - lib/motion-spec/context_helper/expectation.rb
62
62
  - lib/motion-spec/context_helper/matchers.rb
63
+ - lib/motion-spec/context_helper/memoized_helpers.rb
63
64
  - lib/motion-spec/context_helper/should.rb
64
65
  - lib/motion-spec/core.rb
65
66
  - lib/motion-spec/error.rb