tina4ruby 3.11.8 → 3.11.9

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: 31718e6c17d72a3cae997da84d429a6bd97ea06eaaac21a60caeab2093d76712
4
- data.tar.gz: 1ff81e9f43aa3928bfc000e8e953502fc249f3aea0df16631a032149885d34e9
3
+ metadata.gz: df3e8a44d54b3dc392460aeef376b7085198b2804b0e2457e5b90acb686369ed
4
+ data.tar.gz: 7005aeee87cedaa5f186102bb41ce3fcd70d3848371355e3c0cbbf85ae76b0a7
5
5
  SHA512:
6
- metadata.gz: 0afb11536a1268f526971fe554abf5ef356405a961aa6ebdf1da944ac49f4ac1e6cce62c5aa5f30017ab1194a1329124c73ef2fac08e169b0cf14d9544cd9c69
7
- data.tar.gz: a5ac12e19121a8f2ec6362c179951a722c224e94367f05a1b75e817ef8ff92262988f5c92c3cb2bc6fd46e6da08aa3aee0590c265ceb0430d8239d7b98700c25
6
+ metadata.gz: a369e8dde59dad51bade987d67477eb270a879bf0edd6d4ad4e0bce752c5a471cd89806b8a692b3eec9608eb765ceab38fa10fd52b41422bf628414302f66dbb
7
+ data.tar.gz: f239c1cae63624e1e399d7e9e6a804880273c4c4ef702ae9536d3adf0702e18edcdf26d8494dce5072197b8233c8a96e2ea0638605118986a4aac49d2936c4c8
data/lib/tina4/dev.rb CHANGED
@@ -3,7 +3,6 @@
3
3
  # Convenience require for all development/optional tools.
4
4
  # Usage: require "tina4/dev"
5
5
 
6
- require_relative "dev_reload"
7
6
  require_relative "scss_compiler"
8
7
  require_relative "testing"
9
8
  require_relative "graphql"
data/lib/tina4/router.rb CHANGED
@@ -109,8 +109,9 @@ module Tina4
109
109
  @param_names << { name: name.to_sym, type: "path" }
110
110
  '(.+)'
111
111
  elsif part == "*"
112
- # Bare catch-all wildcard: captures everything after (unnamed)
113
- @param_names << { name: :splat, type: "path" }
112
+ # Bare catch-all wildcard: captures everything after under the "*" key
113
+ # to match Python/PHP/Node parity (docs say `request.params["*"]`).
114
+ @param_names << { name: :"*", type: "path" }
114
115
  '(.+)'
115
116
  elsif part =~ /\A\{(\w+)(?::(\w+))?\}\z/
116
117
  # Tina4/Python-style brace params: {id} or {id:int}
data/lib/tina4/seeder.rb CHANGED
@@ -526,8 +526,12 @@ module Tina4
526
526
 
527
527
  # Run all seed files in the given folder.
528
528
  #
529
+ # Parity: Python/PHP/Node use `seed(n)` to set the PRNG seed on FakeData.
530
+ # Ruby's FakeData.seed already does that — this folder-runner is named
531
+ # differently to avoid the collision.
532
+ #
529
533
  # @param seed_folder [String] path to seed files (default: "seeds")
530
- def self.seed(seed_folder: "seeds", clear: false)
534
+ def self.run_seeds(seed_folder: "seeds", clear: false)
531
535
  seed_dir(seed_folder: seed_folder, clear: clear)
532
536
  end
533
537
 
data/lib/tina4/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tina4
4
- VERSION = "3.11.8"
4
+ VERSION = "3.11.9"
5
5
  end
@@ -2,6 +2,7 @@
2
2
  require "socket"
3
3
  require "digest"
4
4
  require "base64"
5
+ require "json"
5
6
  require "set"
6
7
 
7
8
  module Tina4
@@ -117,6 +118,14 @@ module Tina4
117
118
  (@rooms[room_name] || Set.new).size
118
119
  end
119
120
 
121
+ # Return list of room names a given client/connection id belongs to.
122
+ # Matches PHP Tina4\WebSocket::getClientRooms($clientId).
123
+ def get_client_rooms(client_id)
124
+ @rooms.each_with_object([]) do |(name, members), acc|
125
+ acc << name if members.include?(client_id)
126
+ end
127
+ end
128
+
120
129
  def get_room_connections(room_name)
121
130
  ids = @rooms[room_name] || Set.new
