flame_channel_parser 4.1.1 → 4.2.0

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: 63ea2d0b36c71708aed053a7e899fe45a90144f09a76a539bfde0fa75cebdbba
4
- data.tar.gz: a28e90fce5c379defb431679b1593f5e9b1a02e1a69ac492b8312066bc1eb86e
3
+ metadata.gz: 2f724511488b65ce62f27bdd5196fb18b0ab00559f6f3355c4ab156e009d3ae0
4
+ data.tar.gz: d12b7ffcee90ce9dfca4f09177dc42fa9664dd38d98282a4ed60d040699538bc
5
5
  SHA512:
6
- metadata.gz: 7b6359fb57c03a67a048c2679efddff22d1ced66ec00bc93a34fc8a0965a17eb0af749baa3b66423542775e6442d1cf61d509f784c69b8ea46303acbea9cbb95
7
- data.tar.gz: caf1e909f3f2f8078218c230e6fc3f882fc2df70fb64b0f8f3e9ce8550314b67b12c401e68c4da541547af01b29e1b56aaef90e260c00f9397474554f42ccfc6
6
+ metadata.gz: 8cb8446d91eb42275d8c295d9f06596c99928886c8e2b53ac8382d6e3738a377c97e31547d022840b9868366c0e0a26b0047818f5e8bde23be47fc37e0533562
7
+ data.tar.gz: 3d6c07df92674dea3df971a8a18449ce48e6256ee9d2dad4e1d36be11618cb11caa228bb567c825fb95998aa2aa4ceba707c6285b0c526075b6295fff2b70fa2
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ # Until framecurve 2.2.4 is released
6
+ gem "framecurve", git: "https://github.com/guerilla-di/framecurve.git"
data/History.txt CHANGED
@@ -1,3 +1,11 @@
1
+ === 4.2.0 / 2026-10-02
2
+
3
+ * Make parsing, interpolation and Builder usable from within Ractors (Ruby 4.0+)
4
+ * Fix `FlameChannelParser.parse`, `XMLParser#parse` and the framecurve writers on Ruby 3+
5
+ (`Proc.new` without a block)
6
+ * Declare the dependencies on `matrix` and `rexml`, which are no longer default gems
7
+ * Require framecurve 2.2.4+
8
+
1
9
  === 4.1.0 / 2014-10-20
2
10
 
3
11
  * Adds `flame_channel_inspect` for examining Flame setups
@@ -4,12 +4,12 @@ Gem::Specification.new do |s|
4
4
  s.name = "flame_channel_parser"
5
5
  s.version = FlameChannelParser::VERSION
6
6
 
7
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
7
+ s.required_ruby_version = ">= 2.6"
8
8
  s.authors = ["Julik Tarkhanov"]
9
9
  s.date = Time.now.utc.strftime("%Y-%m-%d")
10
10
  s.description = "Reads and interpolates animation channels in IFFS setups"
11
11
  s.email = "me@julik.nl"
12
- s.executables = ["bake_flame_channel", "framecurve_from_flame", "framecurve_to_flame"]
12
+ s.executables = Dir["bin/*"].map { |f| File.basename(f) }
13
13
  s.extra_rdoc_files = [
14
14
  "README.md"
15
15
  ]
@@ -17,12 +17,12 @@ Gem::Specification.new do |s|
17
17
  s.homepage = "http://guerilla-di.org/flame-channel-parser/"
18
18
  s.licenses = ["MIT"]
19
19
  s.require_paths = ["lib"]
20
- s.rubygems_version = "1.8.11"
21
20
  s.summary = "A parser/interpolator for Flame/Smoke animation curves"
22
21
 
23
- s.specification_version = 3
24
22
  s.add_runtime_dependency("update_hints", ["~> 1.0"])
25
- s.add_runtime_dependency("framecurve", ["~> 2"])
23
+ s.add_runtime_dependency("framecurve", ["~> 2", ">= 2.2.4"])
24
+ s.add_runtime_dependency("matrix")
25
+ s.add_runtime_dependency("rexml")
26
26
  s.add_development_dependency("rake", [">= 0"])
