berns 3.5.0 → 4.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bcded7fea247763fc7b27807c2c945943e0f08895b117ae086e4041bf1b08371
4
- data.tar.gz: 965518819feb3eef689f19b7cc5470a973198b891e00f9d7f8ac7fd5b4620119
3
+ metadata.gz: c6e746c49f8701090aa423558ef9ccc644cff448b9c9c4f0c55e2752fda3ccf6
4
+ data.tar.gz: 9cb5b7761c29041c95b0ae9e00b4d98f8bffc06130bd02f9d3e4cecec31bc310
5
5
  SHA512:
6
- metadata.gz: f023bfcde5d5b272477d2dd7e7c2d6de430c4ec544d6a10da75f7ff72b5980349d282710796a2ac5c4bede5e72df5456dd733828c7869f3f1231b26314f450e4
7
- data.tar.gz: d606bdeed6b199fa467c4f80236d9dab40ef0db13e3105397bbe411caffa71c00274ea5902e1ce3f4764ab915cada0a9574d133905f07e28a348e2e28f9b7cfa
6
+ metadata.gz: 465a227cbce7038041f4faf90a976fdd2d04a0833f140acf9c3aa26f74d6a9439155aa4bf15fbd78801aefc3b5fa88f7de11b248817e7e3ce83efc5983d9330e
7
+ data.tar.gz: e33fb6252cd1ab022d7543fb0275d2e1dc3e13fd1c966bb53ca3b806029d3b498212137995597910f6382bc036d4e22c322892732ca8a65ab49bc37b917451c7
data/README.org CHANGED
@@ -125,12 +125,30 @@ end
125
125
  Within the block provided to =Berns::Builder.new= every standard element method,
126
126
  void element method, =#element=, and =#void= are available as methods and each
127
127
  time you use one of those methods the result is appended to an internal buffer.
128
- In addition, the =#text= method can be used to append a plain text string to the
129
- buffer and that text will be HTML escaped, so it's good for untrusted content.
128
+ In addition, the =#text= method appends HTML escaped text to the buffer and
129
+ =#raw= appends text to the buffer without modification.
130
130
 
131
- Once initialized, rendering the template to a string can be done with the
132
- =#call= method and any arguments, positional or keyword, will be passed through
133
- as-is to the block provided to =#new=.
131
+ The block provided to =Berns::Builder.new= can take both positional and keyword
132
+ arguments.
133
+
134
+ #+begin_src ruby
135
+ template = Berns::Builder.new do |content, title:|
136
+ h1 { title }
137
+ p(class: 'paragraph') { content }
138
+ end
139
+
140
+ template.call('Some text.', title: 'The title') # =>
141
+ # <h1>
142
+ # The title
143
+ # </h1>
144
+ # <p>
145
+ # Some text.
146
+ # </p>
147
+ #+end_src
148
+
149
+ Once initialized, the =#call= method will render the template to a string. Any
150
+ arguments, positional or keyword, are passed through as-is to the block provided
151
+ to =#new=.
134
152
 
135
153
  #+begin_src ruby
136
154
  string = template.call # =>
@@ -168,6 +186,7 @@ end # =>
168
186
  # </p>
169
187
  #+end_src
170
188
 
189
+
171
190
  *** Standard and void elements
172
191
 
173
192
  All standard and void HTML elements are defined as methods on Berns, so you can
@@ -196,20 +215,22 @@ area base br col embed hr img input link menuitem meta param source track wbr
196
215
 
197
216
  ** Performance
198
217
 
199
- Berns 3 is about three times faster than the pure Ruby implementation used in
200
- version 2. See the file [[file:benchmarks/performance.rb][benchmarks/performance.rb]] for the benchmark code.
218
+ Berns 3 was a total rewrite from a pure Ruby implementation to one powered by a
219
+ C extension. That rewrite is about three times faster than the pure Ruby
220
+ implementation used in version 2. See the file [[file:benchmarks/performance.rb][benchmarks/performance.rb]] for the
221
+ benchmark code.
201
222
 
202
223
  #+begin_example
203
224
  Warming up --------------------------------------
204
- element 27.373k i/100ms
205
- berns 94.118k i/100ms
225
+ ruby 27.521k i/100ms
226
+ c-ext 74.915k i/100ms
206
227
  Calculating -------------------------------------
207
- element 314.078k4.5%) i/s - 1.588M in 5.065539s
208
- berns 935.528k6.1%) i/s - 4.706M in 5.049718s
228
+ ruby 275.913k1.0%) i/s - 1.404M in 5.087516s
229
+ c-ext 813.113k1.0%) i/s - 4.120M in 5.067902s
209
230
 
210
231
  Comparison:
