phlex 2.0.0.beta2 → 2.0.0.rc2
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 +4 -4
- data/README.md +8 -11
- data/lib/phlex/csv.rb +4 -11
- data/lib/phlex/error.rb +1 -0
- data/lib/phlex/fifo.rb +11 -3
- data/lib/phlex/fifo_cache_store.rb +49 -0
- data/lib/phlex/helpers.rb +2 -2
- data/lib/phlex/html/standard_elements.rb +932 -722
- data/lib/phlex/html/void_elements.rb +93 -66
- data/lib/phlex/html.rb +4 -10
- data/lib/phlex/kit.rb +39 -22
- data/lib/phlex/null_cache_store.rb +9 -0
- data/lib/phlex/sgml/elements.rb +112 -0
- data/lib/phlex/sgml/state.rb +118 -0
- data/lib/phlex/sgml.rb +326 -305
- data/lib/phlex/svg/standard_elements.rb +417 -449
- data/lib/phlex/svg.rb +0 -3
- data/lib/phlex/{black_hole.rb → vanish.rb} +1 -1
- data/lib/phlex/version.rb +1 -1
- data/lib/phlex.rb +17 -9
- metadata +9 -12
- data/lib/phlex/context.rb +0 -59
- data/lib/phlex/deferred_render.rb +0 -29
- data/lib/phlex/element_clobbering_guard.rb +0 -18
- data/lib/phlex/elements.rb +0 -172
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35bbefcf5b9f49f4082f7b92e949e0dd5c13bb39fb65d435563ce6d93b8b002e
|
4
|
+
data.tar.gz: b5455009b59c52b2dc18364adcb4907dd17295b2fac82c42ee76dbe98106889c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f9a7b014d2821888a97afe5d822dcc04acede2623cfd2ac84d2ee9eb68aff30cf8e571b81d3c54cf3b344d06ea96de6f95b9a37213d5bb5acf805393150dccb
|
7
|
+
data.tar.gz: 1e940060016ea5d3ecf707bf33d0ad70ebb43e576825cb477be4a091eeec00787530cf8fb315e399196ae81c3cc88d8059e38ef6eeaeb816843f576a6124dc63
|
data/README.md
CHANGED
@@ -2,21 +2,18 @@
|
|
2
2
|
|
3
3
|
Phlex lets you compose web views in pure Ruby.
|
4
4
|
|
5
|
-
- [
|
6
|
-
- [
|
5
|
+
- [v1 Stable Docs](https://www.phlex.fun)
|
6
|
+
- [v2 Beta Docs](https://beta.phlex.fun)
|
7
7
|
|
8
|
-
## Maintenance
|
8
|
+
## Versioning and Maintenance
|
9
9
|
|
10
|
-
|
10
|
+
Phlex does not follow semantic versioning (SemVer). Instead, we follow [BreakVer](https://www.taoensso.com/break-versioning).
|
11
11
|
|
12
|
-
|
13
|
-
- We may choose to fix bugs by releasing a new minor version rather than patching the existing minor version
|
14
|
-
- Major versions will stop receiving bug fixes one year after the next major version is released
|
12
|
+
When a security issue is brought to our attention, we aim to release patches as soon as possible. We aim to patch with a new `non-breaking` version:
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
-
|
19
|
-
- Additionally, the latest minor version of the latest major version will receive security patches, even if that version is over a year old.
|
14
|
+
- every `minor` version that was released in the last year;
|
15
|
+
- the latest `minor` version of the latest two `major` versions, even if over a year old; and
|
16
|
+
- the `main` branch in GitHub.
|
20
17
|
|
21
18
|
## Prior Art 🎨
|
22
19
|
|
data/lib/phlex/csv.rb
CHANGED
@@ -9,13 +9,12 @@ class Phlex::CSV
|
|
9
9
|
@_headers = []
|
10
10
|
@_current_row = []
|
11
11
|
@_current_column_index = 0
|
12
|
-
@_view_context = nil
|
13
12
|
@_first = true
|
14
13
|
end
|
15
14
|
|
16
15
|
attr_reader :collection
|
17
16
|
|
18
|
-
def call(buffer = +"",
|
17
|
+
def call(buffer = +"", context: nil)
|
19
18
|
unless escape_csv_injection? == true || escape_csv_injection? == false
|
20
19
|
raise <<~MESSAGE
|
21
20
|
You need to define escape_csv_injection? in #{self.class.name}, returning either `true` or `false`.
|
@@ -40,8 +39,6 @@ class Phlex::CSV
|
|
40
39
|
MESSAGE
|
41
40
|
end
|
42
41
|
|
43
|
-
@_view_context = view_context
|
44
|
-
|
45
42
|
each_item do |record|
|
46
43
|
yielder(record) do |*args, **kwargs|
|
47
44
|
view_template(*args, **kwargs)
|
@@ -73,12 +70,12 @@ class Phlex::CSV
|
|
73
70
|
|
74
71
|
def column(header = nil, value)
|
75
72
|
if @_first
|
76
|
-
@_headers <<
|
73
|
+
@_headers << __escape__(header)
|
77
74
|
elsif header != @_headers[@_current_column_index]
|
78
75
|
raise "Inconsistent header."
|
79
76
|
end
|
80
77
|
|
81
|
-
@_current_row <<
|
78
|
+
@_current_row << __escape__(value)
|
82
79
|
@_current_column_index += 1
|
83
80
|
end
|
84
81
|
|
@@ -105,11 +102,7 @@ class Phlex::CSV
|
|
105
102
|
nil
|
106
103
|
end
|
107
104
|
|
108
|
-
def
|
109
|
-
@_view_context
|
110
|
-
end
|
111
|
-
|
112
|
-
def escape(value)
|
105
|
+
def __escape__(value)
|
113
106
|
value = trim_whitespace? ? value.to_s.strip : value.to_s
|
114
107
|
first_char = value[0]
|
115
108
|
last_char = value[-1]
|
data/lib/phlex/error.rb
CHANGED
data/lib/phlex/fifo.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# @api private
|
3
4
|
class Phlex::FIFO
|
4
5
|
def initialize(max_bytesize: 2_000, max_value_bytesize: 2_000)
|
5
6
|
@store = {}
|
6
7
|
@max_bytesize = max_bytesize
|
7
8
|
@max_value_bytesize = max_value_bytesize
|
8
9
|
@bytesize = 0
|
9
|
-
@mutex =
|
10
|
+
@mutex = Monitor.new
|
10
11
|
end
|
11
12
|
|
12
13
|
attr_reader :bytesize, :max_bytesize
|
@@ -19,7 +20,7 @@ class Phlex::FIFO
|
|
19
20
|
|
20
21
|
def [](key)
|
21
22
|
k, v = @store[key.hash]
|
22
|
-
v if k
|
23
|
+
v if k.eql?(key)
|
23
24
|
end
|
24
25
|
|
25
26
|
def []=(key, value)
|
@@ -31,7 +32,7 @@ class Phlex::FIFO
|
|
31
32
|
# Check the key definitely doesn't exist now we have the lock
|
32
33
|
return if @store[digest]
|
33
34
|
|
34
|
-
@store[digest] = [key, value]
|
35
|
+
@store[digest] = [key, value].freeze
|
35
36
|
@bytesize += value.bytesize
|
36
37
|
|
37
38
|
while @bytesize > @max_bytesize
|
@@ -44,4 +45,11 @@ class Phlex::FIFO
|
|
44
45
|
def size
|
45
46
|
@store.size
|
46
47
|
end
|
48
|
+
|
49
|
+
def clear
|
50
|
+
@mutex.synchronize do
|
51
|
+
@store.clear
|
52
|
+
@bytesize = 0
|
53
|
+
end
|
54
|
+
end
|
47
55
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# An extremely fast in-memory cache store that evicts keys on a first-in-first-out basis.
|
4
|
+
class Phlex::FIFOCacheStore
|
5
|
+
def initialize(max_bytesize: 2 ** 20)
|
6
|
+
@fifo = Phlex::FIFO.new(
|
7
|
+
max_bytesize:,
|
8
|
+
max_value_bytesize: max_bytesize
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
def fetch(key)
|
13
|
+
fifo = @fifo
|
14
|
+
key = map_key(key)
|
15
|
+
|
16
|
+
if (result = fifo[key])
|
17
|
+
JSON.parse(result)
|
18
|
+
else
|
19
|
+
result = yield
|
20
|
+
|
21
|
+
fifo[key] = JSON.fast_generate(result)
|
22
|
+
|
23
|
+
result
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def clear
|
28
|
+
@fifo.clear
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def map_key(value)
|
34
|
+
case value
|
35
|
+
when Array
|
36
|
+
value.map { |it| map_key(it) }
|
37
|
+
when Hash
|
38
|
+
value.to_h { |k, v| [map_key(k), map_key(v)].freeze }
|
39
|
+
when String, Symbol, Integer, Float, Time, true, false, nil
|
40
|
+
value
|
41
|
+
else
|
42
|
+
if value.respond_to?(:cache_key)
|
43
|
+
map_key(value.cache_key)
|
44
|
+
else
|
45
|
+
raise ArgumentError.new("Invalid cache key: #{value.class}")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/phlex/helpers.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# @api private
|
3
4
|
module Phlex::Helpers
|
4
5
|
private
|
5
6
|
|
6
|
-
# @return [Hash]
|
7
7
|
def mix(*args)
|
8
8
|
args.each_with_object({}) do |object, result|
|
9
9
|
result.merge!(object) do |_key, old, new|
|
10
|
-
case [old, new]
|
10
|
+
case [old, new].freeze
|
11
11
|
in [Array, Array] | [Set, Set]
|
12
12
|
old + new
|
13
13
|
in [Array, Set]
|