seeing_is_believing 3.2.0 → 3.3.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: fd4c625530426d55efef82e47755e16b6178a677
4
- data.tar.gz: 72bd371886e9f902eaf9cb4989c9ff3dc322ede6
3
+ metadata.gz: 0c1356fef9747e418a57e2f151e4bc2f7625d6d8
4
+ data.tar.gz: 27c33822870a7f0bf0f25172ed626d581b1b4906
5
5
  SHA512:
6
- metadata.gz: 94ff5a19f0e9292bc25400263d1772aaef661768fc0a922e0f7b9b65577d8bb6227a03b90a35e6cfa1ebe315292969bf7aaf2cc19084e9dee0cc4c2a07de8c18
7
- data.tar.gz: 975e4ef13344fb4f96eacccddb6f2f862304c73a77552cb5c54b6788ea7326ce55dd5525fd6ec5c61c29e85a963ed8aee147efdff9ebc596bc4adb8682da8b10
6
+ metadata.gz: b4ba3ac50ac5ac732c097e7dcffebdcd58c7345f8f40df8b1086b33c9d9ef69b5e030ebf139401edc57e89622475eeab1c0cf2a92b966bd0671c9bad6181e144
7
+ data.tar.gz: 8bc5907b40214aa58377aec602033e08e47837239bed71d028e3833c4d9a75f28b59e88c55ec04f6c751e4a577695fb9175407b22340bfa3e41fcf7a5d8eb282
@@ -7,4 +7,4 @@ rvm:
7
7
  - 2.1.2
8
8
  - 2.2.0
9
9
  - 2.3.1
10
- - 2.4.0
10
+ - 2.4.1
data/Rakefile CHANGED
@@ -51,11 +51,13 @@ desc 'Run cukes'
51
51
  task cuke: :bundle do
52
52
  require 'bundler'
53
53
  platform_filter = Gem.win_platform? ? %W[--tags ~@not-windows] : []
54
+ ruby_version_without_patchlevel = RUBY_VERSION[/^\d+\.\d+/]
54
55
  sh 'ruby', '--disable-gem',
55
56
  *require_paths,
56
57
  '-S', 'bundle/bin/cucumber',
57
58
  '--tags', '~@not-implemented',
58
59
  '--tags', "~@not-#{RUBY_VERSION}",
60
+ '--tags', "~@not-#{ruby_version_without_patchlevel}",
59
61
  *platform_filter
60
62
  end
61
63
 