211
- berns: 935527.9 i/s
212
- element: 314078.4 i/s - 2.98x (± 0.00) slower
232
+ c-ext: 813113.3 i/s
233
+ ruby: 275913.5 i/s - 2.95x (± 0.00) slower
213
234
  #+end_example
214
235
 
215
236
  ** Trivia
data/ext/berns/berns.c CHANGED
@@ -357,7 +357,20 @@ static char * hash_value_to_attribute(const char *attr, const size_t attrlen, VA
357
357
  free(combined);
358
358
  }
359
359
 
360
- return destination;
360
+ /*
361
+ * Reallocate destination to final size. This is generally a reduction in the
362
+ * allocated memory since we chunk allocations in 256 byte multiples.
363
+ */
364
+ char *rightsizeddest = realloc(destination, occupied + 1);
365
+
366
+ if (rightsizeddest == NULL) {
367
+ free(destination);
368
+ rb_raise(rb_eNoMemError, "Berns could not allocate sufficient memory.");
369
+ }
370
+
371
+ rightsizeddest[occupied] = '\0';
372
+
373
+ return rightsizeddest;
361
374
  }
362
375
 
363
376
  /*
Binary file
data/lib/berns/builder.rb CHANGED
@@ -5,22 +5,28 @@ module Berns
5
5
  # An HTML builder DSL using Berns' HTML methods.
6
6
  class Builder
7
7
  def initialize(&block)
8
+ raise(ArgumentError, 'Berns::Builder initialized without a block argument', caller) unless block
9
+
8
10
  @block = block
9
- @buffer = +''
10
11
  end
11
12
 
12
13
  # @return [String]
13
- def call(*args, **opts)
14
- instance_exec(*args, **opts, &@block)
15
- to_s
16
- end
14
+ def call(*args, **kwargs)
15
+ @buffer = +''
16
+ content = instance_exec(*args, **kwargs, &@block)
17
17
 
18
- # @return [String]
19
- def to_s
20
- @buffer.freeze
18
+ # This is a special case where the buffer hasn't been appended to but the
19
+ # block returned a string.
20
+ if @buffer.empty? && content.is_a?(String)
21
+ Berns.escape_html(content).freeze
22
+ else
23
+ @buffer.freeze
24
+ end
21
25
  end
26
+ alias to_s call
27
+ alias to_str call
22
28
 
23
- # Append text to the buffer.
29
+ # Append HTML escaped text to the buffer.
24
30
  #
25
31
  # @param string [String]
26
32
  # @return [String]
@@ -28,31 +34,39 @@ module Berns
28
34
  @buffer << Berns.escape_html(string.to_s)
29
35
  end
30
36
 
37
+ # Append raw text to the buffer.
38
+ #
39
+ # @param string [String]
40
+ # @return [String]
41
+ def raw(string)
42
+ @buffer << string.to_s
43
+ end
44
+
31
45
  # Append an arbitrary standard element to the buffer.
32
46
  #
33
47
  # @return [String]
34
- def element(*args, **opts, &block)
35
- content = Builder.new.instance_exec(*args, **opts, &block) if block
36
- @buffer << Berns.element(*args, **opts) { content }
48
+ def element(elm, *args, **kwargs, &block)
49
+ content = Builder.new(&block).call if block
50
+ @buffer << Berns.element(elm, *args, **kwargs) { content }
37
51
  end
38
52
 
39
53
  # Append an arbitrary void element to the buffer.
40
54
  #
41
55
  # @return [String]
42
- def void(*args, **opts)
43
- @buffer << Berns.void(*args, **opts)
56
+ def void(...)
57
+ @buffer << Berns.void(...)
44
58
  end
45
59
 
46
60
  Berns::STANDARD.each do |meth|
47
- define_method(meth) do |*args, **opts, &block|
48
- content = Builder.new.instance_exec(*args, **opts, &block) if block
49
- @buffer << Berns.send(meth, *args, **opts) { content }
61
+ define_method(meth) do |*args, **kwargs, &block|
62
+ content = Builder.new(&block).call if block
63
+ @buffer << Berns.send(meth, *args, **kwargs) { content }
50
64
  end
51
65
  end
52
66
 
53
67
  Berns::VOID.each do |meth|
54
- define_method(meth) do |*args, **opts|
55
- @buffer << Berns.send(meth, *args, **opts)
68
+ define_method(meth) do |*args, **kwargs|
69
+ @buffer << Berns.send(meth, *args, **kwargs)
56
70
  end
57
71
  end
58
72
  end
data/lib/berns/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Berns
3
- VERSION = '3.5.0'
3
+ VERSION = '4.1.1'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: berns
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.0
4
+ version: 4.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taylor Beck
@@ -9,148 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-02-15 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: benchmark-ips
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - ">="
19
- - !ruby/object:Gem::Version
20
- version: '0'
21
- type: :development
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- version: '0'
28
- - !ruby/object:Gem::Dependency
29
- name: bundler
30
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: '0'
35
- type: :development
36
- prerelease: false
37
- version_requirements: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- version: '0'
42
- - !ruby/object:Gem::Dependency
43
- name: minitest
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - ">="
47
- - !ruby/object:Gem::Version
48
- version: '0'
49
- type: :development
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- version: '0'
56
- - !ruby/object:Gem::Dependency
57
- name: rake
58
- requirement: !ruby/object:Gem::Requirement
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- version: '0'
63
- type: :development
64
- prerelease: false
65
- version_requirements: !ruby/object:Gem::Requirement
66
- requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- version: '0'
70
- - !ruby/object:Gem::Dependency
71
- name: rake-compiler
72
- requirement: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- version: '0'
77
- type: :development
78
- prerelease: false
79
- version_requirements: !ruby/object:Gem::Requirement
80
- requirements:
81
- - - ">="
82
- - !ruby/object:Gem::Version
83
- version: '0'
84
- - !ruby/object:Gem::Dependency
85
- name: rubocop
86
- requirement: !ruby/object:Gem::Requirement
87
- requirements:
88
- - - ">="
89
- - !ruby/object:Gem::Version
90
- version: '0'
91
- type: :development
92
- prerelease: false
93
- version_requirements: !ruby/object:Gem::Requirement
94
- requirements:
95
- - - ">="
96
- - !ruby/object:Gem::Version
97
- version: '0'
98
- - !ruby/object:Gem::Dependency
99
- name: rubocop-minitest
100
- requirement: !ruby/object:Gem::Requirement
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- version: '0'
105
- type: :development
106
- prerelease: false
107
- version_requirements: !ruby/object:Gem::Requirement
108
- requirements:
109
- - - ">="
110
- - !ruby/object:Gem::Version
111
- version: '0'
112
- - !ruby/object:Gem::Dependency
113
- name: rubocop-packaging
114
- requirement: !ruby/object:Gem::Requirement
115
- requirements:
116
- - - ">="
117
- - !ruby/object:Gem::Version
118
- version: '0'
119
- type: :development
120
- prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
122
- requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- version: '0'
126
- - !ruby/object:Gem::Dependency
127
- name: rubocop-performance
128
- requirement: !ruby/object:Gem::Requirement
129
- requirements:
130
- - - ">="
131
- - !ruby/object:Gem::Version
132
- version: '0'
133
- type: :development
134
- prerelease: false
135
- version_requirements: !ruby/object:Gem::Requirement
136
- requirements:
137
- - - ">="
138
- - !ruby/object:Gem::Version
139
- version: '0'
140
- - !ruby/object:Gem::Dependency
141
- name: rubocop-rake
142
- requirement: !ruby/object:Gem::Requirement
143
- requirements:
144
- - - ">="
145
- - !ruby/object:Gem::Version
146
- version: '0'
147
- type: :development
148
- prerelease: false
149
- version_requirements: !ruby/object:Gem::Requirement
150
- requirements:
151
- - - ">="
152
- - !ruby/object:Gem::Version
153
- version: '0'
12
+ date: 2022-09-01 00:00:00.000000000 Z
13
+ dependencies: []
154
14
  description: A utility library for generating HTML strings.
155
15
  email:
156
16
  - beck.taylorg@gmail.com
@@ -175,6 +35,8 @@ licenses:
175
35
  - MIT
176
36
  metadata:
177
37
  bug_tracker_uri: https://github.com/evanleck/berns/issues
38
+ changelog_uri: https://github.com/evanleck/berns/blob/main/CHANGELOG.org
39
+ homepage_uri: https://github.com/evanleck/berns
178
40
  rubygems_mfa_required: 'true'
179
41
  source_code_uri: https://github.com/evanleck/berns
180
42
  post_install_message:
@@ -185,14 +47,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
185
47
  requirements:
186
48
  - - ">="
187
49
  - !ruby/object:Gem::Version
188
- version: 2.5.0
50
+ version: 2.7.0
189
51
  required_rubygems_version: !ruby/object:Gem::Requirement
190
52
  requirements:
191
53
  - - ">="
192
54
  - !ruby/object:Gem::Version
193
55
  version: '2.0'
194
56
  requirements: []
195
- rubygems_version: 3.3.3
57
+ rubygems_version: 3.3.7
196
58
  signing_key:
197
59
  specification_version: 4
198
60
  summary: A utility library for generating HTML strings.