berns 3.3.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/ext/berns/sds.h ADDED
@@ -0,0 +1,274 @@
1
+ /* SDSLib 2.0 -- A C dynamic strings library
2
+ *
3
+ * Copyright (c) 2006-2015, Salvatore Sanfilippo <antirez at gmail dot com>
4
+ * Copyright (c) 2015, Oran Agra
5
+ * Copyright (c) 2015, Redis Labs, Inc
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ * * Redistributions in binary form must reproduce the above copyright
14
+ * notice, this list of conditions and the following disclaimer in the
15
+ * documentation and/or other materials provided with the distribution.
16
+ * * Neither the name of Redis nor the names of its contributors may be used
17
+ * to endorse or promote products derived from this software without
18
+ * specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ * POSSIBILITY OF SUCH DAMAGE.
31
+ */
32
+
33
+ #ifndef __SDS_H
34
+ #define __SDS_H
35
+
36
+ #define SDS_MAX_PREALLOC (1024*1024)
37
+ extern const char *SDS_NOINIT;
38
+
39
+ #include <sys/types.h>
40
+ #include <stdarg.h>
41
+ #include <stdint.h>
42
+
43
+ typedef char *sds;
44
+
45
+ /* Note: sdshdr5 is never used, we just access the flags byte directly.
46
+ * However is here to document the layout of type 5 SDS strings. */
47
+ struct __attribute__ ((__packed__)) sdshdr5 {
48
+ unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
49
+ char buf[];
50
+ };
51
+ struct __attribute__ ((__packed__)) sdshdr8 {
52
+ uint8_t len; /* used */
53
+ uint8_t alloc; /* excluding the header and null terminator */
54
+ unsigned char flags; /* 3 lsb of type, 5 unused bits */
55
+ char buf[];
56
+ };
57
+ struct __attribute__ ((__packed__)) sdshdr16 {
58
+ uint16_t len; /* used */
59
+ uint16_t alloc; /* excluding the header and null terminator */
60
+ unsigned char flags; /* 3 lsb of type, 5 unused bits */
61
+ char buf[];
62
+ };
63
+ struct __attribute__ ((__packed__)) sdshdr32 {
64
+ uint32_t len; /* used */
65
+ uint32_t alloc; /* excluding the header and null terminator */
66
+ unsigned char flags; /* 3 lsb of type, 5 unused bits */
67
+ char buf[];
68
+ };
69
+ struct __attribute__ ((__packed__)) sdshdr64 {
70
+ uint64_t len; /* used */
71
+ uint64_t alloc; /* excluding the header and null terminator */
72
+ unsigned char flags; /* 3 lsb of type, 5 unused bits */
73
+ char buf[];
74
+ };
75
+
76
+ #define SDS_TYPE_5 0
77
+ #define SDS_TYPE_8 1
78
+ #define SDS_TYPE_16 2
79
+ #define SDS_TYPE_32 3
80
+ #define SDS_TYPE_64 4
81
+ #define SDS_TYPE_MASK 7
82
+ #define SDS_TYPE_BITS 3
83
+ #define SDS_HDR_VAR(T,s) struct sdshdr##T *sh = (void*)((s)-(sizeof(struct sdshdr##T)));
84
+ #define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))))
85
+ #define SDS_TYPE_5_LEN(f) ((f)>>SDS_TYPE_BITS)
86
+
87
+ static inline size_t sdslen(const sds s) {
88
+ unsigned char flags = s[-1];
89
+ switch(flags&SDS_TYPE_MASK) {
90
+ case SDS_TYPE_5:
91
+ return SDS_TYPE_5_LEN(flags);
92
+ case SDS_TYPE_8:
93
+ return SDS_HDR(8,s)->len;
94
+ case SDS_TYPE_16:
95
+ return SDS_HDR(16,s)->len;
96
+ case SDS_TYPE_32:
97
+ return SDS_HDR(32,s)->len;
98
+ case SDS_TYPE_64:
99
+ return SDS_HDR(64,s)->len;
100
+ }
101
+ return 0;
102
+ }
103
+
104
+ static inline size_t sdsavail(const sds s) {
105
+ unsigned char flags = s[-1];
106
+ switch(flags&SDS_TYPE_MASK) {
107
+ case SDS_TYPE_5: {
108
+ return 0;
109
+ }
110
+ case SDS_TYPE_8: {
111
+ SDS_HDR_VAR(8,s);
112
+ return sh->alloc - sh->len;
113
+ }
114
+ case SDS_TYPE_16: {
115
+ SDS_HDR_VAR(16,s);
116
+ return sh->alloc - sh->len;
117
+ }
118
+ case SDS_TYPE_32: {
119
+ SDS_HDR_VAR(32,s);
120
+ return sh->alloc - sh->len;
121
+ }
122
+ case SDS_TYPE_64: {
123
+ SDS_HDR_VAR(64,s);
124
+ return sh->alloc - sh->len;
125
+ }
126
+ }
127
+ return 0;
128
+ }
129
+
130
+ static inline void sdssetlen(sds s, size_t newlen) {
131
+ unsigned char flags = s[-1];
132
+ switch(flags&SDS_TYPE_MASK) {
133
+ case SDS_TYPE_5:
134
+ {
135
+ unsigned char *fp = ((unsigned char*)s)-1;
136
+ *fp = SDS_TYPE_5 | (newlen << SDS_TYPE_BITS);
137
+ }
138
+ break;
139
+ case SDS_TYPE_8:
140
+ SDS_HDR(8,s)->len = newlen;
141
+ break;
142
+ case SDS_TYPE_16:
143
+ SDS_HDR(16,s)->len = newlen;
144
+ break;
145
+ case SDS_TYPE_32:
146
+ SDS_HDR(32,s)->len = newlen;
147
+ break;
148
+ case SDS_TYPE_64:
149
+ SDS_HDR(64,s)->len = newlen;
150
+ break;
151
+ }
152
+ }
153
+
154
+ static inline void sdsinclen(sds s, size_t inc) {
155
+ unsigned char flags = s[-1];
156
+ switch(flags&SDS_TYPE_MASK) {
157
+ case SDS_TYPE_5:
158
+ {
159
+ unsigned char *fp = ((unsigned char*)s)-1;
160
+ unsigned char newlen = SDS_TYPE_5_LEN(flags)+inc;
161
+ *fp = SDS_TYPE_5 | (newlen << SDS_TYPE_BITS);
162
+ }
163
+ break;
164
+ case SDS_TYPE_8:
165
+ SDS_HDR(8,s)->len += inc;
166
+ break;
167
+ case SDS_TYPE_16:
168
+ SDS_HDR(16,s)->len += inc;
169
+ break;
170
+ case SDS_TYPE_32:
171
+ SDS_HDR(32,s)->len += inc;
172
+ break;
173
+ case SDS_TYPE_64:
174
+ SDS_HDR(64,s)->len += inc;
175
+ break;
176
+ }
177
+ }
178
+
179
+ /* sdsalloc() = sdsavail() + sdslen() */
180
+ static inline size_t sdsalloc(const sds s) {
181
+ unsigned char flags = s[-1];
182
+ switch(flags&SDS_TYPE_MASK) {
183
+ case SDS_TYPE_5:
184
+ return SDS_TYPE_5_LEN(flags);
185
+ case SDS_TYPE_8:
186
+ return SDS_HDR(8,s)->alloc;
187
+ case SDS_TYPE_16:
188
+ return SDS_HDR(16,s)->alloc;
189
+ case SDS_TYPE_32:
190
+ return SDS_HDR(32,s)->alloc;
191
+ case SDS_TYPE_64:
192
+ return SDS_HDR(64,s)->alloc;
193
+ }
194
+ return 0;
195
+ }
196
+
197
+ static inline void sdssetalloc(sds s, size_t newlen) {
198
+ unsigned char flags = s[-1];
199
+ switch(flags&SDS_TYPE_MASK) {
200
+ case SDS_TYPE_5:
201
+ /* Nothing to do, this type has no total allocation info. */
202
+ break;
203
+ case SDS_TYPE_8:
204
+ SDS_HDR(8,s)->alloc = newlen;
205
+ break;
206
+ case SDS_TYPE_16:
207
+ SDS_HDR(16,s)->alloc = newlen;
208
+ break;
209
+ case SDS_TYPE_32:
210
+ SDS_HDR(32,s)->alloc = newlen;
211
+ break;
212
+ case SDS_TYPE_64:
213
+ SDS_HDR(64,s)->alloc = newlen;
214
+ break;
215
+ }
216
+ }
217
+
218
+ sds sdsnewlen(const void *init, size_t initlen);
219
+ sds sdsnew(const char *init);
220
+ sds sdsempty(void);
221
+ sds sdsdup(const sds s);
222
+ void sdsfree(sds s);
223
+ sds sdsgrowzero(sds s, size_t len);
224
+ sds sdscatlen(sds s, const void *t, size_t len);
225
+ sds sdscat(sds s, const char *t);
226
+ sds sdscatsds(sds s, const sds t);
227
+ sds sdscpylen(sds s, const char *t, size_t len);
228
+ sds sdscpy(sds s, const char *t);
229
+
230
+ sds sdscatvprintf(sds s, const char *fmt, va_list ap);
231
+ #ifdef __GNUC__
232
+ sds sdscatprintf(sds s, const char *fmt, ...)
233
+ __attribute__((format(printf, 2, 3)));
234
+ #else
235
+ sds sdscatprintf(sds s, const char *fmt, ...);
236
+ #endif
237
+
238
+ sds sdscatfmt(sds s, char const *fmt, ...);
239
+ sds sdstrim(sds s, const char *cset);
240
+ void sdsrange(sds s, ssize_t start, ssize_t end);
241
+ void sdsupdatelen(sds s);
242
+ void sdsclear(sds s);
243
+ int sdscmp(const sds s1, const sds s2);
244
+ sds *sdssplitlen(const char *s, ssize_t len, const char *sep, int seplen, int *count);
245
+ void sdsfreesplitres(sds *tokens, int count);
246
+ void sdstolower(sds s);
247
+ void sdstoupper(sds s);
248
+ sds sdsfromlonglong(long long value);
249
+ sds sdscatrepr(sds s, const char *p, size_t len);
250
+ sds *sdssplitargs(const char *line, int *argc);
251
+ sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen);
252
+ sds sdsjoin(char **argv, int argc, char *sep);
253
+ sds sdsjoinsds(sds *argv, int argc, const char *sep, size_t seplen);
254
+
255
+ /* Low level functions exposed to the user API */
256
+ sds sdsMakeRoomFor(sds s, size_t addlen);
257
+ void sdsIncrLen(sds s, ssize_t incr);
258
+ sds sdsRemoveFreeSpace(sds s);
259
+ size_t sdsAllocSize(sds s);
260
+ void *sdsAllocPtr(sds s);
261
+
262
+ /* Export the allocator used by SDS to the program using SDS.
263
+ * Sometimes the program SDS is linked to, may use a different set of
264
+ * allocators, but may want to allocate or free things that SDS will
265
+ * respectively free or allocate. */
266
+ void *sds_malloc(size_t size);
267
+ void *sds_realloc(void *ptr, size_t size);
268
+ void sds_free(void *ptr);
269
+
270
+ #ifdef REDIS_TEST
271
+ int sdsTest(int argc, char *argv[]);
272
+ #endif
273
+
274
+ #endif
@@ -0,0 +1,42 @@
1
+ /* SDSLib 2.0 -- A C dynamic strings library
2
+ *
3
+ * Copyright (c) 2006-2015, Salvatore Sanfilippo <antirez at gmail dot com>
4
+ * Copyright (c) 2015, Oran Agra
5
+ * Copyright (c) 2015, Redis Labs, Inc
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ * * Redistributions in binary form must reproduce the above copyright
14
+ * notice, this list of conditions and the following disclaimer in the
15
+ * documentation and/or other materials provided with the distribution.
16
+ * * Neither the name of Redis nor the names of its contributors may be used
17
+ * to endorse or promote products derived from this software without
18
+ * specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ * POSSIBILITY OF SUCH DAMAGE.
31
+ */
32
+
33
+ /* SDS allocator selection.
34
+ *
35
+ * This file is used in order to change the SDS allocator at compile time.
36
+ * Just define the following defines to what you want to use. Also add
37
+ * the include of your alternate allocator if needed (not needed in order
38
+ * to use the default libc allocator). */
39
+
40
+ #define s_malloc malloc
41
+ #define s_realloc realloc
42
+ #define s_free free
Binary file
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+ require 'berns'
3
+
4
+ module Berns
5
+ # An HTML builder DSL using Berns' HTML methods.
6
+ class Builder
7
+ def initialize(&block)
8
+ @block = block
9
+ @buffer = +''
10
+ end
11
+
12
+ # @return [String]
13
+ def call(*args, **opts)
14
+ instance_exec(*args, **opts, &@block)
15
+ to_s
16
+ end
17
+
18
+ # @return [String]
19
+ def to_s
20
+ @buffer.freeze
21
+ end
22
+
23
+ # Append text to the buffer.
24
+ #
25
+ # @param string [String]
26
+ # @return [String]
27
+ def text(string)
28
+ @buffer << Berns.escape_html(string.to_s)
29
+ end
30
+
31
+ # Append an arbitrary standard element to the buffer.
32
+ #
33
+ # @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 }
37
+ end
38
+
39
+ # Append an arbitrary void element to the buffer.
40
+ #
41
+ # @return [String]
42
+ def void(*args, **opts)
43
+ @buffer << Berns.void(*args, **opts)
44
+ end
45
+
46
+ 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 }
50
+ end
51
+ end
52
+
53
+ Berns::VOID.each do |meth|
54
+ define_method(meth) do |*args, **opts|
55
+ @buffer << Berns.send(meth, *args, **opts)
56
+ end
57
+ end
58
+ end
59
+ end
data/lib/berns/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Berns
3
- VERSION = '3.3.1'
3
+ VERSION = '4.0.0'
4
4
  end
