xmp2assert 1

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.
@@ -0,0 +1,56 @@
1
+ #! /your/favourite/path/to/ruby
2
+ # -*- mode: ruby; coding: utf-8; indent-tabs-mode: nil; ruby-indent-level 2 -*-
3
+ # -*- frozen_string_literal: true -*-
4
+ # -*- warn_indent: true -*-
5
+
6
+ # Copyright (c) 2017 Urabe, Shyouhei
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be
16
+ # included in all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ # SOFTWARE.
25
+
26
+ # An XMP comment normally looks like this:
27
+ #
28
+ # ```ruby
29
+ # Object.new # => #<Object:0x007f896c9b49c8>
30
+ # ```
31
+ #
32
+ # Here, the hexadecimal number 0x007f896c9b49c8 is the raw pointer address of
33
+ # this evaluated object. When we check sanity of this XMP, that part would
34
+ # never match because pointer addresses are kind of arbitrary.
35
+ #
36
+ # To reroute the problem, here we convert a XMP comment into a regular
37
+ # expression. The idea behind this is the diff process hook implemented in
38
+ # https://github.com/ruby/chkbuild
39
+ module XMP2Assert::XMP2Rexp
40
+ module_function
41
+
42
+ # Generates a regular expression that roughly matches the input.
43
+ # @param xmp [String] example.
44
+ # @return [Regexp] converted regular expression.
45
+ def xmp2rexp xmp
46
+ # :NOTE: we are editing regular expressions using regular expressions. In
47
+ # order to hack this method you must be a seasoned regular expression
48
+ # craftsperson who can count backslashes at ease.
49
+ src = Regexp.escape xmp
50
+ src.gsub!(/([^\\])(\\n|\\ )+/, '\\1\s+')
51
+ src.gsub!(/(#<[\w:]+?:)0x[0-9a-f]+/, '\\10x[0-9a-f]+')
52
+ src.gsub!(/\\\.rb:\d+/, '\\.rb:\d+')
53
+
54
+ return Regexp.new "\\A#{src}\\z"
55
+ end
56
+ end
data/lib/xmp2assert.rb ADDED
@@ -0,0 +1,41 @@
1
+ #! /your/favourite/path/to/ruby
2
+ # -*- mode: ruby; coding: utf-8; indent-tabs-mode: nil; ruby-indent-level 2 -*-
3
+ # -*- frozen_string_literal: true -*-
4
+ # -*- warn_indent: true -*-
5
+
6
+ # Copyright (c) 2017 Urabe, Shyouhei
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be
16
+ # included in all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ # SOFTWARE.
25
+
26
+ # This is a namespace. Look at each classes under this module:
27
+ #
28
+ # - XMP2Assert::Assertions the assertion framework.
29
+ # - XMP2Assert::Classifier check if the given file actually has the comment.
30
+ # - XMP2Assert::Converter source code in-place editor using Ripper.
31
+ # - XMP2Assert::Quasifile IO/String abstraction layer
32
+ # - XMP2Assert::PrttierInpect helper module to ease inspection.
33
+ module XMP2Assert
34
+ # These files assume the namespace, hence required here inside.
35
+ require_relative 'xmp2assert/version'
36
+ require_relative 'xmp2assert/prettier_inspect'
37
+ require_relative 'xmp2assert/quasifile'
38
+ require_relative 'xmp2assert/converter'
39
+ require_relative 'xmp2assert/classifier'
40
+ require_relative 'xmp2assert/assertions'
41
+ end
@@ -0,0 +1,71 @@
1
+ #! /your/favourite/path/to/gem
2
+ # -*- mode: ruby; coding: utf-8; indent-tabs-mode: nil; ruby-indent-level 2 -*-
3
+ # -*- frozen_string_literal: true -*-
4
+ # -*- warn_indent: true -*-
5
+
6
+ # Copyright (c) 2017 Urabe, Shyouhei
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be
16
+ # included in all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ # SOFTWARE.
25
+
26
+ # :HACK: avoid namespace pollution
27
+ path = File.expand_path 'lib/xmp2assert/version.rb', __dir__
28
+ content = File.read path
29
+ version = Module.new.module_eval <<-'end'
30
+ XMP2Assert = Module.new
31
+ eval content, binding, path
32
+ end
33
+
34
+ Gem::Specification.new do |spec|
35
+ spec.name = 'xmp2assert'
36
+ spec.version = version
37
+ spec.author = 'Urabe, Shyouhei'
38
+ spec.email = 'shyouhei@ruby-lang.org'
39
+ spec.summary = 'auto-generate assertions from `# =>` comments'
40
+ spec.description = <<-'end'.gsub(/\s+/, ' ').strip
41
+ In ruby we use `# =>` as a comment marker that mean the immediately
42
+ adjacent expression's expected value. There are gems like xmpfilter /
43
+ seening_is_believing, which are to generate such comments. They are very
44
+ useful. But so far we lack feature that does vice-versa; to check if the
45
+ comment is actually the output of the expression.
46
+
47
+ This is the library that does it.
48
+ end
49
+ spec.homepage = 'https://github.com/shyouhei/xmp2assert'
50
+ spec.license = 'MIT'
51
+ spec.files = `git ls-files -z`.split("\x0").reject { |f|
52
+ f.match(%r'^(test|spec|features)/')
53
+ }
54
+ spec.bindir = 'exe'
55
+ spec.executables = spec.files.grep(%r'^exe/') { |f| File.basename(f) }
56
+
57
+ spec.add_development_dependency 'bundler'
58
+ spec.add_development_dependency 'github-markup'
59
+ spec.add_development_dependency 'pry'
60
+ spec.add_development_dependency 'rake'
61
+ spec.add_development_dependency 'rcodetools'
62
+ spec.add_development_dependency 'rdoc'
63
+ spec.add_development_dependency 'redcarpet'
64
+ spec.add_development_dependency 'rubocop'
65
+ spec.add_development_dependency 'seeing_is_believing'
66
+ spec.add_development_dependency 'simplecov'
67
+ spec.add_development_dependency 'yard'
68
+ spec.add_runtime_dependency 'ruby-uuid'
69
+ spec.add_runtime_dependency 'test-unit', '>= 3'
70
+ spec.required_ruby_version = '>= 2.2'
71
+ end
metadata ADDED
@@ -0,0 +1,249 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xmp2assert
3
+ version: !ruby/object:Gem::Version
4
+ version: '1'
5
+ platform: ruby
6
+ authors:
7
+ - Urabe, Shyouhei
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-04-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: github-markup
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
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'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rcodetools
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rdoc
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: redcarpet
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: seeing_is_believing
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: yard
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: ruby-uuid
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: test-unit
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '3'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '3'
195
+ description: In ruby we use `# =>` as a comment marker that mean the immediately adjacent
196
+ expression's expected value. There are gems like xmpfilter / seening_is_believing,
197
+ which are to generate such comments. They are very useful. But so far we lack feature
198
+ that does vice-versa; to check if the comment is actually the output of the expression.
199
+ This is the library that does it.
200
+ email: shyouhei@ruby-lang.org
201
+ executables:
202
+ - xmpcheck.rb
203
+ extensions: []
204
+ extra_rdoc_files: []
205
+ files:
206
+ - ".gitignore"
207
+ - ".rubocop.yml"
208
+ - ".yardopts"
209
+ - Gemfile
210
+ - LICENSE.txt
211
+ - README.md
212
+ - Rakefile
213
+ - Stylegiude.md
214
+ - exe/xmpcheck.rb
215
+ - lib/xmp2assert.rb
216
+ - lib/xmp2assert/assertions.rb
217
+ - lib/xmp2assert/classifier.rb
218
+ - lib/xmp2assert/converter.rb
219
+ - lib/xmp2assert/prettier_inspect.rb
220
+ - lib/xmp2assert/quasifile.rb
221
+ - lib/xmp2assert/template.erb
222
+ - lib/xmp2assert/version.rb
223
+ - lib/xmp2assert/xmp2rexp.rb
224
+ - xmp2assert.gemspec
225
+ homepage: https://github.com/shyouhei/xmp2assert
226
+ licenses:
227
+ - MIT
228
+ metadata: {}
229
+ post_install_message:
230
+ rdoc_options: []
231
+ require_paths:
232
+ - lib
233
+ required_ruby_version: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '2.2'
238
+ required_rubygems_version: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
243
+ requirements: []
244
+ rubyforge_project:
245
+ rubygems_version: 2.6.11
246
+ signing_key:
247
+ specification_version: 4
248
+ summary: auto-generate assertions from `# =>` comments
249
+ test_files: []