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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 46379514e0705957409d87f74668c2f012e03d5a48fe14f41b4100172b0672c0
4
- data.tar.gz: c4ddfa6b1c8eabfc66534abb52ca6fbe543db4d41ddf529b50fc8d0cd3393f63
3
+ metadata.gz: 35bbefcf5b9f49f4082f7b92e949e0dd5c13bb39fb65d435563ce6d93b8b002e
4
+ data.tar.gz: b5455009b59c52b2dc18364adcb4907dd17295b2fac82c42ee76dbe98106889c
5
5
  SHA512:
6
- metadata.gz: 9aa416b84741e68ee9429b11c2cd2fc9dc2986ae4cc15eefff126b5f53e177aad9129cdc1349e827e54aef5c5a26f08f12017e3d200b98c5930130c4c13883fc
7
- data.tar.gz: fc0cd1de6ab7d6a6f1b76447fad84a263c9cda0ce7e0a9f4313b579c38b7246a4704a02fd183bc0b29bdc171f374070aed0e0c2933f6e06388e58696f58f2565
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
- - [1.0 Stable Docs](https://www.phlex.fun)
6
- - [2.0 Beta Docs](https://beta.phlex.fun)
5
+ - [v1 Stable Docs](https://www.phlex.fun)
6
+ - [v2 Beta Docs](https://beta.phlex.fun)
7
7
 
8
- ## Maintenance schedule
8
+ ## Versioning and Maintenance
9
9
 
10
- ### Bug fixes
10
+ Phlex does not follow semantic versioning (SemVer). Instead, we follow [BreakVer](https://www.taoensso.com/break-versioning).
11
11
 
12
- - Only the latest minor version of each major version will receive bug fixes
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
- ### Security patches
17
-
18
- - When a security issue is brought to our attention, we aim to release patches for any minor version that was released in the last year.
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 = +"", view_context: nil)
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 << escape(header)
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 << escape(value)
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 helpers
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
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # @api private
3
4
  module Phlex::Error
4
5
  end
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 = Mutex.new
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 == key
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]