sublimetheme 1.0.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 +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +230 -0
- data/Rakefile +8 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/sublimetheme.rb +6832 -0
- data/lib/sublimetheme/version.rb +3 -0
- data/path/bin/htmldiff +25 -0
- data/path/bin/htmldiff.bat +6 -0
- data/path/bin/ldiff +25 -0
- data/path/bin/ldiff.bat +6 -0
- data/path/bin/rspec +23 -0
- data/path/bin/rspec.bat +6 -0
- data/path/cache/diff-lcs-1.2.5.gem +0 -0
- data/path/cache/rspec-3.3.0.gem +0 -0
- data/path/cache/rspec-core-3.3.2.gem +0 -0
- data/path/cache/rspec-expectations-3.3.1.gem +0 -0
- data/path/cache/rspec-mocks-3.3.2.gem +0 -0
- data/path/cache/rspec-support-3.3.0.gem +0 -0
- data/path/gems/diff-lcs-1.2.5/.autotest +3 -0
- data/path/gems/diff-lcs-1.2.5/.gemtest +0 -0
- data/path/gems/diff-lcs-1.2.5/.hoerc +2 -0
- data/path/gems/diff-lcs-1.2.5/.rspec +2 -0
- data/path/gems/diff-lcs-1.2.5/.travis.yml +22 -0
- data/path/gems/diff-lcs-1.2.5/Contributing.rdoc +64 -0
- data/path/gems/diff-lcs-1.2.5/Gemfile +20 -0
- data/path/gems/diff-lcs-1.2.5/History.rdoc +152 -0
- data/path/gems/diff-lcs-1.2.5/License.rdoc +39 -0
- data/path/gems/diff-lcs-1.2.5/Manifest.txt +38 -0
- data/path/gems/diff-lcs-1.2.5/README.rdoc +85 -0
- data/path/gems/diff-lcs-1.2.5/Rakefile +41 -0
- data/path/gems/diff-lcs-1.2.5/autotest/discover.rb +1 -0
- data/path/gems/diff-lcs-1.2.5/bin/htmldiff +32 -0
- data/path/gems/diff-lcs-1.2.5/bin/ldiff +6 -0
- data/path/gems/diff-lcs-1.2.5/docs/COPYING.txt +339 -0
- data/path/gems/diff-lcs-1.2.5/docs/artistic.txt +127 -0
- data/path/gems/diff-lcs-1.2.5/lib/diff-lcs.rb +3 -0
- data/path/gems/diff-lcs-1.2.5/lib/diff/lcs.rb +805 -0
- data/path/gems/diff-lcs-1.2.5/lib/diff/lcs/array.rb +7 -0
- data/path/gems/diff-lcs-1.2.5/lib/diff/lcs/block.rb +37 -0
- data/path/gems/diff-lcs-1.2.5/lib/diff/lcs/callbacks.rb +322 -0
- data/path/gems/diff-lcs-1.2.5/lib/diff/lcs/change.rb +177 -0
- data/path/gems/diff-lcs-1.2.5/lib/diff/lcs/htmldiff.rb +149 -0
- data/path/gems/diff-lcs-1.2.5/lib/diff/lcs/hunk.rb +276 -0
- data/path/gems/diff-lcs-1.2.5/lib/diff/lcs/internals.rb +301 -0
- data/path/gems/diff-lcs-1.2.5/lib/diff/lcs/ldiff.rb +195 -0
- data/path/gems/diff-lcs-1.2.5/lib/diff/lcs/string.rb +5 -0
- data/path/gems/diff-lcs-1.2.5/spec/change_spec.rb +65 -0
- data/path/gems/diff-lcs-1.2.5/spec/diff_spec.rb +47 -0
- data/path/gems/diff-lcs-1.2.5/spec/hunk_spec.rb +72 -0
- data/path/gems/diff-lcs-1.2.5/spec/issues_spec.rb +24 -0
- data/path/gems/diff-lcs-1.2.5/spec/lcs_spec.rb +54 -0
- data/path/gems/diff-lcs-1.2.5/spec/patch_spec.rb +414 -0
- data/path/gems/diff-lcs-1.2.5/spec/sdiff_spec.rb +214 -0
- data/path/gems/diff-lcs-1.2.5/spec/spec_helper.rb +290 -0
- data/path/gems/diff-lcs-1.2.5/spec/traverse_balanced_spec.rb +310 -0
- data/path/gems/diff-lcs-1.2.5/spec/traverse_sequences_spec.rb +139 -0
- data/path/gems/rspec-3.3.0/License.txt +24 -0
- data/path/gems/rspec-3.3.0/README.md +34 -0
- data/path/gems/rspec-3.3.0/lib/rspec.rb +3 -0
- data/path/gems/rspec-3.3.0/lib/rspec/version.rb +5 -0
- data/path/gems/rspec-core-3.3.2/.document +5 -0
- data/path/gems/rspec-core-3.3.2/.yardopts +8 -0
- data/path/gems/rspec-core-3.3.2/Changelog.md +1856 -0
- data/path/gems/rspec-core-3.3.2/License.txt +25 -0
- data/path/gems/rspec-core-3.3.2/README.md +369 -0
- data/path/gems/rspec-core-3.3.2/exe/rspec +4 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/autorun.rb +3 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core.rb +181 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/backtrace_formatter.rb +64 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/bisect/coordinator.rb +66 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/bisect/example_minimizer.rb +130 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/bisect/runner.rb +139 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/bisect/server.rb +61 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/bisect/subset_enumerator.rb +39 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/configuration.rb +1807 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/configuration_options.rb +191 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/drb.rb +111 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/dsl.rb +96 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/example.rb +573 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/example_group.rb +796 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/example_status_persister.rb +235 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/filter_manager.rb +231 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/flat_map.rb +20 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters.rb +254 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/base_formatter.rb +70 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/base_text_formatter.rb +77 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/bisect_formatter.rb +68 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/bisect_progress_formatter.rb +115 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/console_codes.rb +65 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/deprecation_formatter.rb +223 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/documentation_formatter.rb +70 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/exception_presenter.rb +393 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/fallback_message_formatter.rb +28 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/helpers.rb +109 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/html_formatter.rb +151 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/html_printer.rb +415 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/json_formatter.rb +96 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/profile_formatter.rb +68 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/progress_formatter.rb +28 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/protocol.rb +172 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/formatters/snippet_extractor.rb +116 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/hooks.rb +638 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/memoized_helpers.rb +532 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/metadata.rb +490 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/metadata_filter.rb +235 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/minitest_assertions_adapter.rb +31 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/mocking_adapters/flexmock.rb +31 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/mocking_adapters/mocha.rb +57 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/mocking_adapters/null.rb +14 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/mocking_adapters/rr.rb +31 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/mocking_adapters/rspec.rb +32 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/mutex.rb +63 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/notifications.rb +498 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/option_parser.rb +301 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/ordering.rb +158 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/pending.rb +165 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/profiler.rb +32 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/project_initializer.rb +48 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/project_initializer/.rspec +2 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/project_initializer/spec/spec_helper.rb +96 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/rake_task.rb +158 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/reentrant_mutex.rb +52 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/reporter.rb +220 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/ruby_project.rb +53 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb +179 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/sandbox.rb +37 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/set.rb +49 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/shared_context.rb +55 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/shared_example_group.rb +210 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/shell_escape.rb +49 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/version.rb +9 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/warnings.rb +40 -0
- data/path/gems/rspec-core-3.3.2/lib/rspec/core/world.rb +178 -0
- data/path/gems/rspec-expectations-3.3.1/.document +5 -0
- data/path/gems/rspec-expectations-3.3.1/.yardopts +6 -0
- data/path/gems/rspec-expectations-3.3.1/Changelog.md +953 -0
- data/path/gems/rspec-expectations-3.3.1/License.txt +24 -0
- data/path/gems/rspec-expectations-3.3.1/README.md +289 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/expectations.rb +81 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/expectations/configuration.rb +164 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/expectations/expectation_target.rb +113 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/expectations/fail_with.rb +31 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/expectations/failure_aggregator.rb +194 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/expectations/handler.rb +170 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/expectations/minitest_integration.rb +31 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/expectations/syntax.rb +132 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/expectations/version.rb +8 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers.rb +1009 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/aliased_matcher.rb +116 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in.rb +52 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/all.rb +85 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/base_matcher.rb +181 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/be.rb +285 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/be_between.rb +77 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/be_instance_of.rb +22 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/be_kind_of.rb +16 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/be_within.rb +72 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/change.rb +337 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/compound.rb +293 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/contain_exactly.rb +253 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/cover.rb +24 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/eq.rb +40 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/eql.rb +34 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/equal.rb +81 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/exist.rb +86 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/has.rb +103 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/have_attributes.rb +114 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/include.rb +130 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/match.rb +37 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/operators.rb +128 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/output.rb +200 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/raise_error.rb +216 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/respond_to.rb +90 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/satisfy.rb +37 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/start_or_end_with.rb +94 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/throw_symbol.rb +132 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/built_in/yield.rb +418 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/composable.rb +184 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/dsl.rb +453 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/english_phrasing.rb +42 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/expecteds_for_multiple_diffs.rb +73 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/fail_matchers.rb +42 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/generated_descriptions.rb +42 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/matcher_delegator.rb +35 -0
- data/path/gems/rspec-expectations-3.3.1/lib/rspec/matchers/matcher_protocol.rb +99 -0
- data/path/gems/rspec-mocks-3.3.2/.document +5 -0
- data/path/gems/rspec-mocks-3.3.2/.yardopts +6 -0
- data/path/gems/rspec-mocks-3.3.2/Changelog.md +965 -0
- data/path/gems/rspec-mocks-3.3.2/License.txt +24 -0
- data/path/gems/rspec-mocks-3.3.2/README.md +430 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks.rb +126 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/any_instance.rb +11 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/any_instance/chain.rb +110 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/any_instance/error_generator.rb +31 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/any_instance/expect_chain_chain.rb +35 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/any_instance/expectation_chain.rb +48 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/any_instance/message_chains.rb +83 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/any_instance/proxy.rb +116 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/any_instance/recorder.rb +264 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/any_instance/stub_chain.rb +46 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/any_instance/stub_chain_chain.rb +27 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/argument_list_matcher.rb +100 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/argument_matchers.rb +320 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/configuration.rb +188 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/error_generator.rb +362 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/example_methods.rb +421 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/instance_method_stasher.rb +135 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/marshal_extension.rb +41 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/matchers/expectation_customization.rb +20 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/matchers/have_received.rb +116 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/matchers/receive.rb +130 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/matchers/receive_message_chain.rb +80 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/matchers/receive_messages.rb +75 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/message_chain.rb +87 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/message_expectation.rb +717 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/method_double.rb +287 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/method_reference.rb +192 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/mutate_const.rb +335 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/mutex.rb +73 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/object_reference.rb +149 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/order_group.rb +81 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/proxy.rb +439 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/reentrant_mutex.rb +53 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/space.rb +238 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/standalone.rb +3 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/syntax.rb +325 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/targets.rb +97 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/test_double.rb +170 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/verifying_double.rb +129 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/verifying_message_expecation.rb +54 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/verifying_proxy.rb +213 -0
- data/path/gems/rspec-mocks-3.3.2/lib/rspec/mocks/version.rb +9 -0
- data/path/gems/rspec-support-3.3.0/Changelog.md +125 -0
- data/path/gems/rspec-support-3.3.0/LICENSE.txt +22 -0
- data/path/gems/rspec-support-3.3.0/README.md +26 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support.rb +111 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/caller_filter.rb +83 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/differ.rb +215 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/directory_maker.rb +63 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/encoded_string.rb +155 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/fuzzy_matcher.rb +48 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/hunk_generator.rb +47 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/matcher_definition.rb +42 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/method_signature_verifier.rb +273 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/object_formatter.rb +93 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/recursive_const_methods.rb +76 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/ruby_features.rb +118 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/spec.rb +81 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/spec/deprecation_helpers.rb +64 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/spec/formatting_support.rb +9 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/spec/in_sub_process.rb +52 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/spec/library_wide_checks.rb +145 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/spec/shell_out.rb +71 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/spec/stderr_splitter.rb +63 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/spec/string_matcher.rb +46 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/spec/with_isolated_directory.rb +9 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/spec/with_isolated_stderr.rb +13 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/version.rb +7 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/version_checker.rb +53 -0
- data/path/gems/rspec-support-3.3.0/lib/rspec/support/warnings.rb +39 -0
- data/path/specifications/diff-lcs-1.2.5.gemspec +68 -0
- data/path/specifications/rspec-3.3.0.gemspec +42 -0
- data/path/specifications/rspec-core-3.3.2.gemspec +68 -0
- data/path/specifications/rspec-expectations-3.3.1.gemspec +50 -0
- data/path/specifications/rspec-mocks-3.3.2.gemspec +53 -0
- data/path/specifications/rspec-support-3.3.0.gemspec +38 -0
- data/sublimetheme.gemspec +32 -0
- metadata +363 -0
@@ -0,0 +1,115 @@
|
|
1
|
+
RSpec::Support.require_rspec_core "formatters/base_text_formatter"
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Core
|
5
|
+
module Formatters
|
6
|
+
# @private
|
7
|
+
# Produces progress output while bisecting.
|
8
|
+
class BisectProgressFormatter < BaseTextFormatter
|
9
|
+
# We've named all events with a `bisect_` prefix to prevent naming collisions.
|
10
|
+
Formatters.register self, :bisect_starting, :bisect_original_run_complete,
|
11
|
+
:bisect_round_started, :bisect_individual_run_complete,
|
12
|
+
:bisect_round_finished, :bisect_complete, :bisect_repro_command,
|
13
|
+
:bisect_failed, :bisect_aborted
|
14
|
+
|
15
|
+
def bisect_starting(notification)
|
16
|
+
options = notification.original_cli_args.join(' ')
|
17
|
+
output.puts "Bisect started using options: #{options.inspect}"
|
18
|
+
output.print "Running suite to find failures..."
|
19
|
+
end
|
20
|
+
|
21
|
+
def bisect_original_run_complete(notification)
|
22
|
+
failures = Helpers.pluralize(notification.failed_example_ids.size, "failing example")
|
23
|
+
non_failures = Helpers.pluralize(notification.non_failing_example_ids.size, "non-failing example")
|
24
|
+
|
25
|
+
output.puts " (#{Helpers.format_duration(notification.duration)})"
|
26
|
+
output.puts "Starting bisect with #{failures} and #{non_failures}."
|
27
|
+
end
|
28
|
+
|
29
|
+
def bisect_round_started(notification, include_trailing_space=true)
|
30
|
+
search_desc = Helpers.pluralize(
|
31
|
+
notification.subset_size, "non-failing example"
|
32
|
+
)
|
33
|
+
|
34
|
+
output.print "\nRound #{notification.round}: searching for #{search_desc}" \
|
35
|
+
" (of #{notification.remaining_count}) to ignore:"
|
36
|
+
output.print " " if include_trailing_space
|
37
|
+
end
|
38
|
+
|
39
|
+
def bisect_round_finished(notification)
|
40
|
+
output.print " (#{Helpers.format_duration(notification.duration)})"
|
41
|
+
end
|
42
|
+
|
43
|
+
def bisect_individual_run_complete(_)
|
44
|
+
output.print '.'
|
45
|
+
end
|
46
|
+
|
47
|
+
def bisect_complete(notification)
|
48
|
+
output.puts "\nBisect complete! Reduced necessary non-failing examples " \
|
49
|
+
"from #{notification.original_non_failing_count} to " \
|
50
|
+
"#{notification.remaining_count} in " \
|
51
|
+
"#{Helpers.format_duration(notification.duration)}."
|
52
|
+
end
|
53
|
+
|
54
|
+
def bisect_repro_command(notification)
|
55
|
+
output.puts "\nThe minimal reproduction command is:\n #{notification.repro}"
|
56
|
+
end
|
57
|
+
|
58
|
+
def bisect_failed(notification)
|
59
|
+
output.puts "\nBisect failed! #{notification.failure_explanation}"
|
60
|
+
end
|
61
|
+
|
62
|
+
def bisect_aborted(notification)
|
63
|
+
output.puts "\n\nBisect aborted!"
|
64
|
+
output.puts "\nThe most minimal reproduction command discovered so far is:\n #{notification.repro}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# @private
|
69
|
+
# Produces detailed debug output while bisecting. Used when
|
70
|
+
# bisect is performed while the `DEBUG_RSPEC_BISECT` ENV var is used.
|
71
|
+
# Designed to provide details for us when we need to troubleshoot bisect bugs.
|
72
|
+
class BisectDebugFormatter < BisectProgressFormatter
|
73
|
+
Formatters.register self, :bisect_original_run_complete, :bisect_individual_run_start,
|
74
|
+
:bisect_individual_run_complete, :bisect_round_finished, :bisect_ignoring_ids
|
75
|
+
|
76
|
+
def bisect_original_run_complete(notification)
|
77
|
+
output.puts " (#{Helpers.format_duration(notification.duration)})"
|
78
|
+
|
79
|
+
output.puts " - #{describe_ids 'Failing examples', notification.failed_example_ids}"
|
80
|
+
output.puts " - #{describe_ids 'Non-failing examples', notification.non_failing_example_ids}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def bisect_individual_run_start(notification)
|
84
|
+
output.print "\n - Running: #{notification.command}"
|
85
|
+
end
|
86
|
+
|
87
|
+
def bisect_individual_run_complete(notification)
|
88
|
+
output.print " (#{Helpers.format_duration(notification.duration)})"
|
89
|
+
end
|
90
|
+
|
91
|
+
def bisect_round_started(notification)
|
92
|
+
super(notification, false)
|
93
|
+
end
|
94
|
+
|
95
|
+
def bisect_round_finished(notification)
|
96
|
+
output.print "\n - Round finished"
|
97
|
+
super
|
98
|
+
end
|
99
|
+
|
100
|
+
def bisect_ignoring_ids(notification)
|
101
|
+
output.print "\n - #{describe_ids 'Examples we can safely ignore', notification.ids_to_ignore}"
|
102
|
+
output.print "\n - #{describe_ids 'Remaining non-failing examples', notification.remaining_ids}"
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def describe_ids(description, ids)
|
108
|
+
organized_ids = Formatters::Helpers.organize_ids(ids)
|
109
|
+
formatted_ids = organized_ids.map { |id| " - #{id}" }.join("\n")
|
110
|
+
"#{description} (#{ids.size}):\n#{formatted_ids}"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Core
|
3
|
+
module Formatters
|
4
|
+
# ConsoleCodes provides helpers for formatting console output
|
5
|
+
# with ANSI codes, e.g. color's and bold.
|
6
|
+
module ConsoleCodes
|
7
|
+
# @private
|
8
|
+
VT100_CODES =
|
9
|
+
{
|
10
|
+
:black => 30,
|
11
|
+
:red => 31,
|
12
|
+
:green => 32,
|
13
|
+
:yellow => 33,
|
14
|
+
:blue => 34,
|
15
|
+
:magenta => 35,
|
16
|
+
:cyan => 36,
|
17
|
+
:white => 37,
|
18
|
+
:bold => 1,
|
19
|
+
}
|
20
|
+
# @private
|
21
|
+
VT100_CODE_VALUES = VT100_CODES.invert
|
22
|
+
|
23
|
+
module_function
|
24
|
+
|
25
|
+
# @private
|
26
|
+
CONFIG_COLORS_TO_METHODS = Configuration.instance_methods.grep(/_color\z/).inject({}) do |hash, method|
|
27
|
+
hash[method.to_s.sub(/_color\z/, '').to_sym] = method
|
28
|
+
hash
|
29
|
+
end
|
30
|
+
|
31
|
+
# Fetches the correct code for the supplied symbol, or checks
|
32
|
+
# that a code is valid. Defaults to white (37).
|
33
|
+
#
|
34
|
+
# @param code_or_symbol [Symbol, Fixnum] Symbol or code to check
|
35
|
+
# @return [Fixnum] a console code
|
36
|
+
def console_code_for(code_or_symbol)
|
37
|
+
if (config_method = CONFIG_COLORS_TO_METHODS[code_or_symbol])
|
38
|
+
console_code_for RSpec.configuration.__send__(config_method)
|
39
|
+
elsif VT100_CODE_VALUES.key?(code_or_symbol)
|
40
|
+
code_or_symbol
|
41
|
+
else
|
42
|
+
VT100_CODES.fetch(code_or_symbol) do
|
43
|
+
console_code_for(:white)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Wraps a piece of text in ANSI codes with the supplied code. Will
|
49
|
+
# only apply the control code if `RSpec.configuration.color_enabled?`
|
50
|
+
# returns true.
|
51
|
+
#
|
52
|
+
# @param text [String] the text to wrap
|
53
|
+
# @param code_or_symbol [Symbol, Fixnum] the desired control code
|
54
|
+
# @return [String] the wrapped text
|
55
|
+
def wrap(text, code_or_symbol)
|
56
|
+
if RSpec.configuration.color_enabled?
|
57
|
+
"\e[#{console_code_for(code_or_symbol)}m#{text}\e[0m"
|
58
|
+
else
|
59
|
+
text
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,223 @@
|
|
1
|
+
RSpec::Support.require_rspec_core "formatters/helpers"
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Core
|
5
|
+
module Formatters
|
6
|
+
# @private
|
7
|
+
class DeprecationFormatter
|
8
|
+
Formatters.register self, :deprecation, :deprecation_summary
|
9
|
+
|
10
|
+
attr_reader :count, :deprecation_stream, :summary_stream
|
11
|
+
|
12
|
+
def initialize(deprecation_stream, summary_stream)
|
13
|
+
@deprecation_stream = deprecation_stream
|
14
|
+
@summary_stream = summary_stream
|
15
|
+
@seen_deprecations = Set.new
|
16
|
+
@count = 0
|
17
|
+
end
|
18
|
+
alias :output :deprecation_stream
|
19
|
+
|
20
|
+
def printer
|
21
|
+
@printer ||= case deprecation_stream
|
22
|
+
when File
|
23
|
+
ImmediatePrinter.new(FileStream.new(deprecation_stream),
|
24
|
+
summary_stream, self)
|
25
|
+
when RaiseErrorStream
|
26
|
+
ImmediatePrinter.new(deprecation_stream, summary_stream, self)
|
27
|
+
else
|
28
|
+
DelayedPrinter.new(deprecation_stream, summary_stream, self)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def deprecation(notification)
|
33
|
+
return if @seen_deprecations.include? notification
|
34
|
+
|
35
|
+
@count += 1
|
36
|
+
printer.print_deprecation_message notification
|
37
|
+
@seen_deprecations << notification
|
38
|
+
end
|
39
|
+
|
40
|
+
def deprecation_summary(_notification)
|
41
|
+
printer.deprecation_summary
|
42
|
+
end
|
43
|
+
|
44
|
+
def deprecation_message_for(data)
|
45
|
+
if data.message
|
46
|
+
SpecifiedDeprecationMessage.new(data)
|
47
|
+
else
|
48
|
+
GeneratedDeprecationMessage.new(data)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
RAISE_ERROR_CONFIG_NOTICE = <<-EOS.gsub(/^\s+\|/, '')
|
53
|
+
|
|
54
|
+
|If you need more of the backtrace for any of these deprecations to
|
55
|
+
|identify where to make the necessary changes, you can configure
|
56
|
+
|`config.raise_errors_for_deprecations!`, and it will turn the
|
57
|
+
|deprecation warnings into errors, giving you the full backtrace.
|
58
|
+
EOS
|
59
|
+
|
60
|
+
DEPRECATION_STREAM_NOTICE = "Pass `--deprecation-out` or set " \
|
61
|
+
"`config.deprecation_stream` to a file for full output."
|
62
|
+
|
63
|
+
SpecifiedDeprecationMessage = Struct.new(:type) do
|
64
|
+
def initialize(data)
|
65
|
+
@message = data.message
|
66
|
+
super deprecation_type_for(data)
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_s
|
70
|
+
output_formatted @message
|
71
|
+
end
|
72
|
+
|
73
|
+
def too_many_warnings_message
|
74
|
+
msg = "Too many similar deprecation messages reported, disregarding further reports. "
|
75
|
+
msg << DEPRECATION_STREAM_NOTICE
|
76
|
+
msg
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def output_formatted(str)
|
82
|
+
return str unless str.lines.count > 1
|
83
|
+
separator = "#{'-' * 80}"
|
84
|
+
"#{separator}\n#{str.chomp}\n#{separator}"
|
85
|
+
end
|
86
|
+
|
87
|
+
def deprecation_type_for(data)
|
88
|
+
data.message.gsub(/(\w+\/)+\w+\.rb:\d+/, '')
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
GeneratedDeprecationMessage = Struct.new(:type) do
|
93
|
+
def initialize(data)
|
94
|
+
@data = data
|
95
|
+
super data.deprecated
|
96
|
+
end
|
97
|
+
|
98
|
+
def to_s
|
99
|
+
msg = "#{@data.deprecated} is deprecated."
|
100
|
+
msg << " Use #{@data.replacement} instead." if @data.replacement
|
101
|
+
msg << " Called from #{@data.call_site}." if @data.call_site
|
102
|
+
msg
|
103
|
+
end
|
104
|
+
|
105
|
+
def too_many_warnings_message
|
106
|
+
msg = "Too many uses of deprecated '#{type}'. "
|
107
|
+
msg << DEPRECATION_STREAM_NOTICE
|
108
|
+
msg
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# @private
|
113
|
+
class ImmediatePrinter
|
114
|
+
attr_reader :deprecation_stream, :summary_stream, :deprecation_formatter
|
115
|
+
|
116
|
+
def initialize(deprecation_stream, summary_stream, deprecation_formatter)
|
117
|
+
@deprecation_stream = deprecation_stream
|
118
|
+
|
119
|
+
@summary_stream = summary_stream
|
120
|
+
@deprecation_formatter = deprecation_formatter
|
121
|
+
end
|
122
|
+
|
123
|
+
def print_deprecation_message(data)
|
124
|
+
deprecation_message = deprecation_formatter.deprecation_message_for(data)
|
125
|
+
deprecation_stream.puts deprecation_message.to_s
|
126
|
+
end
|
127
|
+
|
128
|
+
def deprecation_summary
|
129
|
+
return if deprecation_formatter.count.zero?
|
130
|
+
deprecation_stream.summarize(summary_stream, deprecation_formatter.count)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# @private
|
135
|
+
class DelayedPrinter
|
136
|
+
TOO_MANY_USES_LIMIT = 4
|
137
|
+
|
138
|
+
attr_reader :deprecation_stream, :summary_stream, :deprecation_formatter
|
139
|
+
|
140
|
+
def initialize(deprecation_stream, summary_stream, deprecation_formatter)
|
141
|
+
@deprecation_stream = deprecation_stream
|
142
|
+
@summary_stream = summary_stream
|
143
|
+
@deprecation_formatter = deprecation_formatter
|
144
|
+
@seen_deprecations = Hash.new { 0 }
|
145
|
+
@deprecation_messages = Hash.new { |h, k| h[k] = [] }
|
146
|
+
end
|
147
|
+
|
148
|
+
def print_deprecation_message(data)
|
149
|
+
deprecation_message = deprecation_formatter.deprecation_message_for(data)
|
150
|
+
@seen_deprecations[deprecation_message] += 1
|
151
|
+
|
152
|
+
stash_deprecation_message(deprecation_message)
|
153
|
+
end
|
154
|
+
|
155
|
+
def stash_deprecation_message(deprecation_message)
|
156
|
+
if @seen_deprecations[deprecation_message] < TOO_MANY_USES_LIMIT
|
157
|
+
@deprecation_messages[deprecation_message] << deprecation_message.to_s
|
158
|
+
elsif @seen_deprecations[deprecation_message] == TOO_MANY_USES_LIMIT
|
159
|
+
@deprecation_messages[deprecation_message] << deprecation_message.too_many_warnings_message
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def deprecation_summary
|
164
|
+
return unless @deprecation_messages.any?
|
165
|
+
|
166
|
+
print_deferred_deprecation_warnings
|
167
|
+
deprecation_stream.puts RAISE_ERROR_CONFIG_NOTICE
|
168
|
+
|
169
|
+
summary_stream.puts "\n#{Helpers.pluralize(deprecation_formatter.count, 'deprecation warning')} total"
|
170
|
+
end
|
171
|
+
|
172
|
+
def print_deferred_deprecation_warnings
|
173
|
+
deprecation_stream.puts "\nDeprecation Warnings:\n\n"
|
174
|
+
@deprecation_messages.keys.sort_by(&:type).each do |deprecation|
|
175
|
+
messages = @deprecation_messages[deprecation]
|
176
|
+
messages.each { |msg| deprecation_stream.puts msg }
|
177
|
+
deprecation_stream.puts
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
# @private
|
183
|
+
# Not really a stream, but is usable in place of one.
|
184
|
+
class RaiseErrorStream
|
185
|
+
def puts(message)
|
186
|
+
raise DeprecationError, message
|
187
|
+
end
|
188
|
+
|
189
|
+
def summarize(summary_stream, deprecation_count)
|
190
|
+
summary_stream.puts "\n#{Helpers.pluralize(deprecation_count, 'deprecation')} found."
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# @private
|
195
|
+
# Wraps a File object and provides file-specific operations.
|
196
|
+
class FileStream
|
197
|
+
def initialize(file)
|
198
|
+
@file = file
|
199
|
+
|
200
|
+
# In one of my test suites, I got lots of duplicate output in the
|
201
|
+
# deprecation file (e.g. 200 of the same deprecation, even though
|
202
|
+
# the `puts` below was only called 6 times). Setting `sync = true`
|
203
|
+
# fixes this (but we really have no idea why!).
|
204
|
+
@file.sync = true
|
205
|
+
end
|
206
|
+
|
207
|
+
def puts(*args)
|
208
|
+
@file.puts(*args)
|
209
|
+
end
|
210
|
+
|
211
|
+
def summarize(summary_stream, deprecation_count)
|
212
|
+
path = @file.respond_to?(:path) ? @file.path : @file.inspect
|
213
|
+
summary_stream.puts "\n#{Helpers.pluralize(deprecation_count, 'deprecation')} logged to #{path}"
|
214
|
+
puts RAISE_ERROR_CONFIG_NOTICE
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
# Deprecation Error.
|
221
|
+
DeprecationError = Class.new(StandardError)
|
222
|
+
end
|
223
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
RSpec::Support.require_rspec_core "formatters/base_text_formatter"
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Core
|
5
|
+
module Formatters
|
6
|
+
# @private
|
7
|
+
class DocumentationFormatter < BaseTextFormatter
|
8
|
+
Formatters.register self, :example_group_started, :example_group_finished,
|
9
|
+
:example_passed, :example_pending, :example_failed
|
10
|
+
|
11
|
+
def initialize(output)
|
12
|
+
super
|
13
|
+
@group_level = 0
|
14
|
+
end
|
15
|
+
|
16
|
+
def example_group_started(notification)
|
17
|
+
output.puts if @group_level == 0
|
18
|
+
output.puts "#{current_indentation}#{notification.group.description.strip}"
|
19
|
+
|
20
|
+
@group_level += 1
|
21
|
+
end
|
22
|
+
|
23
|
+
def example_group_finished(_notification)
|
24
|
+
@group_level -= 1
|
25
|
+
end
|
26
|
+
|
27
|
+
def example_passed(passed)
|
28
|
+
output.puts passed_output(passed.example)
|
29
|
+
end
|
30
|
+
|
31
|
+
def example_pending(pending)
|
32
|
+
output.puts pending_output(pending.example,
|
33
|
+
pending.example.execution_result.pending_message)
|
34
|
+
end
|
35
|
+
|
36
|
+
def example_failed(failure)
|
37
|
+
output.puts failure_output(failure.example,
|
38
|
+
failure.example.execution_result.exception)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def passed_output(example)
|
44
|
+
ConsoleCodes.wrap("#{current_indentation}#{example.description.strip}", :success)
|
45
|
+
end
|
46
|
+
|
47
|
+
def pending_output(example, message)
|
48
|
+
ConsoleCodes.wrap("#{current_indentation}#{example.description.strip} " \
|
49
|
+
"(PENDING: #{message})",
|
50
|
+
:pending)
|
51
|
+
end
|
52
|
+
|
53
|
+
def failure_output(example, _exception)
|
54
|
+
ConsoleCodes.wrap("#{current_indentation}#{example.description.strip} " \
|
55
|
+
"(FAILED - #{next_failure_index})",
|
56
|
+
:failure)
|
57
|
+
end
|
58
|
+
|
59
|
+
def next_failure_index
|
60
|
+
@next_failure_index ||= 0
|
61
|
+
@next_failure_index += 1
|
62
|
+
end
|
63
|
+
|
64
|
+
def current_indentation
|
65
|
+
' ' * @group_level
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|