data/lib/berns.rb CHANGED
@@ -1,3 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
  require 'berns/berns'
3
3
  require 'berns/version'
4
+
5
+ module Berns # :nodoc:
6
+ autoload :Builder, 'berns/builder'
7
+
8
+ STANDARD = %i[
9
+ a abbr address article aside audio b bdi bdo blockquote body button canvas
10
+ caption cite code colgroup datalist dd del details dfn dialog div dl dt em
11
+ fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 head header html i
12
+ iframe ins kbd label legend li main map mark menu meter nav noscript object
13
+ ol optgroup option output p picture pre progress q rp rt ruby s samp script
14
+ section select small span strong style sub summary table tbody td template
15
+ textarea tfoot th thead time title tr u ul var video
16
+ ].freeze
17
+
18
+ VOID = %i[
19
+ area base br col embed hr img input link menuitem meta param source track wbr
20
+ ].freeze
21
+
22
+ # @return [String]
23
+ def self.build(*args, **opts, &block)
24
+ Builder.new(&block).call(*args, **opts)
25
+ end
26
+ 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.3.1
4
+ version: 4.0.0
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: 2021-12-27 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-05-24 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
@@ -166,14 +26,20 @@ files:
166
26
  - ext/berns/extconf.rb
167
27
  - ext/berns/hescape.c
