opal-rspec-cj 0.4.4

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.
Files changed (176) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/.gitmodules +15 -0
  4. data/.travis.yml +13 -0
  5. data/.yardopts +5 -0
  6. data/CHANGELOG.md +25 -0
  7. data/Gemfile +8 -0
  8. data/README.md +147 -0
  9. data/Rakefile +26 -0
  10. data/config.ru +10 -0
  11. data/example/Gemfile +4 -0
  12. data/example/README.md +13 -0
  13. data/example/Rakefile +8 -0
  14. data/example/opal/user.rb +11 -0
  15. data/example/spec/user_spec.rb +15 -0
  16. data/lib/opal-rspec.rb +2 -0
  17. data/lib/opal/rspec.rb +20 -0
  18. data/lib/opal/rspec/rake_task.rb +63 -0
  19. data/lib/opal/rspec/version.rb +5 -0
  20. data/opal-rspec.gemspec +21 -0
  21. data/opal/opal-rspec.rb +1 -0
  22. data/opal/opal/rspec.rb +25 -0
  23. data/opal/opal/rspec/async.rb +289 -0
  24. data/opal/opal/rspec/browser_formatter.rb +188 -0
  25. data/opal/opal/rspec/fixes.rb +116 -0
  26. data/opal/opal/rspec/requires.rb +45 -0
  27. data/opal/opal/rspec/runner.rb +69 -0
  28. data/opal/opal/rspec/sprockets_runner.rb.erb +11 -0
  29. data/opal/opal/rspec/text_formatter.rb +74 -0
  30. data/spec/async_spec.rb +38 -0
  31. data/spec/example_spec.rb +163 -0
  32. data/spec/matchers_spec.rb +201 -0
  33. data/spec/mock_spec.rb +63 -0
  34. data/spec/named_subject_spec.rb +11 -0
  35. data/spec/should_syntax_spec.rb +17 -0
  36. data/vendor/spec_runner.js +50 -0
  37. data/vendor_lib/rspec-expectations.rb +1 -0
  38. data/vendor_lib/rspec.rb +3 -0
  39. data/vendor_lib/rspec/autorun.rb +2 -0
  40. data/vendor_lib/rspec/core.rb +203 -0
  41. data/vendor_lib/rspec/core/backport_random.rb +302 -0
  42. data/vendor_lib/rspec/core/backtrace_formatter.rb +65 -0
  43. data/vendor_lib/rspec/core/command_line.rb +36 -0
  44. data/vendor_lib/rspec/core/configuration.rb +1129 -0
  45. data/vendor_lib/rspec/core/configuration_options.rb +143 -0
  46. data/vendor_lib/rspec/core/drb_command_line.rb +26 -0
  47. data/vendor_lib/rspec/core/drb_options.rb +87 -0
  48. data/vendor_lib/rspec/core/dsl.rb +26 -0
  49. data/vendor_lib/rspec/core/example.rb +312 -0
  50. data/vendor_lib/rspec/core/example_group.rb +540 -0
  51. data/vendor_lib/rspec/core/filter_manager.rb +224 -0
  52. data/vendor_lib/rspec/core/flat_map.rb +17 -0
  53. data/vendor_lib/rspec/core/formatters.rb +54 -0
  54. data/vendor_lib/rspec/core/formatters/base_formatter.rb +291 -0
  55. data/vendor_lib/rspec/core/formatters/base_text_formatter.rb +307 -0
  56. data/vendor_lib/rspec/core/formatters/deprecation_formatter.rb +193 -0
  57. data/vendor_lib/rspec/core/formatters/documentation_formatter.rb +67 -0
  58. data/vendor_lib/rspec/core/formatters/helpers.rb +82 -0
  59. data/vendor_lib/rspec/core/formatters/html_formatter.rb +155 -0
  60. data/vendor_lib/rspec/core/formatters/html_printer.rb +408 -0
  61. data/vendor_lib/rspec/core/formatters/json_formatter.rb +99 -0
  62. data/vendor_lib/rspec/core/formatters/progress_formatter.rb +32 -0
  63. data/vendor_lib/rspec/core/formatters/snippet_extractor.rb +101 -0
  64. data/vendor_lib/rspec/core/hooks.rb +535 -0
  65. data/vendor_lib/rspec/core/memoized_helpers.rb +431 -0
  66. data/vendor_lib/rspec/core/metadata.rb +313 -0
  67. data/vendor_lib/rspec/core/mocking/with_absolutely_nothing.rb +11 -0
  68. data/vendor_lib/rspec/core/mocking/with_flexmock.rb +27 -0
  69. data/vendor_lib/rspec/core/mocking/with_mocha.rb +52 -0
  70. data/vendor_lib/rspec/core/mocking/with_rr.rb +27 -0
  71. data/vendor_lib/rspec/core/mocking/with_rspec.rb +27 -0
  72. data/vendor_lib/rspec/core/option_parser.rb +234 -0
  73. data/vendor_lib/rspec/core/ordering.rb +154 -0
  74. data/vendor_lib/rspec/core/pending.rb +110 -0
  75. data/vendor_lib/rspec/core/project_initializer.rb +88 -0
  76. data/vendor_lib/rspec/core/rake_task.rb +128 -0
  77. data/vendor_lib/rspec/core/reporter.rb +132 -0
  78. data/vendor_lib/rspec/core/ruby_project.rb +44 -0
  79. data/vendor_lib/rspec/core/runner.rb +97 -0
  80. data/vendor_lib/rspec/core/shared_context.rb +53 -0
  81. data/vendor_lib/rspec/core/shared_example_group.rb +146 -0
  82. data/vendor_lib/rspec/core/shared_example_group/collection.rb +27 -0
  83. data/vendor_lib/rspec/core/version.rb +7 -0
  84. data/vendor_lib/rspec/core/warnings.rb +22 -0
  85. data/vendor_lib/rspec/core/world.rb +131 -0
  86. data/vendor_lib/rspec/expectations.rb +75 -0
  87. data/vendor_lib/rspec/expectations/differ.rb +154 -0
  88. data/vendor_lib/rspec/expectations/errors.rb +9 -0
  89. data/vendor_lib/rspec/expectations/expectation_target.rb +87 -0
  90. data/vendor_lib/rspec/expectations/extensions.rb +1 -0
  91. data/vendor_lib/rspec/expectations/extensions/object.rb +29 -0
  92. data/vendor_lib/rspec/expectations/fail_with.rb +79 -0
  93. data/vendor_lib/rspec/expectations/handler.rb +68 -0
  94. data/vendor_lib/rspec/expectations/syntax.rb +182 -0
  95. data/vendor_lib/rspec/expectations/version.rb +8 -0
  96. data/vendor_lib/rspec/matchers.rb +633 -0
  97. data/vendor_lib/rspec/matchers/built_in.rb +39 -0
  98. data/vendor_lib/rspec/matchers/built_in/base_matcher.rb +68 -0
  99. data/vendor_lib/rspec/matchers/built_in/be.rb +213 -0
  100. data/vendor_lib/rspec/matchers/built_in/be_instance_of.rb +15 -0
  101. data/vendor_lib/rspec/matchers/built_in/be_kind_of.rb +11 -0
  102. data/vendor_lib/rspec/matchers/built_in/be_within.rb +55 -0
  103. data/vendor_lib/rspec/matchers/built_in/change.rb +141 -0
  104. data/vendor_lib/rspec/matchers/built_in/cover.rb +21 -0
  105. data/vendor_lib/rspec/matchers/built_in/eq.rb +22 -0
  106. data/vendor_lib/rspec/matchers/built_in/eql.rb +23 -0
  107. data/vendor_lib/rspec/matchers/built_in/equal.rb +48 -0
  108. data/vendor_lib/rspec/matchers/built_in/exist.rb +26 -0
  109. data/vendor_lib/rspec/matchers/built_in/has.rb +48 -0
  110. data/vendor_lib/rspec/matchers/built_in/include.rb +61 -0
  111. data/vendor_lib/rspec/matchers/built_in/match.rb +17 -0
  112. data/vendor_lib/rspec/matchers/built_in/match_array.rb +51 -0
  113. data/vendor_lib/rspec/matchers/built_in/raise_error.rb +154 -0
  114. data/vendor_lib/rspec/matchers/built_in/respond_to.rb +74 -0
  115. data/vendor_lib/rspec/matchers/built_in/satisfy.rb +30 -0
  116. data/vendor_lib/rspec/matchers/built_in/start_and_end_with.rb +48 -0
  117. data/vendor_lib/rspec/matchers/built_in/throw_symbol.rb +94 -0
  118. data/vendor_lib/rspec/matchers/built_in/yield.rb +297 -0
  119. data/vendor_lib/rspec/matchers/compatibility.rb +14 -0
  120. data/vendor_lib/rspec/matchers/configuration.rb +113 -0
  121. data/vendor_lib/rspec/matchers/dsl.rb +23 -0
  122. data/vendor_lib/rspec/matchers/generated_descriptions.rb +35 -0
  123. data/vendor_lib/rspec/matchers/matcher.rb +301 -0
  124. data/vendor_lib/rspec/matchers/method_missing.rb +12 -0
  125. data/vendor_lib/rspec/matchers/operator_matcher.rb +99 -0
  126. data/vendor_lib/rspec/matchers/pretty.rb +70 -0
  127. data/vendor_lib/rspec/matchers/test_unit_integration.rb +11 -0
  128. data/vendor_lib/rspec/mocks.rb +100 -0
  129. data/vendor_lib/rspec/mocks/any_instance/chain.rb +92 -0
  130. data/vendor_lib/rspec/mocks/any_instance/expectation_chain.rb +47 -0
  131. data/vendor_lib/rspec/mocks/any_instance/message_chains.rb +75 -0
  132. data/vendor_lib/rspec/mocks/any_instance/recorder.rb +200 -0
  133. data/vendor_lib/rspec/mocks/any_instance/stub_chain.rb +45 -0
  134. data/vendor_lib/rspec/mocks/any_instance/stub_chain_chain.rb +23 -0
  135. data/vendor_lib/rspec/mocks/argument_list_matcher.rb +104 -0
  136. data/vendor_lib/rspec/mocks/argument_matchers.rb +264 -0
  137. data/vendor_lib/rspec/mocks/arity_calculator.rb +66 -0
  138. data/vendor_lib/rspec/mocks/configuration.rb +111 -0
  139. data/vendor_lib/rspec/mocks/error_generator.rb +203 -0
  140. data/vendor_lib/rspec/mocks/errors.rb +12 -0
  141. data/vendor_lib/rspec/mocks/example_methods.rb +201 -0
  142. data/vendor_lib/rspec/mocks/extensions/marshal.rb +17 -0
  143. data/vendor_lib/rspec/mocks/framework.rb +36 -0
  144. data/vendor_lib/rspec/mocks/instance_method_stasher.rb +112 -0
  145. data/vendor_lib/rspec/mocks/matchers/have_received.rb +99 -0
  146. data/vendor_lib/rspec/mocks/matchers/receive.rb +112 -0
  147. data/vendor_lib/rspec/mocks/matchers/receive_messages.rb +72 -0
  148. data/vendor_lib/rspec/mocks/message_expectation.rb +643 -0
  149. data/vendor_lib/rspec/mocks/method_double.rb +209 -0
  150. data/vendor_lib/rspec/mocks/method_reference.rb +95 -0
  151. data/vendor_lib/rspec/mocks/mock.rb +7 -0
  152. data/vendor_lib/rspec/mocks/mutate_const.rb +406 -0
  153. data/vendor_lib/rspec/mocks/object_reference.rb +90 -0
  154. data/vendor_lib/rspec/mocks/order_group.rb +82 -0
  155. data/vendor_lib/rspec/mocks/proxy.rb +269 -0
  156. data/vendor_lib/rspec/mocks/proxy_for_nil.rb +37 -0
  157. data/vendor_lib/rspec/mocks/space.rb +95 -0
  158. data/vendor_lib/rspec/mocks/standalone.rb +3 -0
  159. data/vendor_lib/rspec/mocks/stub_chain.rb +51 -0
  160. data/vendor_lib/rspec/mocks/syntax.rb +374 -0
  161. data/vendor_lib/rspec/mocks/targets.rb +90 -0
  162. data/vendor_lib/rspec/mocks/test_double.rb +109 -0
  163. data/vendor_lib/rspec/mocks/verifying_double.rb +77 -0
  164. data/vendor_lib/rspec/mocks/verifying_message_expecation.rb +60 -0
  165. data/vendor_lib/rspec/mocks/verifying_proxy.rb +151 -0
  166. data/vendor_lib/rspec/mocks/version.rb +7 -0
  167. data/vendor_lib/rspec/support.rb +6 -0
  168. data/vendor_lib/rspec/support/caller_filter.rb +56 -0
  169. data/vendor_lib/rspec/support/spec.rb +14 -0
  170. data/vendor_lib/rspec/support/spec/deprecation_helpers.rb +29 -0
  171. data/vendor_lib/rspec/support/spec/in_sub_process.rb +40 -0
  172. data/vendor_lib/rspec/support/spec/stderr_splitter.rb +50 -0
  173. data/vendor_lib/rspec/support/version.rb +7 -0
  174. data/vendor_lib/rspec/support/warnings.rb +41 -0
  175. data/vendor_lib/rspec/version.rb +5 -0
  176. metadata +268 -0
