dhtml 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0d19e6ad8effeadc4ba60d79a1df5cc0a66ca25e7c8f75f513e73faf439abccf
4
+ data.tar.gz: 42e1449cda9a9874bd36bb0b261537c4f147b2af56b0e26aba742b231297332f
5
+ SHA512:
6
+ metadata.gz: f26aaa41af798393b2865477d742bf59c9723dc3714d43e1f2e7c463c8465801c7947c1cc33b45671e05ef68f63bff1f7db5e684cbd50720d6df3f9cf18c286a
7
+ data.tar.gz: 07c3a590c080c087a543628db94fe171e16f7746f7863110c82b7a9a6aa18a55378d39abb95b64abd96b47251b94e25d3e0f3b4831d2f652431e8637b09d2152
data/CHANGELOG.md ADDED
@@ -0,0 +1,25 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog], and this project adheres to [Semantic Versioning].
5
+
6
+ ## [Unreleased]
7
+
8
+ ## [0.1.3] - 2021-05-10
9
+ ### Fixed
10
+ - The gemspec no longer uses absolute paths for the sources.
11
+
12
+ ## [0.1.2] - 2021-05-10
13
+ ### Added
14
+ - `reset` method so the document can be generated more than once.
15
+
16
+ ## [0.1.0] - 2021-05-10
17
+ - Initial release
18
+
19
+
20
+ [Unreleased]: https://github.com/hi5dev/dhtml/compare/v0.1.2...HEAD
21
+ [0.1.2]: https://github.com/hi5dev/dhtml/compare/v0.1.2..v0.1.0
22
+ [0.1.0]: https://github.com/hi5dev/dhtml/releases/tag/v0.1.0
23
+
24
+ [Keep a Changelog]: https://keepachangelog.com/en/1.0.0/
25
+ [Semantic Versioning]: https://semver.org/spec/v2.0.0.html
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ gem 'rake', '~> 13.0'
8
+
9
+ gem 'minitest', '~> 5.14'
10
+
11
+ gem 'opal', '~> 1.0'
data/Gemfile.lock ADDED
@@ -0,0 +1,28 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ dhtml (0.1.3)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ast (2.4.2)
10
+ minitest (5.14.2)
11
+ opal (1.1.1)
12
+ ast (>= 2.3.0)
13
+ parser (~> 3.0)
14
+ parser (3.0.1.1)
15
+ ast (~> 2.4.1)
16
+ rake (13.0.3)
17
+
18
+ PLATFORMS
19
+ x86_64-linux
20
+
21
+ DEPENDENCIES
22
+ dhtml!
23
+ minitest (~> 5.14)
24
+ opal (~> 1.0)
25
+ rake (~> 13.0)
26
+
27
+ BUNDLED WITH
28
+ 2.2.16
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 Hi5 Development, LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,111 @@
1
+ # DHTML
2
+
3
+ A fast, simple, and elegant DSL for generating HTML using Ruby that is compatible with [Opal](https://opalrb.com/).
4
+
5
+ Here's an example:
6
+
7
+ ```ruby
8
+ extend DHTML
9
+
10
+ doctype :html
11
+
12
+ html(lang: 'en') {
13
+ head {
14
+ meta charset: 'utf-8'
15
+ title { 'Example' }
16
+ link rel: 'stylesheet', href: 'style.css'
17
+ script src: 'main.js'
18
+ }
19
+ body {
20
+ div(id: 'main') {
21
+ _p { <<~TEXT }
22
+ Some of Ruby's internal methods would be overwritten if this library added a method for all the
23
+ HTML tags. To solve this, the alias for these methods begins with an underscore:
24
+ TEXT
25
+
26
+ ol {
27
+ li { code { '_p' } }
28
+ li { code { '_select' } }
29
+ }
30
+ }
31
+ }
32
+ }
33
+
34
+ puts read_html
35
+ ```
36
+
37
+ ## Proof of Concept
38
+
39
+ Using Ruby to generate HTML makes it possible to write modular, easily testable views. Here's a simple
40
+ example:
41
+
42
+ ```ruby
43
+ module Layout
44
+ include DHTML
45
+
46
+ def inner_body
47
+ end
48
+
49
+ def render
50
+ reset if document.length > 0
51
+
52
+ doctype :html
53
+
54
+ html do
55
+ head do
56
+ title { 'Proof of Concept' }
57
+ end
58
+ body do
59
+ inner_body
60
+ end
61
+ end
62
+
63
+ finish
64
+ end
65
+ end
66
+
67
+ class IndexPage
68
+ include Layout
69
+
70
+ def inner_body
71
+ h1 { 'It works!' }
72
+ end
73
+ end
74
+
75
+ page = IndexPage.new
76
+
77
+ html = page.render
78
+
79
+ puts html.read
80
+
81
+ # => "<!doctype html><html><head><title>Proof of Concept</title></head><body><h1>It works!</h1></body></html>"
82
+ ```
83
+
84
+ It's easy to see how that could be plugged into many Ruby web frameworks. Here's how the above example can work with
85
+ Rack:
86
+
87
+ ```ruby
88
+ run -> (_env) do
89
+ [200, { Rack::CONTENT_TYPE => 'text/html' }, IndexPage.new.render]
90
+ end
91
+ ```
92
+
93
+ ## Development
94
+
95
+ A `Dockerfile` and Docker Compose configuration is provided to simplify the onboarding process. After cloning this
96
+ repository, all you have to do to get started is run the tests with:
97
+
98
+ $ docker-compose run test
99
+
100
+ You can log into the container with:
101
+
102
+ $ docker-compose run ruby ash
103
+
104
+ ## Contributing
105
+
106
+ Bug reports and pull requests are welcome on GitHub at https://github.com/hi5dev/dhtml. Make sure to add your
107
+ contact information to `spec.authors` and `spec.email` in the gemspec file if you do contribute.
108
+
109
+ ## License
110
+
111
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/dhtml.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/dhtml/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'dhtml'
7
+ spec.version = DHTML::VERSION
8
+ spec.authors = ['Travis Haynes']
9
+ spec.email = %w[travis@hi5dev.com]
10
+
11
+ spec.summary = 'A fast, simple, and elegant DSL for generating HTML using Ruby. Also compatible with Opal.'
12
+ spec.description = spec.summary
13
+ spec.homepage = 'https://www.hi5dev.com/dhtml'
14
+ spec.license = 'MIT'
15
+
16
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
17
+
18
+ spec.metadata['homepage_uri'] = spec.homepage
19
+ spec.metadata['source_code_uri'] = 'https://github.com/hi5dev/dhtml'
20
+ spec.metadata['changelog_uri'] = 'https://github.com/hi5dev/dhtml/blob/base/CHANGELOG.md'
21
+
22
+ spec.files = %w[
23
+ CHANGELOG.md
24
+ dhtml.gemspec
25
+ Gemfile
26
+ Gemfile.lock
27
+ lib/dhtml.rb
28
+ lib/dhtml/document.rb
29
+ lib/dhtml/opal.rb
30
+ lib/dhtml/version.rb
31
+ LICENSE.txt
32
+ README.md
33
+ ]
34
+
35
+ spec.require_paths = %w[lib]
36
+ end
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'stringio'
4
+
5
+ module DHTML
6
+ # Provides methods for generating HTML.
7
+ #
8
+ # @since 0.1.0
9
+ module Document
10
+ # Most commonly used HTML escape sequences.
11
+ #
12
+ # @type [Hash<String => String>]
13
+ # @since 0.1.0
14
+ ESCAPE_HTML = {
15
+ "'" => '&#x27;',
16
+ '"' => '&quot;',
17
+ '&' => '&amp;',
18
+ '/' => '&#x2F;',
19
+ '<' => '&lt;',
20
+ '>' => '&gt;',
21
+ }
22
+
23
+ # Regular expression that matches the most common characters that need to be escaped in HTML strings.
24
+ #
25
+ # @type [Regexp]
26
+ # @since 0.1.0
27
+ ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys)
28
+
29
+ # Writes the HTML doctype.
30
+ #
31
+ # @param [Symbol] type of document
32
+ # @return [Integer] number of bytes written to the document.
33
+ # @since 0.1.0
34
+ def doctype(type)
35
+ tag = case type
36
+ when :html3
37
+ %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">|
38
+ when :html4
39
+ %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">|
40
+ when :html4_framesets, :html4_fr
41
+ %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">|
42
+ when :html4_transitional, :html4_tr
43
+ %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">|
44
+ when :html5, :html
45
+ %|<!doctype html>|
46
+ else
47
+ fail ArgumentError, "unsupported doctype: #{type.inspect}"
48
+ end
49
+
50
+ document.write(tag)
51
+ end
52
+
53
+ # The document is written to this buffer.
54
+ #
55
+ # @return [StringIO]
56
+ # @since 0.1.0
57
+ def document
58
+ @document ||= StringIO.new
59
+ end
60
+
61
+ # Rewinds the document so it can be read.
62
+ #
63
+ # @return [StringIO]
64
+ # @since 0.1.0
65
+ def finish
66
+ document.tap(&:rewind)
67
+ end
68
+
69
+ # Generates an HTML attribute (e.g. +class="form"+).
70
+ #
71
+ # @param [Symbol, String] name
72
+ # @param [Symbol, String] value
73
+ # @return [String]
74
+ # @since 0.1.0
75
+ def html_attribute(name, value)
76
+ [h(name.to_s), h(value.to_s).inspect].join('=')
77
+ end
78
+
79
+ # Generates a string of HTML attributes from a Hash.
80
+ #
81
+ # @param [Hash] attributes
82
+ # @return [String]
83
+ # @since 0.1.0
84
+ def html_attributes(attributes)
85
+ # noinspection RubyYardParamTypeMatch
86
+ attributes.inject([]) { _1 << html_attribute(_2[0], _2[1]) }.join(' ')
87
+ end
88
+
89
+ # Escape ampersands, brackets and quotes for HTML.
90
+ #
91
+ # @param [String] string to escape.
92
+ # @return [String] HTML escaped string.
93
+ # @since 0.1.0
94
+ def html_escape(string)
95
+ string.to_s.gsub(ESCAPE_HTML_PATTERN) { ESCAPE_HTML[_1] }
96
+ end
97
+
98
+ alias_method :h, :html_escape
99
+
100
+ # Reads the entire HTML document.
101
+ #
102
+ # @return [String]
103
+ # @since 0.1.0
104
+ def read_html
105
+ document.tap(&:rewind).read
106
+ end
107
+
108
+ # Clears all content from the document.
109
+ #
110
+ # @return [StringIO]
111
+ # @since 0.1.1
112
+ def reset
113
+ document.close
114
+ document.reopen
115
+ end
116
+
117
+ # Writes the opening element for the given HTML tag to the document.
118
+ #
119
+ # @!attribute [String] tag
120
+ # @!attribute [Hash] attributes
121
+ # @return [Integer] Number of bytes written to the stream.
122
+ # @since 0.1.0
123
+ def write_html_element(tag, attributes = {})
124
+ document << '<'
125
+ document << tag
126
+ document << " #{html_attributes(attributes)}" unless attributes.empty?
127
+ document << '>'
128
+ end
129
+
130
+ # Write a tag to the HTML document.
131
+ #
132
+ # @param [Symbol] tag name.
133
+ # @param [Hash] attributes for the tag.
134
+ # @param [Proc] inner_html to include in the tag.
135
+ # @return [void]
136
+ # @since 0.1.0
137
+ def write_html_tag(tag: __callee__, **attributes, &inner_html)
138
+ # Ensure the method isn't being called directly.
139
+ fail ArgumentError, 'invalid tag' if tag == :write_html_tag
140
+
141
+ # Remove the underscore prefix added to prevent conflicts with internal Ruby methods.
142
+ tag = tag.to_s
143
+ tag = tag[1..-1] if tag[0] == '_'
144
+
145
+ # Opening tag with its HTML attributes - e.g. <div id="main">
146
+ write_html_element(tag, attributes)
147
+
148
+ # Capture the inner HTML.
149
+ content = inner_html&.call(document)
150
+
151
+ # Write the inner HTML to the document when present.
152
+ document.write(content) if content.is_a?(String)
153
+
154
+ # Close the tag when necessary.
155
+ document.write("</#{tag}>") if content.is_a?(String) || block_given? || !void?(tag.to_sym)
156
+ end
157
+ end
158
+ end
data/lib/dhtml/opal.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Only continue when not running in Opal, and the gem is available.
4
+ return if RUBY_ENGINE == 'opal' || !defined?(Opal)
5
+
6
+ # Add the library to the Opal load path when it's available.
7
+ Opal.append_path File.expand_path(File.join('..', '..'), __FILE__)
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DHTML
4
+ # The gem's semantic version number.
5
+ #
6
+ # @see https://semver.org/spec/v2.0.0.html
7
+ # @type [String]
8
+ VERSION = '0.1.3'
9
+ end
data/lib/dhtml.rb ADDED
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'dhtml/document'
4
+ require_relative 'dhtml/opal'
5
+ require_relative 'dhtml/version'
6
+
7
+ # @since 0.1.0
8
+ module DHTML
9
+ include DHTML::Document
10
+
11
+ # List of tags that do not require a closing tag.
12
+ #
13
+ # @type [Array<Symbol>]
14
+ # @since 0.1.0
15
+ VOID_TAGS = %i[area audio base br col hr img input link meta param picture source video]
16
+
17
+ # @param [Symbol] tag
18
+ # @return [TrueClass, FalseClass]
19
+ # @since 0.1.0
20
+ def void?(tag)
21
+ VOID_TAGS.include?(tag)
22
+ end
23
+
24
+ if RUBY_ENGINE == 'opal'
25
+ # Opal does not support __callee__, so #alias_method is being overridden to provide implementation sufficient for
26
+ # this module.
27
+ #
28
+ # @param [Symbol] tag
29
+ # @return [Symbol] The name of the aliased method.
30
+ # @since 0.1.0
31
+ def self.alias_method(tag, _)
32
+ define_method(tag) do |**attributes, &block|
33
+ write_html_tag(tag: tag, **attributes, &block)
34
+ end
35
+ end
36
+ end
37
+
38
+ # An underscore is added to HTML tags that already have Ruby methods. This makes it both easy to remember, and to
39
+ # detect them in #write_html_tag.
40
+ begin
41
+ alias_method :_p, :write_html_tag
42
+ alias_method :_select, :write_html_tag
43
+ end
44
+
45
+ # The HTML tags are aliased to #write_html_tag, which uses reflection to determine which tag to generate.
46
+ begin
47
+ alias_method :a, :write_html_tag
48
+ alias_method :abbr, :write_html_tag
49
+ alias_method :address, :write_html_tag
50
+ alias_method :area, :write_html_tag
51
+ alias_method :article, :write_html_tag
52
+ alias_method :aside, :write_html_tag
53
+ alias_method :audio, :write_html_tag
54
+ alias_method :b, :write_html_tag
55
+ alias_method :base, :write_html_tag
56
+ alias_method :bdi, :write_html_tag
57
+ alias_method :bdo, :write_html_tag
58
+ alias_method :blockquote, :write_html_tag
59
+ alias_method :body, :write_html_tag
60
+ alias_method :br, :write_html_tag
61
+ alias_method :button, :write_html_tag
62
+ alias_method :canvas, :write_html_tag
63
+ alias_method :caption, :write_html_tag
64
+ alias_method :cite, :write_html_tag
65
+ alias_method :code, :write_html_tag
66
+ alias_method :col, :write_html_tag
67
+ alias_method :colgroup, :write_html_tag
68
+ alias_method :data, :write_html_tag
69
+ alias_method :datalist, :write_html_tag
70
+ alias_method :dd, :write_html_tag
71
+ alias_method :del, :write_html_tag
72
+ alias_method :details, :write_html_tag
73
+ alias_method :dfn, :write_html_tag
74
+ alias_method :dialog, :write_html_tag
75
+ alias_method :div, :write_html_tag
76
+ alias_method :dl, :write_html_tag
77
+ alias_method :dt, :write_html_tag
78
+ alias_method :em, :write_html_tag
79
+ alias_method :embed, :write_html_tag
80
+ alias_method :fieldset, :write_html_tag
81
+ alias_method :figcaption, :write_html_tag
82
+ alias_method :figure, :write_html_tag
83
+ alias_method :footer, :write_html_tag
84
+ alias_method :form, :write_html_tag
85
+ alias_method :h1, :write_html_tag
86
+ alias_method :h2, :write_html_tag
87
+ alias_method :h3, :write_html_tag
88
+ alias_method :h4, :write_html_tag
89
+ alias_method :h5, :write_html_tag
90
+ alias_method :h6, :write_html_tag
91
+ alias_method :head, :write_html_tag
92
+ alias_method :header, :write_html_tag
93
+ alias_method :hgroup, :write_html_tag
94
+ alias_method :hr, :write_html_tag
95
+ alias_method :html, :write_html_tag
96
+ alias_method :i, :write_html_tag
97
+ alias_method :iframe, :write_html_tag
98
+ alias_method :img, :write_html_tag
99
+ alias_method :input, :write_html_tag
100
+ alias_method :ins, :write_html_tag
101
+ alias_method :kbd, :write_html_tag
102
+ alias_method :label, :write_html_tag
103
+ alias_method :legend, :write_html_tag
104
+ alias_method :li, :write_html_tag
105
+ alias_method :link, :write_html_tag
106
+ alias_method :main, :write_html_tag
107
+ alias_method :map, :write_html_tag
108
+ alias_method :mark, :write_html_tag
109
+ alias_method :meta, :write_html_tag
110
+ alias_method :meter, :write_html_tag
111
+ alias_method :nav, :write_html_tag
112
+ alias_method :noscript, :write_html_tag
113
+ alias_method :object, :write_html_tag
114
+ alias_method :ol, :write_html_tag
115
+ alias_method :optgroup, :write_html_tag
116
+ alias_method :option, :write_html_tag
117
+ alias_method :output, :write_html_tag
118
+ alias_method :param, :write_html_tag
119
+ alias_method :picture, :write_html_tag
120
+ alias_method :pre, :write_html_tag
121
+ alias_method :progress, :write_html_tag
122
+ alias_method :q, :write_html_tag
123
+ alias_method :rb, :write_html_tag
124
+ alias_method :rp, :write_html_tag
125
+ alias_method :rt, :write_html_tag
126
+ alias_method :rtc, :write_html_tag
127
+ alias_method :ruby, :write_html_tag
128
+ alias_method :s, :write_html_tag
129
+ alias_method :samp, :write_html_tag
130
+ alias_method :script, :write_html_tag
131
+ alias_method :section, :write_html_tag
132
+ alias_method :slot, :write_html_tag
133
+ alias_method :small, :write_html_tag
134
+ alias_method :source, :write_html_tag
135
+ alias_method :span, :write_html_tag
136
+ alias_method :strong, :write_html_tag
137
+ alias_method :style, :write_html_tag
138
+ alias_method :sub, :write_html_tag
139
+ alias_method :summary, :write_html_tag
140
+ alias_method :sup, :write_html_tag
141
+ alias_method :table, :write_html_tag
142
+ alias_method :tbody, :write_html_tag
143
+ alias_method :td, :write_html_tag
144
+ alias_method :template, :write_html_tag
145
+ alias_method :textarea, :write_html_tag
146
+ alias_method :tfoot, :write_html_tag
147
+ alias_method :th, :write_html_tag
148
+ alias_method :thead, :write_html_tag
149
+ alias_method :time, :write_html_tag
150
+ alias_method :title, :write_html_tag
151
+ alias_method :tr, :write_html_tag
152
+ alias_method :track, :write_html_tag
153
+ alias_method :u, :write_html_tag
154
+ alias_method :ul, :write_html_tag
155
+ alias_method :var, :write_html_tag
156
+ alias_method :video, :write_html_tag
157
+ alias_method :wbr, :write_html_tag
158
+ end
159
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dhtml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Travis Haynes
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-05-11 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A fast, simple, and elegant DSL for generating HTML using Ruby. Also
14
+ compatible with Opal.
15
+ email:
16
+ - travis@hi5dev.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - CHANGELOG.md
22
+ - Gemfile
23
+ - Gemfile.lock
24
+ - LICENSE.txt
25
+ - README.md
26
+ - dhtml.gemspec
27
+ - lib/dhtml.rb
28
+ - lib/dhtml/document.rb
29
+ - lib/dhtml/opal.rb
30
+ - lib/dhtml/version.rb
31
+ homepage: https://www.hi5dev.com/dhtml
32
+ licenses:
33
+ - MIT
34
+ metadata:
35
+ homepage_uri: https://www.hi5dev.com/dhtml
36
+ source_code_uri: https://github.com/hi5dev/dhtml
37
+ changelog_uri: https://github.com/hi5dev/dhtml/blob/base/CHANGELOG.md
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 2.4.0
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubygems_version: 3.2.16
54
+ signing_key:
55
+ specification_version: 4
56
+ summary: A fast, simple, and elegant DSL for generating HTML using Ruby. Also compatible
57
+ with Opal.
58
+ test_files: []