122
131
  ids.filter_map { |id| @connections[id] }
@@ -278,6 +287,12 @@ module Tina4
278
287
 
279
288
  alias_method :send_text, :send
280
289
 
290
+ # Serialize a Hash/Array (or any JSON-coercible value) and send as a text frame.
291
+ # Matches Python/PHP send_json.
292
+ def send_json(data)
293
+ send_text(JSON.generate(data))
294
+ end
295
+
281
296
  def send_pong(data)
282
297
  frame = build_frame(0xA, data || "")
283
298
  @socket.write(frame)
data/lib/tina4.rb CHANGED
@@ -100,7 +100,6 @@ module Tina4
100
100
  autoload :WebSocketConnection, File.expand_path("tina4/websocket", __dir__)
101
101
  autoload :Testing, File.expand_path("tina4/testing", __dir__)
102
102
  autoload :ScssCompiler, File.expand_path("tina4/scss_compiler", __dir__)
103
- autoload :DevReload, File.expand_path("tina4/dev_reload", __dir__)
104
103
  autoload :FakeData, File.expand_path("tina4/seeder", __dir__)
105
104
  autoload :WSDL, File.expand_path("tina4/wsdl", __dir__)
106
105
  BANNER = <<~'BANNER'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tina4ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.11.8
4
+ version: 3.11.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tina4 Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-04-14 00:00:00.000000000 Z
11
+ date: 2026-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -294,7 +294,6 @@ files:
294
294
  - lib/tina4/dev.rb
295
295
  - lib/tina4/dev_admin.rb
296
296
  - lib/tina4/dev_mailbox.rb
297
- - lib/tina4/dev_reload.rb
298
297
  - lib/tina4/drivers/firebird_driver.rb
299
298
  - lib/tina4/drivers/mongodb_driver.rb
300
299
  - lib/tina4/drivers/mssql_driver.rb
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tina4
4
- module DevReload
5
- WATCH_EXTENSIONS = %w[.rb .twig .html .erb .scss .css .js].freeze
6
- WATCH_DIRS = %w[src routes lib templates public].freeze
7
- IGNORE_DIRS = %w[.git node_modules vendor logs sessions .queue .keys].freeze
8
-
9
- class << self
10
- def start(root_dir: Dir.pwd, &on_change)
11
- require "listen"
12
-
13
- dirs = WATCH_DIRS
14
- .map { |d| File.join(root_dir, d) }
15
- .select { |d| Dir.exist?(d) }
16
-
17
- # Also watch root for .rb files
18
- dirs << root_dir
19
-
20
- Tina4::Log.info("Dev reload watching: #{dirs.join(', ')}")
21
-
22
- @listener = Listen.to(*dirs, only: /\.(#{WATCH_EXTENSIONS.map { |e| e.delete('.') }.join('|')})$/, ignore: build_ignore_regex) do |modified, added, removed|
23
- changes = { modified: modified, added: added, removed: removed }
24
- all_files = modified + added + removed
25
- next if all_files.empty?
26
-
27
- Tina4::Log.info("File changes detected:")
28
- modified.each { |f| Tina4::Log.debug(" Modified: #{f}") }
29
- added.each { |f| Tina4::Log.debug(" Added: #{f}") }
30
- removed.each { |f| Tina4::Log.debug(" Removed: #{f}") }
31
-
32
- # Reload Ruby files
33
- modified.select { |f| f.end_with?(".rb") }.each do |file|
34
- begin
35
- load file
36
- Tina4::Log.info("Reloaded: #{file}")
37
- rescue => e
38
- Tina4::Log.error("Reload failed: #{file} - #{e.message}")
39
- end
40
- end
41
-
42
- # Recompile SCSS
43
- scss_changes = all_files.select { |f| f.end_with?(".scss") }
44
- if scss_changes.any?
45
- Tina4::ScssCompiler.compile_all(root_dir)
46
- end
47
-
48
- on_change&.call(changes)
49
- end
50
-
51
- @listener.start
52
- Tina4::Log.info("Dev reload started")
53
- end
54
-
55
- def stop
56
- @listener&.stop
57
- Tina4::Log.info("Dev reload stopped")
58
- end
59
-
60
- private
61
-
62
- def build_ignore_regex
63
- pattern = IGNORE_DIRS.map { |d| Regexp.escape(d) }.join("|")
64
- /#{pattern}/
65
- end
66
- end
67
- end
68
- end