@@ -0,0 +1,11 @@
1
+ module RSpec
2
+ module Core
3
+ module MockFrameworkAdapter
4
+
5
+ def setup_mocks_for_rspec; end
6
+ def verify_mocks_for_rspec; end
7
+ def teardown_mocks_for_rspec; end
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Jim Weirich on 2007-04-10.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+ require 'flexmock/rspec'
7
+
8
+ module RSpec
9
+ module Core
10
+ module MockFrameworkAdapter
11
+
12
+ def self.framework_name; :flexmock end
13
+
14
+ include FlexMock::MockContainer
15
+ def setup_mocks_for_rspec
16
+ # No setup required
17
+ end
18
+ def verify_mocks_for_rspec
19
+ flexmock_verify
20
+ end
21
+ def teardown_mocks_for_rspec
22
+ flexmock_close
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,52 @@
1
+ # In order to support all versions of mocha, we have to jump through some
2
+ # hoops here.
3
+ #
4
+ # mocha >= '0.13.0':
5
+ # require 'mocha/api' is required
6
+ # require 'mocha/object' raises a LoadError b/c the file no longer exists
7
+ # mocha < '0.13.0', >= '0.9.7'
8
+ # require 'mocha/api' is required
9
+ # require 'mocha/object' is required
10
+ # mocha < '0.9.7':
11
+ # require 'mocha/api' raises a LoadError b/c the file does not yet exist
12
+ # require 'mocha/standalone' is required
13
+ # require 'mocha/object' is required
14
+ begin
15
+ require 'mocha/api'
16
+
17
+ begin
18
+ require 'mocha/object'
19
+ rescue LoadError
20
+ # Mocha >= 0.13.0 no longer contains this file nor needs it to be loaded
21
+ end
22
+ rescue LoadError
23
+ require 'mocha/standalone'
24
+ require 'mocha/object'
25
+ end
26
+
27
+ module RSpec
28
+ module Core
29
+ module MockFrameworkAdapter
30
+ def self.framework_name; :mocha end
31
+
32
+ # Mocha::Standalone was deprecated as of Mocha 0.9.7.
33
+ begin
34
+ include Mocha::API
35
+ rescue NameError
36
+ include Mocha::Standalone
37
+ end
38
+
39
+ def setup_mocks_for_rspec
40
+ mocha_setup
41
+ end
42
+
43
+ def verify_mocks_for_rspec
44
+ mocha_verify
45
+ end
46
+
47
+ def teardown_mocks_for_rspec
48
+ mocha_teardown
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,27 @@
1
+ require 'rr'
2
+
3
+ RSpec.configuration.backtrace_exclusion_patterns.push(RR::Errors::BACKTRACE_IDENTIFIER)
4
+
5
+ module RSpec
6
+ module Core
7
+ module MockFrameworkAdapter
8
+
9
+ def self.framework_name; :rr end
10
+
11
+ include RR::Extensions::InstanceMethods
12
+
13
+ def setup_mocks_for_rspec
14
+ RR::Space.instance.reset
15
+ end
16
+
17
+ def verify_mocks_for_rspec
18
+ RR::Space.instance.verify_doubles
19
+ end
20
+
21
+ def teardown_mocks_for_rspec
22
+ RR::Space.instance.reset
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ require 'rspec/mocks'
2
+
3
+ module RSpec
4
+ module Core
5
+ module MockFrameworkAdapter
6
+
7
+ def self.framework_name; :rspec end
8
+
9
+ def self.configuration
10
+ RSpec::Mocks.configuration
11
+ end
12
+
13
+ def setup_mocks_for_rspec
14
+ RSpec::Mocks::setup(self)
15
+ end
16
+
17
+ def verify_mocks_for_rspec
18
+ RSpec::Mocks::verify
19
+ end
20
+
21
+ def teardown_mocks_for_rspec
22
+ RSpec::Mocks::teardown
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,234 @@
1
+ # http://www.ruby-doc.org/stdlib/libdoc/optparse/rdoc/classes/OptionParser.html
2
+ require 'optparse'
3
+
4
+ module RSpec::Core
5
+ class Parser
6
+ def self.parse!(args)
7
+ new.parse!(args)
8
+ end
9
+
10
+ class << self
11
+ alias_method :parse, :parse!
12
+ end
13
+
14
+ def parse!(args)
15
+ return {} if args.empty?
16
+
17
+ convert_deprecated_args(args)
18
+
19
+ options = args.delete('--tty') ? {:tty => true} : {}
20
+ begin
21
+ parser(options).parse!(args)
22
+ rescue OptionParser::InvalidOption => e
23
+ abort "#{e.message}\n\nPlease use --help for a listing of valid options"
24
+ end
25
+
26
+ options
27
+ end
28
+
29
+ def convert_deprecated_args(args)
30
+ args.map! { |arg|
31
+ case arg
32
+ when "--formatter"
33
+ RSpec.deprecate("the --formatter option", :replacement => "-f or --format")
34
+ "--format"
35
+ when "--default_path"
36
+ "--default-path"
37
+ when "--line_number"
38
+ "--line-number"
39
+ else
40
+ arg
41
+ end
42
+ }
43
+ end
44
+
45
+ alias_method :parse, :parse!
46
+
47
+ def parser(options)
48
+ OptionParser.new do |parser|
49
+ parser.banner = "Usage: rspec [options] [files or directories]\n\n"
50
+
51
+ parser.on('-I PATH', 'Specify PATH to add to $LOAD_PATH (may be used more than once).') do |dir|
52
+ options[:libs] ||= []
53
+ options[:libs] << dir
54
+ end
55
+
56
+ parser.on('-r', '--require PATH', 'Require a file.') do |path|
57
+ options[:requires] ||= []
58
+ options[:requires] << path
59
+ end
60
+
61
+ parser.on('-O', '--options PATH', 'Specify the path to a custom options file.') do |path|
62
+ options[:custom_options_file] = path
63
+ end
64
+
65
+ parser.on('--order TYPE[:SEED]', 'Run examples by the specified order type.',
66
+ ' [defined] examples and groups are run in the order they are defined',
67
+ ' [rand] randomize the order of groups and examples',
68
+ ' [random] alias for rand',
69
+ ' [random:SEED] e.g. --order random:123') do |o|
70
+ options[:order] = o
71
+ end
72
+
73
+ parser.on('--seed SEED', Integer, 'Equivalent of --order rand:SEED.') do |seed|
74
+ options[:order] = "rand:#{seed}"
75
+ end
76
+
77
+ parser.on('--fail-fast', 'Abort the run on first failure.') do |o|
78
+ options[:fail_fast] = true
79
+ end
80
+
81
+ parser.on('--no-fail-fast', 'Do not abort the run on first failure.') do |o|
82
+ options[:fail_fast] = false
83
+ end
84
+
85
+ parser.on('--failure-exit-code CODE', Integer, 'Override the exit code used when there are failing specs.') do |code|
86
+ options[:failure_exit_code] = code
87
+ end
88
+
89
+ parser.on('--dry-run', 'Print the formatter output of your suite without',
90
+ ' running any examples or hooks') do |o|
91
+ options[:dry_run] = true
92
+ end
93
+
94
+ parser.on('-X', '--[no-]drb', 'Run examples via DRb.') do |o|
95
+ options[:drb] = o
96
+ end
97
+
98
+ parser.on('--drb-port PORT', 'Port to connect to the DRb server.') do |o|
99
+ options[:drb_port] = o.to_i
100
+ end
101
+
102
+ parser.on('--init', 'Initialize your project with RSpec.') do |cmd|
103
+ require 'rspec/core/project_initializer'
104
+ ProjectInitializer.new(cmd).run
105
+ exit
106
+ end
107
+
108
+ parser.on('--configure', 'Deprecated. Use --init instead.') do |cmd|
109
+ RSpec.warning "--configure is deprecated with no effect. Use --init instead.", :call_site => nil
110
+ exit
111
+ end
112
+
113
+ parser.separator("\n **** Output ****\n\n")
114
+
115
+ parser.on('-f', '--format FORMATTER', 'Choose a formatter.',
116
+ ' [p]rogress (default - dots)',
117
+ ' [d]ocumentation (group and example names)',
118
+ ' [h]tml',
119
+ ' [j]son',
120
+ ' custom formatter class name') do |o|
121
+ options[:formatters] ||= []
122
+ options[:formatters] << [o]
123
+ end
124
+
125
+ parser.on('-o', '--out FILE',
126
+ 'Write output to a file instead of $stdout. This option applies',
127
+ ' to the previously specified --format, or the default format',
128
+ ' if no format is specified.'
129
+ ) do |o|
130
+ options[:formatters] ||= [['progress']]
131
+ options[:formatters].last << o
132
+ end
133
+
134
+ parser.on('-b', '--backtrace', 'Enable full backtrace.') do |o|
135
+ options[:full_backtrace] = true
136
+ end
137
+
138
+ parser.on('-c', '--[no-]color', '--[no-]colour', 'Enable color in the output.') do |o|
139
+ options[:color] = o
140
+ end
141
+
142
+ parser.on('-p', '--[no-]profile [COUNT]', 'Enable profiling of examples and list the slowest examples (default: 10).') do |argument|
143
+ options[:profile_examples] = if argument.nil?
144
+ true
145
+ elsif argument == false
146
+ false
147
+ else
148
+ begin
149
+ Integer(argument)
150
+ rescue ArgumentError
151
+ RSpec.warning "Non integer specified as profile count, seperate " +
152
+ "your path from options with -- e.g. " +
153
+ "`rspec --profile -- #{argument}`",
154
+ :call_site => nil
155
+ true
156
+ end
157
+ end
158
+ end
159
+
160
+ parser.on('-w', '--warnings', 'Enable ruby warnings') do
161
+ options[:warnings] = true
162
+ end
163
+
164
+ parser.separator <<-FILTERING
165
+
166
+ **** Filtering/tags ****
167
+
168
+ In addition to the following options for selecting specific files, groups,
169
+ or examples, you can select a single example by appending the line number to
170
+ the filename:
171
+
172
+ rspec path/to/a_spec.rb:37
173
+
174
+ FILTERING
175
+
176
+ parser.on('-P', '--pattern PATTERN', 'Load files matching pattern (default: "spec/**/*_spec.rb").') do |o|
177
+ options[:pattern] = o
178
+ end
179
+
180
+ parser.on('-e', '--example STRING', "Run examples whose full nested names include STRING (may be",
181
+ " used more than once)") do |o|
182
+ (options[:full_description] ||= []) << Regexp.compile(Regexp.escape(o))
183
+ end
184
+
185
+ parser.on('-l', '--line-number LINE', 'Specify line number of an example or group (may be',
186
+ ' used more than once).') do |o|
187
+ (options[:line_numbers] ||= []) << o
188
+ end
189
+
190
+ parser.on('-t', '--tag TAG[:VALUE]',
191
+ 'Run examples with the specified tag, or exclude examples',
192
+ 'by adding ~ before the tag.',
193
+ ' - e.g. ~slow',
194
+ ' - TAG is always converted to a symbol') do |tag|
195
+ filter_type = tag =~ /^~/ ? :exclusion_filter : :inclusion_filter
196
+
197
+ name,value = tag.gsub(/^(~@|~|@)/, '').split(':',2)
198
+ name = name.to_sym
199
+
200
+ options[filter_type] ||= {}
201
+ options[filter_type][name] = case value
202
+ when nil then true # The default value for tags is true
203
+ when 'true' then true
204
+ when 'false' then false
205
+ when 'nil' then nil
206
+ when /^:/ then value[1..-1].to_sym
207
+ when /^\d+$/ then Integer(value)
208
+ when /^\d+.\d+$/ then Float(value)
209
+ else
210
+ value
211
+ end
212
+ end
213
+
214
+ parser.on('--default-path PATH', 'Set the default path where RSpec looks for examples (can',
215
+ ' be a path to a file or a directory).') do |path|
216
+ options[:default_path] = path
217
+ end
218
+
219
+ parser.separator("\n **** Utility ****\n\n")
220
+
221
+ parser.on('-v', '--version', 'Display the version.') do
222
+ puts RSpec::Core::Version::STRING
223
+ exit
224
+ end
225
+
226
+ parser.on_tail('-h', '--help', "You're looking at it.") do
227
+ puts parser
228
+ exit
229
+ end
230
+
231
+ end
232
+ end
233
+ end
234
+ end
@@ -0,0 +1,154 @@
1
+ module RSpec
2
+ module Core
3
+ if defined?(::Random)
4
+ RandomNumberGenerator = ::Random
5
+ else
6
+ require 'rspec/core/backport_random'
7
+ RandomNumberGenerator = RSpec::Core::Backports::Random
8
+ end
9
+
10
+ # @private
11
+ module Ordering
12
+ # @private
13
+ # The default global ordering (defined order).
14
+ class Identity
15
+ def order(items)
16
+ items
17
+ end
18
+ end
19
+
20
+ # @private
21
+ # Orders items randomly.
22
+ class Random
23
+ def initialize(configuration)
24
+ @configuration = configuration
25
+ @used = false
26
+ end
27
+
28
+ def used?
29
+ @used
30
+ end
31
+
32
+ def order(items)
33
+ @used = true
34
+ rng = RandomNumberGenerator.new(@configuration.seed)
35
+ shuffle items, rng
36
+ end
37
+
38
+ if RUBY_VERSION > '1.9.3'
39
+ def shuffle(list, rng)
40
+ list.shuffle(:random => rng)
41
+ end
42
+ else
43
+ def shuffle(list, rng)
44
+ shuffled = list.dup
45
+ shuffled.size.times do |i|
46
+ j = i + rng.rand(shuffled.size - i)
47
+ next if i == j
48
+ shuffled[i], shuffled[j] = shuffled[j], shuffled[i]
49
+ end
50
+
51
+ shuffled
52
+ end
53
+ end
54
+ end
55
+
56
+ # @private
57
+ # Orders items based on a custom block.
58
+ class Custom
59
+ def initialize(callable)
60
+ @callable = callable
61
+ end
62
+
63
+ def order(list)
64
+ @callable.call(list)
65
+ end
66
+ end
67
+
68
+ # @private
69
+ # Stores the different ordering strategies.
70
+ class Registry
71
+ def initialize(configuration)
72
+ @configuration = configuration
73
+ @strategies = {}
74
+
75
+ register(:random, Random.new(configuration))
76
+
77
+ identity = Identity.new
78
+ register(:defined, identity)
79
+
80
+ # The default global ordering is --defined.
81
+ register(:global, identity)
82
+ end
83
+
84
+ def fetch(name, &fallback)
85
+ @strategies.fetch(name, &fallback)
86
+ end
87
+
88
+ def register(sym, strategy)
89
+ @strategies[sym] = strategy
90
+ end
91
+
92
+ def used_random_seed?
93
+ @strategies[:random].used?
94
+ end
95
+ end
96
+
97
+ # @private
98
+ # Manages ordering configuration.
99
+ #
100
+ # @note This is not intended to be used externally. Use
101
+ # the APIs provided by `RSpec::Core::Configuration` instead.
102
+ class ConfigurationManager
103
+ attr_reader :seed, :ordering_registry
104
+
105
+ def initialize
106
+ @ordering_registry = Registry.new(self)
107
+ @seed = rand(0xFFFF)
108
+ @seed_forced = false
109
+ @order_forced = false
110
+ end
111
+
112
+ def seed_used?
113
+ ordering_registry.used_random_seed?
114
+ end
115
+
116
+ def seed=(seed)
117
+ return if @seed_forced
118
+ register_ordering(:global, ordering_registry.fetch(:random))
119
+ @seed = seed.to_i
120
+ end
121
+
122
+ def order=(type)
123
+ order, seed = type.to_s.split(':')
124
+ @seed = seed = seed.to_i if seed
125
+
126
+ ordering_name = if order.include?('rand')
127
+ :random
128
+ elsif order == 'defined'
129
+ :defined
130
+ end
131
+
132
+ register_ordering(:global, ordering_registry.fetch(ordering_name)) if ordering_name
133
+ end
134
+
135
+ def force(hash)
136
+ if hash.has_key?(:seed)
137
+ self.seed = hash[:seed]
138
+ @seed_forced = true
139
+ @order_forced = true
140
+ elsif hash.has_key?(:order)
141
+ self.order = hash[:order]
142
+ @order_forced = true
143
+ end
144
+ end
145
+
146
+ def register_ordering(name, strategy = Custom.new(Proc.new { |l| yield l }))
147
+ return if @order_forced && name == :global
148
+ ordering_registry.register(name, strategy)
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+