27
27
  s.add_development_dependency("cli_test", ["~> 1.0"])
28
28
  s.add_development_dependency("test-unit")
data/lib/builder.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # shareable_constant_value: literal
1
2
  # A Builder-like class for exporting Flame setups
2
3
  class FlameChannelParser::Builder #< BasicObject
3
4
  INDENT = "\t"
@@ -67,8 +68,8 @@ class FlameChannelParser::Builder #< BasicObject
67
68
  end
68
69
 
69
70
  def __camelize(s)
70
- @@camelizations ||= {}
71
- @@camelizations[s] ||= s.to_s.gsub(/(^|_)(.)/) { $2.upcase }
71
+ @camelizations ||= {}
72
+ @camelizations[s] ||= s.to_s.gsub(/(^|_)(.)/) { $2.upcase }
72
73
  end
73
74
 
74
75
  def __flameize(v)
data/lib/extractor.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # shareable_constant_value: literal
1
2
  # Extracts and bakes a specific animation channel to a given buffer, one string per frame
2
3
  class FlameChannelParser::Extractor
3
4
 
@@ -27,7 +28,7 @@ class FlameChannelParser::Extractor
27
28
  end
28
29
 
29
30
  def extract(path, options)
30
- options = DEFAULTS.dup.merge(options)
31
+ options = DEFAULTS.merge(:destination => $stdout).merge(options)
31
32
  File.open(path) do |f|
32
33
 
33
34
  # Then parse
@@ -47,7 +48,6 @@ class FlameChannelParser::Extractor
47
48
 
48
49
  DEFAULT_START_FRAME = 1