168
28
  - ext/berns/hescape.h
29
+ - ext/berns/sds.c
30
+ - ext/berns/sds.h
31
+ - ext/berns/sdsalloc.h
169
32
  - lib/berns.rb
170
33
  - lib/berns/berns.bundle
34
+ - lib/berns/builder.rb
171
35
  - lib/berns/version.rb
172
36
  homepage: https://github.com/evanleck/berns
173
37
  licenses:
174
38
  - MIT
175
39
  metadata:
176
40
  bug_tracker_uri: https://github.com/evanleck/berns/issues
41
+ changelog_uri: https://github.com/evanleck/berns/blob/main/CHANGELOG.org
42
+ homepage_uri: https://github.com/evanleck/berns
177
43
  rubygems_mfa_required: 'true'
178
44
  source_code_uri: https://github.com/evanleck/berns
179
45
  post_install_message:
@@ -184,14 +50,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
184
50
  requirements:
185
51
  - - ">="
186
52
  - !ruby/object:Gem::Version
187
- version: 2.5.0
53
+ version: 2.7.0
188
54
  required_rubygems_version: !ruby/object:Gem::Requirement
189
55
  requirements:
190
56
  - - ">="
191
57
  - !ruby/object:Gem::Version
192
58
  version: '2.0'
193
59
  requirements: []
194
- rubygems_version: 3.3.3
60
+ rubygems_version: 3.3.7
195
61
  signing_key:
196
62
  specification_version: 4
197
63
  summary: A utility library for generating HTML strings.