data/Readme.md CHANGED
@@ -1,4 +1,5 @@
1
- Unix/Mac: [![Unix Build Status](https://secure.travis-ci.org/JoshCheek/seeing_is_believing.png?branch=master)](http://travis-ci.org/JoshCheek/seeing_is_believing)    Windows: [![Windows Build Status](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true)](https://ci.appveyor.com/project/JoshCheek/seeing-is-believing)
1
+ Unix/Mac: [![Unix Build Status](https://secure.travis-ci.org/JoshCheek/seeing_is_believing.svg?branch=master)](http://travis-ci.org/JoshCheek/seeing_is_believing)   
2
+ Windows: [![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/JoshCheek/seeing_is_believing?branch=master&svg=true)](https://ci.appveyor.com/project/JoshCheek/seeing-is-believing)
2
3
 
3
4
  Seeing Is Believing
4
5
  ===================
@@ -28,7 +29,7 @@ Examples
28
29
 
29
30
  * Watch a [longer video](http://vimeo.com/73866851).
30
31
  * Watch John Cinnamond use it in a [presentation](http://brightonruby.com/2016/the-point-of-objects-john-cinnamond/)
31
- at the 10 minute mark.
32
+ at the 10:22 minute mark.
32
33
  * [Avdi](https://github.com/avdi) uses it in [Ruby Tapas](https://www.rubytapas.com/),
33
34
  an amazing resource for developers in general and Ruby Developers in particular!
34
35
 
@@ -470,7 +470,7 @@ Feature:
470
470
  #
471
471
  # Not going to get too detailed on what it prints, b/c that message seems pretty fragile,
472
472
  # but just generally that it doesn't fkn blow up
473
- @not-2.4.0
473
+ @not-2.4
474
474
  Scenario: Old JSON bug
475
475
  Given the file "json_and_encodings.rb":
476
476
  """
@@ -52,8 +52,17 @@ class SeeingIsBelieving
52
52
  end
53
53
 
54
54
  def remove_lines_whose_newline_is_escaped(line_num_to_location)
55
- line_num_to_location.select { |line_number, (index_of_newline, col)| code[index_of_newline-1] == '\\' }
56
- .each { |line_number, (index_of_newline, col)| line_num_to_location.delete line_number }
55
+ ors_indexes = code_obj.indexes_of_ors_at_eol
56
+ line_num_to_location
57
+ .select { |line_number, (index_of_newline, col)|
58
+ code[index_of_newline-1] == '\\'
59
+ }
60
+ .reject { |line_number, (index_of_newline, col)|
61
+ ors_indexes.include? index_of_newline
62
+ }
63
+ .each { |line_number, (index_of_newline, col)|
64
+ line_num_to_location.delete line_number
65
+ }
57
66
  end
58
67
 
59
68
  def remove_lines_ending_in_comments(line_num_to_location, comments)
@@ -7,6 +7,7 @@ class << (Parser ||= Module.new)
7
7
  remove_method :warn
8
8
  end
9
9
 
10
+ require 'set'
10
11
  require 'seeing_is_believing/hash_struct'
11
12
 
12
13
  class SeeingIsBelieving
@@ -87,6 +88,14 @@ class SeeingIsBelieving
87
88
  ].freeze
88
89
  end
89
90
 
91
+ def indexes_of_ors_at_eol
92
+ Set.new(
93
+ @tokens.select { |type, *| type == :tGVAR }
94
+ .select { |_, (var, range)| var == '$\\'.freeze }
95
+ .map { |_, (var, range)| range.end_pos }
96
+ )
97
+ end
98
+
90
99
  private
91
100
 
92
101
  def comments_and_tokens(builder, buffer)
@@ -60,7 +60,11 @@ class SeeingIsBelieving
60
60
  # otherwise it looks like the bug is in SiB and not the user's program, see https://github.com/JoshCheek/seeing_is_believing/issues/37
61
61
  raise SystemStackError, "Calling inspect blew the stack (is it recursive w/o a base case?)"
62
62
  rescue Exception
63
- inspected = "#<no inspect available>"
63
+ begin
64
+ inspected = Kernel.instance_method(:inspect).bind(value).call
65
+ rescue Exception
66
+ inspected = "#<no inspect available>"
67
+ end
64
68
  end
65
69
  queue << "result #{line_number.to_s} #{type.to_s} #{to_string_token inspected}"
66
70
  elsif count == max_line_captures
@@ -5,6 +5,15 @@ class SeeingIsBelieving
5
5
  alias === ===
6
6
  end
7
7
 
8
+ begin
9
+ refine Kernel do
10
+ alias inspect inspect
11
+ end
12
+ rescue TypeError
13
+ # Ruby < 2.4 can't refine a module,
14
+ # so this optimization is only available on >= 2.4
15
+ end
16
+
8
17
  refine Queue do
9
18
  alias << <<
10
19
  alias shift shift
@@ -1,3 +1,3 @@
1
1
  class SeeingIsBelieving
2
- VERSION = '3.2.0'
2
+ VERSION = '3.3.0'
3
3
  end
@@ -19,13 +19,14 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_dependency "parser", ">= 2.3.0.7", "< 3.0"
23
- s.add_dependency "childprocess","~> 0.5.9"
22
+ s.add_dependency "parser", "~> 2.4.0"
23
+ s.add_dependency "childprocess","~> 0.7.1"
24
24
 
25
+ s.add_development_dependency "pry"
25
26
  s.add_development_dependency "haiti", ">= 0.1", "< 0.3"
26
- s.add_development_dependency "rake", "~> 11.2.2"
27
+ s.add_development_dependency "rake", "~> 12.0.0"
27
28
  s.add_development_dependency "mrspec", "~> 0.3.1"
28
- s.add_development_dependency "rspec", "~> 3.5"
29
+ s.add_development_dependency "rspec", "~> 3.6.0"
29
30
  s.add_development_dependency "cucumber", "~> 2.4"
30
31
  s.add_development_dependency "ripper-tags", "~> 0.3"
31
32
 
@@ -17,6 +17,13 @@ RSpec.describe SeeingIsBelieving::Binary::CommentLines, 'passes in the each comm
17
17
  expect(call("1 +\\\n2") { |_, line_number| "--#{line_number}--" }).to eq "1 +\\\n2--2--"
18
18
  end
19
19
 
20
+ it "doesn\'t confuse OUTPUT_RECORD_SEPARATOR with an escaped line" do
21
+ expect(call("$\\") { ';' }).to eq "$\\;"
22
+ expect(call("$\\\\\n1") { ';' }).to eq "$\\\\\n1;"
23
+ expect(call("1\n$\\") { ';' }).to eq "1;\n$\\;"
24
+ expect(call("1\n$var\\\n2") { ';' }).to eq "1;\n$var\\\n2;"
25
+ end
26
+
20
27
  it "doesn't comment lines inside of strings" do
21
28
  expect(call(<<-INPUT) { |_, line_number| "--#{line_number}--" }).to eq <<-OUTPUT
22
29
  "a\#{1+1
@@ -23,6 +23,11 @@ module SeeingIsBelieving::EventStream
23
23
  consumer.join
24
24
  end
25
25
 
26
+ def inspected(obj)
27
+ Kernel.instance_method(:inspect).bind(obj).call
28
+ end
29
+
30
+
26
31
  before do
27
32
  self.eventstream_consumer, self.eventstream_producer = IO.pipe("utf-8")
28
33
  self.stdout_consumer, self.stdout_producer = IO.pipe("utf-8")
@@ -272,20 +277,23 @@ module SeeingIsBelieving::EventStream
272
277
  end
273
278
 
274
279
  context 'calls #inspect when no block is given' do
275
- it "doesn't blow up when there is no #inspect available e.g. BasicObject" do
280
+ it 'uses Kernel\'s inspect if there is no #inspect available e.g. BasicObject' do
276
281
  obj = BasicObject.new
277
282
  producer.record_result :type, 1, obj
278
- expect(consumer.call).to eq Events::LineResult.new(type: :type, line_number: 1, inspected: "#<no inspect available>")
283
+ expect(consumer.call).to eq Events::LineResult.new(type: :type, line_number: 1, inspected: inspected(obj))
279
284
  end
280
285
 
281
-
282
- it "doesn't blow up when #inspect returns a not-String (e.g. pathalogical libraries like FactoryGirl)" do
286
+ it "uses Kernel's #inspect when the object\'s #inspect returns a not-String (e.g. pathalogical libraries like FactoryGirl)" do
283
287
  obj = BasicObject.new
284
288
  def obj.inspect
285
289
  nil
286
290
  end
287
291
  producer.record_result :type, 1, obj
288
- expect(consumer.call).to eq Events::LineResult.new(type: :type, line_number: 1, inspected: "#<no inspect available>")
292
+ expect(consumer.call).to eq Events::LineResult.new(type: :type, line_number: 1, inspected: inspected(obj))
293
+ end
294
+
295
+ it "uses a null-inspect string when even Kernel's inspect doesn't work" do
296
+ skip 'uhm, no idea how to get it into such a state'
289
297
  end
290
298
 
291
299
  it 'only calls inspect once' do
@@ -311,13 +319,13 @@ module SeeingIsBelieving::EventStream
311
319
  it 'doesn\'t blow up if the block raises' do
312
320
  o = Object.new
313
321
  producer.record_result(:type, 1, o) { raise Exception, "zomg" }
314
- expect(consumer.call).to eq Events::LineResult.new(type: :type, line_number: 1, inspected: '#<no inspect available>')
322
+ expect(consumer.call).to eq Events::LineResult.new(type: :type, line_number: 1, inspected: inspected(o))
315
323
  end
316
324
 
317
325
  it 'doesn\'t blow up if the block returns a non-string' do
318
326
  o = Object.new
319
327
  producer.record_result(:type, 1, o) { nil }
320
- expect(consumer.call).to eq Events::LineResult.new(type: :type, line_number: 1, inspected: '#<no inspect available>')
328
+ expect(consumer.call).to eq Events::LineResult.new(type: :type, line_number: 1, inspected: inspected(o))
321
329
 
322
330
  stringish = Object.new
323
331
  def stringish.to_str() 'actual string' end
@@ -844,11 +844,12 @@ RSpec.describe SeeingIsBelieving do
844
844
  end
845
845
 
846
846
  # defined? is a macro, not a method, otherwise I'd test that here
847
- specify 'when Kernel does not have kind_of?' do
847
+ specify 'when Kernel does not have kind_of?, inspect' do
848
848
  expect(invoke('module Kernel
849
849
  undef kind_of?
850
+ undef inspect
850
851
  end
851
- 1').to_a).to eq [[], [], ['nil'], ['1']]
852
+ 1').to_a).to eq [[], [], [], ['nil'], ['1']]
852
853
  end
853
854
 
854
855
  specify 'when Enumerable does not have map' do
@@ -425,6 +425,12 @@ RSpec.describe SeeingIsBelieving::WrapExpressions do
425
425
  expect(wrap("a[1\n]=2")).to eq "<a[<1>\n]=2>"
426
426
  expect(wrap("a[1,\n2\n]=3")).to eq "<a[<1>,\n<2>\n]=3>"
427
427
  end
428
+
429
+ it 'wraps 2.4 style multiple assignment' do
430
+ next if ruby_version < '2.4'
431
+ expect(wrap("if (a,b=1,2)\nend")).to eq "<if <(a,b=1,2)>\nend>"
432
+ expect(wrap("if (a,b=1)\nend")).to eq "<if <(a,b=1)>\nend>"
433
+ end
428
434
  end
429
435
 
430
436
  describe 'conditionals' do
@@ -924,6 +930,36 @@ RSpec.describe SeeingIsBelieving::WrapExpressions do
924
930
  end
925
931
  end
926
932
 
933
+ describe 'Perl style globals' do
934
+ # from English.rb
935
+ specify('$ERROR_INFO $!') { expect(wrap('$!')).to eq '<$!>' }
936
+ specify('$ERROR_POSITION $@') { expect(wrap('$@')).to eq '<$@>' }
937
+ specify('$FS $;') { expect(wrap('$;')).to eq '<$;>' }
938
+ specify('$FIELD_SEPARATOR $;') { expect(wrap('$;')).to eq '<$;>' }
939
+ specify('$OFS $,') { expect(wrap('$,')).to eq '<$,>' }
940
+ specify('$OUTPUT_FIELD_SEPARATOR $,') { expect(wrap('$,')).to eq '<$,>' }
941
+ specify('$RS $/') { expect(wrap('$/')).to eq '<$/>' }
942
+ specify('$INPUT_RECORD_SEPARATOR $/') { expect(wrap('$/')).to eq '<$/>' }
943
+ specify('$ORS $\\') { expect(wrap('$\\')).to eq '<$\\>' }
944
+ specify('$OUTPUT_RECORD_SEPARATOR $\\') { expect(wrap('$\\')).to eq '<$\\>' }
945
+ specify('$INPUT_LINE_NUMBER $.') { expect(wrap('$.')).to eq '<$.>' }
946
+ specify('$NR $.') { expect(wrap('$.')).to eq '<$.>' }
947
+ specify('$LAST_READ_LINE $_') { expect(wrap('$_')).to eq '<$_>' }
948
+ specify('$DEFAULT_OUTPUT $>') { expect(wrap('$>')).to eq '<$>>' }
949
+ specify('$DEFAULT_INPUT $<') { expect(wrap('$<')).to eq '<$<>' }
950
+ specify('$PID $$') { expect(wrap('$$')).to eq '<$$>' }
951
+ specify('$PROCESS_ID $$') { expect(wrap('$$')).to eq '<$$>' }
952
+ specify('$CHILD_STATUS $?') { expect(wrap('$?')).to eq '<$?>' }
953
+ specify('$LAST_MATCH_INFO $~') { expect(wrap('$~')).to eq '<$~>' }
954
+ specify('$IGNORECASE $=') { expect(wrap('$=')).to eq '<$=>' }
955
+ specify('$ARGV $*') { expect(wrap('$*')).to eq '<$*>' }
956
+ specify('$MATCH $&') { expect(wrap('$&')).to eq '<$&>' }
957
+ specify('$PREMATCH $`') { expect(wrap('$`')).to eq '<$`>' }
958
+ specify('$POSTMATCH $\'') { expect(wrap("$'")).to eq "<$'>" }
959
+ specify('$LAST_PAREN_MATCH $+') { expect(wrap('$+')).to eq '<$+>' }
960
+ end
961
+
962
+
927
963
  # only checking on 2.2 b/c its hard to figure out when different pieces were introduced
928
964
  # we'll assume that if it passes on 2.2, it will pass on 2.0 or 2.1, if the feature is available on that Ruby
929
965
  major, minor, * = RUBY_VERSION.split(".").map(&:to_i)
metadata CHANGED
@@ -1,49 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seeing_is_believing
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Cheek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-11 00:00:00.000000000 Z
11
+ date: 2017-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 2.3.0.7
20
- - - "<"
17
+ - - "~>"
21
18
  - !ruby/object:Gem::Version
22
- version: '3.0'
19
+ version: 2.4.0
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 2.3.0.7
30
- - - "<"
24
+ - - "~>"
31
25
  - !ruby/object:Gem::Version
32
- version: '3.0'
26
+ version: 2.4.0
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: childprocess
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
31
  - - "~>"
38
32
  - !ruby/object:Gem::Version
39
- version: 0.5.9
33
+ version: 0.7.1
40
34
  type: :runtime
41
35
  prerelease: false
42
36
  version_requirements: !ruby/object:Gem::Requirement
43
37
  requirements:
44
38
  - - "~>"
45
39
  - !ruby/object:Gem::Version
46
- version: 0.5.9
40
+ version: 0.7.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: haiti
49
57
  requirement: !ruby/object:Gem::Requirement
@@ -70,14 +78,14 @@ dependencies:
70
78
  requirements:
71
79
  - - "~>"
72
80
  - !ruby/object:Gem::Version
73
- version: 11.2.2
81
+ version: 12.0.0
74
82
  type: :development
75
83
  prerelease: false
76
84
  version_requirements: !ruby/object:Gem::Requirement
77
85
  requirements:
78
86
  - - "~>"
79
87
  - !ruby/object:Gem::Version
80
- version: 11.2.2
88
+ version: 12.0.0
81
89
  - !ruby/object:Gem::Dependency
82
90
  name: mrspec
83
91
  requirement: !ruby/object:Gem::Requirement
@@ -98,14 +106,14 @@ dependencies:
98
106
  requirements:
99
107
  - - "~>"
100
108
  - !ruby/object:Gem::Version
101
- version: '3.5'
109
+ version: 3.6.0
102
110
  type: :development
103
111
  prerelease: false
104
112
  version_requirements: !ruby/object:Gem::Requirement
105
113
  requirements:
106
114
  - - "~>"
107
115
  - !ruby/object:Gem::Version
108
- version: '3.5'
116
+ version: 3.6.0
109
117
  - !ruby/object:Gem::Dependency
110
118
  name: cucumber
111
119
  requirement: !ruby/object:Gem::Requirement
@@ -279,7 +287,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
279
287
  version: '0'
280
288
  requirements: []
281
289
  rubyforge_project: seeing_is_believing
282
- rubygems_version: 2.6.8
290
+ rubygems_version: 2.5.2
283
291
  signing_key:
284
292
  specification_version: 4
285
293
  summary: Records results of every line of code in your file