49
50
  DEFAULTS = {
50
- :destination => $stdout,
51
51
  :start_frame => nil,
52
52
  :end_frame => nil,
53
53
  :channel => DEFAULT_CHANNEL_TO_EXTRACT,
@@ -1,3 +1,3 @@
1
1
  module FlameChannelParser
2
- VERSION = '4.1.1'
2
+ VERSION = '4.2.0'
3
3
  end
@@ -7,13 +7,8 @@ module FlameChannelParser
7
7
  # Parse a Flame setup into an array of Channel objects.
8
8
  # If a block is given to the method it will yield Channel
9
9
  # objects one by one instead of accumulating them into an array (useful for big setups)
10
- def self.parse(io)
11
- c = get_parser_class(io)
12
- if block_given?
13
- c.new.parse(io, &Proc.new)
14
- else
15
- c.new.parse(io)
16
- end
10
+ def self.parse(io, &blk)
11
+ get_parser_class(io).new.parse(io, &blk)
17
12
  end
18
13
 
19
14
  # Parse a Flame setup at passed path. Will return the channels instead of yielding them
@@ -12,14 +12,16 @@ class FlameChannelParser::FramecurveWriters::Base
12
12
 
13
13
  end
14
14
 
15
+ # Kept as a frozen array in a class-level ivar so that it can be read from non-main Ractors
15
16
  def self.inherited(by)
16
- @@writers ||= []
17
- @@writers.push(by)
17
+ writers = FlameChannelParser::FramecurveWriters::Base.instance_variable_get(:@writers) || []
18
+ FlameChannelParser::FramecurveWriters::Base.instance_variable_set(:@writers, (writers + [by]).freeze)
19
+ super
18
20
  end
19
21
 
20
22
  # Yields each defined writer class to the block
21
- def self.with_each_writer
22
- @@writers.each(&Proc.new)
23
+ def self.with_each_writer(&blk)
24
+ FlameChannelParser::FramecurveWriters::Base.instance_variable_get(:@writers).each(&blk)
23
25
  end
24
26
 
25
27
  # Should return the desired extension for the exported file
@@ -1,8 +1,9 @@
1
+ # shareable_constant_value: literal
1
2
  # Writes out a Batch timewarp node setup
2
3
  class FlameChannelParser::FramecurveWriters::BatchTimewarp < FlameChannelParser::FramecurveWriters::SoftfxTimewarp
3
4
 
4
- TEMPLATE = File.dirname(__FILE__) + "/templates/BatchTW.xml"
5
- TEMPLATE_KEY = File.dirname(__FILE__) + "/templates/key.xml"
5
+ TEMPLATE = (File.dirname(__FILE__) + "/templates/BatchTW.xml").freeze
6
+ TEMPLATE_KEY = (File.dirname(__FILE__) + "/templates/key.xml").freeze
6
7
 
7
8
  def self.extension
8
9
  '.timewarp_node'
@@ -1,7 +1,8 @@
1
+ # shareable_constant_value: literal
1
2
  # Writes out a framecurve setup
2
3
  class FlameChannelParser::FramecurveWriters::Kronos < FlameChannelParser::FramecurveWriters::SoftfxTimewarp
3
- TOKEN = Regexp.new('__INSERT_FRAME_ANIM__')
4
- TEMPLATE = File.dirname(__FILE__) + "/templates/SampleKronos.F_Kronos"
4
+ TOKEN = Regexp.new('__INSERT_FRAME_ANIM__').freeze
5
+ TEMPLATE = (File.dirname(__FILE__) + "/templates/SampleKronos.F_Kronos").freeze
5
6
 
6
7
  def self.extension
7
8
  '.F_Kronos'
@@ -1,7 +1,8 @@
1
+ # shareable_constant_value: literal
1
2
  # Writes out a framecurve setup
2
3
  class FlameChannelParser::FramecurveWriters::SoftfxTimewarp < FlameChannelParser::FramecurveWriters::Base
3
4
  DATETIME_FORMAT = '%a %b %d %H:%M:%S %Y'
4
- TIME = Time.local(2011,12,28,14,50,05)
5
+ TIME = Time.local(2011,12,28,14,50,05).freeze
5
6
 
6
7
  def self.extension
7
8
  '.timewarp'
data/lib/interpolator.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # shareable_constant_value: literal
1
2
  require File.expand_path(File.dirname(__FILE__)) + "/segments"
2
3
 
3
4
  # Used to sample Flame animation curves. Pass a Channel
data/lib/parser.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # shareable_constant_value: literal
1
2
  module FlameChannelParser
2
3
  # Comnplete parser class for all Flame/Smoke versions
3
4
  class Parser
data/lib/segments.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # shareable_constant_value: literal
1
2
  require "matrix"
2
3
 
3
4
  module FlameChannelParser::Segments #:nodoc:
@@ -52,7 +53,7 @@ module FlameChannelParser::Segments #:nodoc:
52
53
  [-2, 3, 0, 0],
53
54
  [1, -2, 1, 0],
54
55
  [1, -1, 0, 0]
55
- ].transpose
56
+ ].transpose.freeze
56
57
 
57
58
  def initialize(from_frame, to_frame, value1, value2, tangent1, tangent2)
58
59
 
@@ -1,3 +1,4 @@
1
+ # shareable_constant_value: literal
1
2
  require "framecurve"
2
3
 
3
4
  module FlameChannelParser
data/lib/xml_parser.rb CHANGED
@@ -73,17 +73,13 @@ class FlameChannelParser::XMLParser < FlameChannelParser::Parser
73
73
 
74
74
  # Parses the setup passed in the IO. If a block is given to the method it will yield Channel
75
75
  # objects one by one instead of accumulating them into an array (useful for big setups)
76
- def parse(io)
76
+ def parse(io, &blk)
77
77
  # Ok this is gothic BUT needed. What we do is we transform the XML setup into the OLD
78
78
  # setup format, after which we run it through the OLD parser all the same.
79
79
  # I am almost sure that ADSK does the same.
80
80
  t = Tempfile.new("bx")
81
81
  REXML::Document.parse_stream(io, XMLToSetup.new(t))
82
82
  t.rewind
83
- if block_given?
84
- super(t, &Proc.new)
85
- else
86
- super(t)
87
- end
83
+ super(t, &blk)
88
84
  end
89
85
  end
@@ -0,0 +1,30 @@
1
+ require "helper"
2
+
3
+ class TestRactor < Test::Unit::TestCase
4
+ def test_parses_interpolates_and_builds_inside_a_ractor
5
+ omit "Needs Ruby 4.0+ Ractors" unless defined?(Ractor) && Ractor.method_defined?(:value)
6
+
7
+ path = File.dirname(__FILE__) + "/snaps/FLEM_curves_example.action"
8
+ expected = run_conversion(path)
9
+
10
+ experimental_warnings, Warning[:experimental] = Warning[:experimental], false
11
+ begin
12
+ from_ractor = Ractor.new(path) { |p| TestRactor.new("ractor").run_conversion(p) }.value
13
+ assert_equal expected, from_ractor
14
+ ensure
15
+ Warning[:experimental] = experimental_warnings
16
+ end
17
+ end
18
+
19
+ def run_conversion(path)
20
+ channels = File.open(path, "rb") { |f| FlameChannelParser.parse(f) }
21
+ values = channels.reject(&:empty?).map do |channel|
22
+ interpolator = FlameChannelParser::Interpolator.new(channel)
23
+ (1..20).map { |frame| interpolator.sample_at(frame) }
24
+ end
25
+
26
+ out = StringIO.new
27
+ FlameChannelParser::Builder.new(out).write_block!("Channel", "foo") { |b| b.some_value 1.0 }
28
+ [values, out.string]
29
+ end
30
+ end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flame_channel_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.1
4
+ version: 4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julik Tarkhanov
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2018-12-19 00:00:00.000000000 Z
10
+ date: 2026-10-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: update_hints
@@ -31,6 +30,9 @@ dependencies:
31
30
  - - "~>"
32
31
  - !ruby/object:Gem::Version
33
32
  version: '2'
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 2.2.4
34
36
  type: :runtime
35
37
  prerelease: false
36
38
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,6 +40,37 @@ dependencies:
38
40
  - - "~>"
39
41
  - !ruby/object:Gem::Version
40
42
  version: '2'
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: 2.2.4
46
+ - !ruby/object:Gem::Dependency
47
+ name: matrix
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ type: :runtime
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ - !ruby/object:Gem::Dependency
61
+ name: rexml
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
41
74
  - !ruby/object:Gem::Dependency
42
75
  name: rake
43
76
  requirement: !ruby/object:Gem::Requirement
@@ -84,6 +117,7 @@ description: Reads and interpolates animation channels in IFFS setups
84
117
  email: me@julik.nl
85
118
  executables:
86
119
  - bake_flame_channel
120
+ - flame_channel_inspect
87
121
  - framecurve_from_flame
88
122
  - framecurve_to_flame
89
123
  extensions: []
@@ -163,6 +197,7 @@ files:
163
197
  - test/test_interpolator.rb
164
198
  - test/test_key.rb
165
199
  - test/test_kronos_timewarp_writer.rb
200
+ - test/test_ractor.rb
166
201
  - test/test_segments.rb
167
202
  - test/test_softfx_timewarp_writer.rb
168
203
  - test/test_timewarp_extractor.rb
@@ -182,7 +217,6 @@ homepage: http://guerilla-di.org/flame-channel-parser/
182
217
  licenses:
183
218
  - MIT
184
219
  metadata: {}
185
- post_install_message:
186
220
  rdoc_options: []
187
221
  require_paths:
188
222
  - lib
@@ -190,16 +224,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
190
224
  requirements:
191
225
  - - ">="
192
226
  - !ruby/object:Gem::Version
193
- version: '0'
227
+ version: '2.6'
194
228
  required_rubygems_version: !ruby/object:Gem::Requirement
195
229
  requirements:
196
230
  - - ">="
197
231
  - !ruby/object:Gem::Version
198
232
  version: '0'
199
233
  requirements: []
200
- rubyforge_project:
201
- rubygems_version: 2.7.6
202
- signing_key:
203
- specification_version: 3
234
+ rubygems_version: 4.0.3
235
+ specification_version: 4
204
236
  summary: A parser/interpolator for Flame/Smoke animation curves
205
237
  test_files: []