tickly 2.1.6 → 2.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
- SHA1:
3
- metadata.gz: d5507beab7129bc0fab4875bad56c60d27da4613
4
- data.tar.gz: 3335803e4bf7621e151838262f4b096bced5bf44
2
+ SHA256:
3
+ metadata.gz: 84fc69dbbbcec1f30a09e9bfe2e628739873a1943f8ed083ee2ea7b5ee3f1402
4
+ data.tar.gz: 8b73945da9ec7a8bff04c4cea00299fc7de5b15d5b418b9043300efec20ca41d
5
5
  SHA512:
6
- metadata.gz: d343db5ed8d576c3c4220724864d908a8ce45f1db9370773563d432108ed251bd600a8d6d7506863a78e4665483aa890b8e6c72e6517c344ff2ac501113ead0c
7
- data.tar.gz: 23cb0139524770b959c259f4e19f2cc5d78c17657507037e93b92c1a1d80fc878a864e73f80d1b21b7002357e64d7d68afe50caeb4d0dbcadcb68d616f1711a5
6
+ metadata.gz: bb277be3b1a06de64d144f0fbf745bf9eee3b74f8623ef09005f15712bef540b3dbdaa20d69da31efa9ca22098e0418e68b8370c7b46a29ba57c4ca43b35ea7e
7
+ data.tar.gz: e3ffde08e7ec5ef7b4e9424cb247b2d85a29246d0163e3257c54ac824aca765fb9d93218fe53a97f14380662fd835382cf9875d12c6404f829c52884c19006e8
data/.gitignore ADDED
@@ -0,0 +1,52 @@
1
+ Gemfile.lock
2
+ profiler_calls.html
3
+
4
+ # rcov generated
5
+ coverage
6
+ coverage.data
7
+
8
+ # rdoc generated
9
+ rdoc
10
+
11
+ # yard generated
12
+ doc
13
+ .yardoc
14
+
15
+ # bundler
16
+ .bundle
17
+
18
+ # jeweler generated
19
+ pkg
20
+
21
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
22
+ #
23
+ # * Create a file at ~/.gitignore
24
+ # * Include files you want ignored
25
+ # * Run: git config --global core.excludesfile ~/.gitignore
26
+ #
27
+ # After doing this, these files will be ignored in all your git projects,
28
+ # saving you from having to 'pollute' every project you touch with them
29
+ #
30
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
31
+ #
32
+ # For MacOS:
33
+ #
34
+ #.DS_Store
35
+
36
+ # For TextMate
37
+ #*.tmproj
38
+ #tmtags
39
+
40
+ # For emacs:
41
+ #*~
42
+ #\#*
43
+ #.\#*
44
+
45
+ # For vim:
46
+ #*.swp
47
+
48
+ # For redcar:
49
+ #.redcar
50
+
51
+ # For rubinius:
52
+ #*.rbc
data/.travis.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  rvm:
2
- - 1.8.7
3
- - 1.9.2
4
2
  - 1.9.3
5
- - 2.0.0-p247
3
+ - 2.5.0
4
+ cache: bundler
5
+ sudo: false
data/Gemfile CHANGED
@@ -1,11 +1,3 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- # Add dependencies to develop your gem here.
4
- # Include everything needed to run rake, tests, features, etc.
5
- group :development do
6
- gem "rake"
7
- gem "rdoc", "~> 3.12"
8
- gem "jeweler", "~> 1.8.7"
9
- # Use the older ruby-prof that still supports 1.8.7
10
- gem "ruby-prof", '0.13.0'
11
- end
3
+ gemspec
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Build Status](https://travis-ci.org/julik/tickly.svg?branch=master)](https://travis-ci.org/julik/tickly)
2
+
1
3
  A highly simplistic TCL parser and evaluator (primarily designed for parsing Nuke scripts).
2
4
  It transforms the passed Nuke scripts into a TCL AST.
3
5
  It also supports some cheap tricks to discard the nodes you are not interested in, since Nuke
@@ -64,10 +66,10 @@ and memory.
64
66
  To match nodes you create Ruby classes matching the node classes by name. It doesn't matter if your
65
67
  custom node handler is inside a module since the processor will only use the last part of the name.
66
68
 
67
- For example, to capture every +SomeNode+ in your script:
69
+ For example, to capture every `Blur` node in your script:
68
70
 
69
71
  # Remember, only the last part of the class name matters
70
- class MyAwesomeDirtyScript::SomeNode
72
+ class MyAwesomeDirtyScript::Blur
71
73
  attr_reader :knobs
72
74
  def initialize(string_keyed_knobs_hash)
73
75
  @knobs = string_keyed_knobs_hash
@@ -83,10 +85,10 @@ For example, to capture every +SomeNode+ in your script:
83
85
  # Open the ginormous Nuke script
84
86
  file = File.open("/mnt/raid/nuke/scripts/HugeShot_123.nk")
85
87
 
86
- e.parse(file) do | every_some_node |
87
- # Everytime a SomeNode is found in the script it will be instantiated,
88
+ e.parse(file) do | blur_node |
89
+ # Everytime a Blur node is found in the script it will be instantiated,
88
90
  # and the knobs of the node will be passed to the constructor that you define
89
- x_position = every_some_node.knobs["x_pos"]
91
+ kernel_size = blur_node.knobs["radius"]
90
92
  ...
91
93
  end
92
94
 
@@ -99,11 +101,41 @@ nodes containing tracking data:
99
101
  parser.add_node_handler_class(PlanarTracker1_0)
100
102
  parser.add_node_handler_class(Tracker4)
101
103
 
104
+ Then you will need to handle switching between node types during parsing
105
+
106
+ e.parse(file) do | detected_node |
107
+ if detected_node.is_a?(Tracker3)
108
+ ...
109
+ else
110
+ ...
111
+ end
112
+ end
113
+
114
+ Node clones are not supported.
115
+
102
116
  ## Animation curves
103
117
 
104
- You can parse Nuke's animation curves using Tickly::Curve. This will give you a way to iterate over every defined keyframe.
118
+ You can parse Nuke's animation curves using `Tickly::Curve`. This will give you a way to iterate over every defined keyframe.
105
119
  This currently does not happen automatically for things passing through the parser.
106
120
 
121
+ ## Tip: Speeding up parsing
122
+
123
+ Normally, Tickly will accept strings and IO objects as sources. However if you want a little performance boost
124
+ when parsing actual _files_ (or long IO objects that can be prebuffered) you should use it together
125
+ with [bychar](http://rubygems.org/gems/bychar), version 3 or newer - like so:
126
+
127
+ p = Tickly::Parser.new
128
+ File.open("/mnt/raid/comps/s023_v23.nk", "r") do | f |
129
+ expressions = p.parse(Bychar.wrap(f))
130
+ ...
131
+ end
132
+
133
+ This way some of the IO will be prebuffered for you and give you improved reading performance when parsing.
134
+
135
+ Tracksperanto does the bychar wrapping thing automatically, so no need to worry about that.
136
+
137
+
138
+
107
139
  ## Contributing to tickly
108
140
 
109
141
  Just like tracksperanto Tickly no longer ships with test data in gem format (since the test data amounts to
data/Rakefile CHANGED
@@ -1,36 +1,5 @@
1
- # encoding: utf-8
2
-
3
- require 'rubygems'
4
- require 'bundler'
5
- require File.dirname(__FILE__) + "/lib/tickly"
6
-
7
- begin
8
- Bundler.setup(:default, :development)
9
- rescue Bundler::BundlerError => e
10
- $stderr.puts e.message
11
- $stderr.puts "Run `bundle install` to install missing gems"
12
- exit e.status_code
13
- end
14
- require 'rake'
15
-
16
- require 'jeweler'
17
- Jeweler::Tasks.new do |gem|
18
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
19
- gem.version = Tickly::VERSION
20
- gem.name = "tickly"
21
- gem.homepage = "http://github.com/julik/tickly"
22
- gem.license = "MIT"
23
- gem.summary = %Q{Assists in parsing Nuke scripts in TCL}
24
- gem.description = %Q{Parses the subset of the TCL grammar needed for Nuke scripts}
25
- gem.email = "me@julik.nl"
26
- gem.authors = ["Julik Tarkhanov"]
27
- # dependencies defined in Gemfile
28
-
29
- # Do not package test data
30
- gem.files.exclude "test/test-data/*.*"
31
- end
32
-
33
- Jeweler::RubygemsDotOrgTasks.new
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
34
3
 
35
4
  require 'rake/testtask'
36
5
  Rake::TestTask.new(:test) do |test|
@@ -39,10 +8,8 @@ Rake::TestTask.new(:test) do |test|
39
8
  test.verbose = true
40
9
  end
41
10
 
42
- task :default => :test
43
-
44
11
  require 'rdoc/task'
45
- Rake::RDocTask.new do |rdoc|
12
+ RDoc::Task.new do |rdoc|
46
13
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
47
14
 
48
15
  rdoc.rdoc_dir = 'rdoc'
@@ -51,20 +18,26 @@ Rake::RDocTask.new do |rdoc|
51
18
  rdoc.rdoc_files.include('lib/**/*.rb')
52
19
  end
53
20
 
54
- desc "Profiles the parser"
55
- task :profile do
56
- require 'ruby-prof'
57
- p = Tickly::NodeProcessor.new
58
- f = File.open(File.dirname(__FILE__) + "/test/test-data/huge_nuke_tcl.tcl")
21
+ desc "Benchmarks the parser"
22
+ task :bench do
23
+ require File.dirname(__FILE__) + "/lib/tickly"
24
+ require 'benchmark'
59
25
 
60
- RubyProf.start
61
- p.parse(f) {|_| }
62
- result = RubyProf.stop
26
+ class Tracker3
27
+ def initialize(n); end
28
+ end
63
29
 
64
- # Print a call graph
65
- File.open("profiler_calls.html", "w") do | f |
66
- RubyProf::GraphHtmlPrinter.new(result).print(f)
30
+ pe = Tickly::NodeProcessor.new
31
+ pe.add_node_handler_class(Tracker3)
32
+
33
+ HUGE_SCRIPT = File.open(File.dirname(__FILE__) + "/test/test-data/huge_nuke_tcl.tcl", "rb")
34
+ Benchmark.bm do | runner |
35
+ runner.report("Parsing a huge Nuke script:") do
36
+ counter = 0
37
+ pe.parse(HUGE_SCRIPT) { counter += 1 }
38
+ HUGE_SCRIPT.rewind
39
+ end
67
40
  end
68
- `open profiler_calls.html`
69
41
  end
70
42
 
43
+ task :default => [:test, :bench]
data/lib/tickly/curve.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # shareable_constant_value: literal
1
2
  module Tickly
2
3
  # A shorthand class for Nuke's animation curves.
3
4
  # Will convert a passed Curve expression into a set of values,
data/lib/tickly/parser.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # shareable_constant_value: literal
1
2
  require 'stringio'
2
3
 
3
4
  module Tickly
@@ -53,7 +54,7 @@ module Tickly
53
54
  private
54
55
 
55
56
  TERMINATORS = ["\n", ";"]
56
- ESC = 92.chr # Backslash (\)
57
+ ESC = 92.chr.freeze # Backslash (\)
57
58
  QUOTES = %w( " ' )
58
59
 
59
60
  # Package the expressions, stack and buffer.
@@ -0,0 +1,3 @@
1
+ module Tickly
2
+ VERSION = "2.2.0"
3
+ end
data/lib/tickly.rb CHANGED
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + "/tickly/parser"
2
2
  require File.dirname(__FILE__) + "/tickly/evaluator"
3
3
  require File.dirname(__FILE__) + "/tickly/curve"
4
4
  require File.dirname(__FILE__) + "/tickly/node_processor"
5
+ require File.dirname(__FILE__) + "/tickly/version"
5
6
 
6
7
  module Tickly
7
- VERSION = '2.1.6'
8
8
  end
@@ -3,19 +3,5 @@ require 'benchmark'
3
3
 
4
4
  class TestParserEvaluator < Test::Unit::TestCase
5
5
 
6
- class Tracker3
7
- def initialize(n); end
8
- end
9
-
10
- def test_parses_huge
11
- pe = Tickly::NodeProcessor.new
12
- pe.add_node_handler_class(Tracker3)
13
-
14
- Benchmark.bm do | runner |
15
- runner.report("Parsing a huge Nuke script:") do
16
- counter = 0
17
- pe.parse(HUGE_SCRIPT) { counter += 1 }
18
- end
19
- end
20
- end
6
+
21
7
  end
data/test/test_emitter.rb CHANGED
@@ -13,7 +13,7 @@ class TestEmitter < Test::Unit::TestCase
13
13
  assert_equal [:b, "2", "2"], se("2", "2")
14
14
  end
15
15
 
16
- def test_emitter_be
16
+ def test_emitter_be_with_subexpression
17
17
  assert_equal [:b, [:c,"2", "2"]], se(le("2", "2"))
18
18
  end
19
19
 
@@ -0,0 +1,31 @@
1
+ require 'helper'
2
+
3
+ class TestRactor < Test::Unit::TestCase
4
+ class Tracker4
5
+ attr_reader :knobs
6
+ def initialize(knobs)
7
+ @knobs = knobs
8
+ end
9
+ end
10
+
11
+ def test_parses_and_evaluates_inside_a_ractor
12
+ omit "Needs Ruby 4.0+ Ractors" unless defined?(Ractor) && Ractor.method_defined?(:value)
13
+
14
+ path = File.dirname(__FILE__) + "/test-data/nuke7_tracker_2tracks.nk"
15
+ experimental_warnings, Warning[:experimental] = Warning[:experimental], false
16
+ begin
17
+ names = Ractor.new(path) do |script_path|
18
+ pe = Tickly::NodeProcessor.new
19
+ pe.add_node_handler_class(TestRactor::Tracker4)
20
+ File.open(script_path, "rb") do |f|
21
+ nodes = []
22
+ pe.parse(f) { |node| nodes << node.knobs["name"] }
23
+ nodes
24
+ end
25
+ end.value
26
+ assert_equal ["Tracker1"], names
27
+ ensure
28
+ Warning[:experimental] = experimental_warnings
29
+ end
30
+ end
31
+ end
data/tickly.gemspec CHANGED
@@ -1,68 +1,28 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
- # stub: tickly 2.1.6 ruby lib
1
+ require File.dirname(__FILE__) + '/lib/tickly/version'
6
2
 
7
3
  Gem::Specification.new do |s|
8
4
  s.name = "tickly"
9
- s.version = "2.1.6"
5
+ s.version = Tickly::VERSION
10
6
 
11
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
7
+ s.required_ruby_version = ">= 2.6"
12
8
  s.require_paths = ["lib"]
13
9
  s.authors = ["Julik Tarkhanov"]
14
- s.date = "2014-12-10"
10
+ s.date = Time.now.utc.strftime("%Y-%m-%d")
15
11
  s.description = "Parses the subset of the TCL grammar needed for Nuke scripts"
16
12
  s.email = "me@julik.nl"
17
13
  s.extra_rdoc_files = [
18
14
  "LICENSE.txt",
19
15
  "README.md"
20
16
  ]
21
- s.files = [
22
- ".document",
23
- ".travis.yml",
24
- "Gemfile",
25
- "LICENSE.txt",
26
- "README.md",
27
- "Rakefile",
28
- "lib/tickly.rb",
29
- "lib/tickly/curve.rb",
30
- "lib/tickly/evaluator.rb",
31
- "lib/tickly/node_processor.rb",
32
- "lib/tickly/parser.rb",
33
- "test/helper.rb",
34
- "test/test_benchmark.rb",
35
- "test/test_curve.rb",
36
- "test/test_emitter.rb",
37
- "test/test_evaluator.rb",
38
- "test/test_node_processor.rb",
39
- "test/test_parser.rb",
40
- "tickly.gemspec"
41
- ]
17
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.start_with? "test/test-data/"
19
+ end
42
20
  s.homepage = "http://github.com/julik/tickly"
43
21
  s.licenses = ["MIT"]
44
- s.rubygems_version = "2.2.2"
45
22
  s.summary = "Assists in parsing Nuke scripts in TCL"
46
23
 
47
- if s.respond_to? :specification_version then
48
- s.specification_version = 4
49
-
50
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
- s.add_development_dependency(%q<rake>, [">= 0"])
52
- s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
53
- s.add_development_dependency(%q<jeweler>, ["~> 1.8.7"])
54
- s.add_development_dependency(%q<ruby-prof>, ["= 0.13.0"])
55
- else
56
- s.add_dependency(%q<rake>, [">= 0"])
57
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
58
- s.add_dependency(%q<jeweler>, ["~> 1.8.7"])
59
- s.add_dependency(%q<ruby-prof>, ["= 0.13.0"])
60
- end
61
- else
62
- s.add_dependency(%q<rake>, [">= 0"])
63
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
64
- s.add_dependency(%q<jeweler>, ["~> 1.8.7"])
65
- s.add_dependency(%q<ruby-prof>, ["= 0.13.0"])
66
- end
24
+ s.add_development_dependency("rake")
25
+ s.add_development_dependency("rdoc")
26
+ s.add_development_dependency("benchmark")
27
+ s.add_development_dependency("test-unit")
67
28
  end
68
-
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tickly
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.6
4
+ version: 2.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: 2014-12-10 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: rake
@@ -28,44 +27,44 @@ dependencies:
28
27
  name: rdoc
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
- - - "~>"
30
+ - - ">="
32
31
  - !ruby/object:Gem::Version
33
- version: '3.12'
32
+ version: '0'
34
33
  type: :development
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
- - - "~>"
37
+ - - ">="
39
38
  - !ruby/object:Gem::Version
40
- version: '3.12'
39
+ version: '0'
41
40
  - !ruby/object:Gem::Dependency
42
- name: jeweler
41
+ name: benchmark
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
- - - "~>"
44
+ - - ">="
46
45
  - !ruby/object:Gem::Version
47
- version: 1.8.7
46
+ version: '0'
48
47
  type: :development
49
48
  prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
51
50
  requirements:
52
- - - "~>"
51
+ - - ">="
53
52
  - !ruby/object:Gem::Version
54
- version: 1.8.7
53
+ version: '0'
55
54
  - !ruby/object:Gem::Dependency
56
- name: ruby-prof
55
+ name: test-unit
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
- - - '='
58
+ - - ">="
60
59
  - !ruby/object:Gem::Version
61
- version: 0.13.0
60
+ version: '0'
62
61
  type: :development
63
62
  prerelease: false
64
63
  version_requirements: !ruby/object:Gem::Requirement
65
64
  requirements:
66
- - - '='
65
+ - - ">="
67
66
  - !ruby/object:Gem::Version
68
- version: 0.13.0
67
+ version: '0'
69
68
  description: Parses the subset of the TCL grammar needed for Nuke scripts
70
69
  email: me@julik.nl
71
70
  executables: []
@@ -75,6 +74,7 @@ extra_rdoc_files:
75
74
  - README.md
76
75
  files:
77
76
  - ".document"
77
+ - ".gitignore"
78
78
  - ".travis.yml"
79
79
  - Gemfile
80
80
  - LICENSE.txt
@@ -85,6 +85,7 @@ files:
85
85
  - lib/tickly/evaluator.rb
86
86
  - lib/tickly/node_processor.rb
87
87
  - lib/tickly/parser.rb
88
+ - lib/tickly/version.rb
88
89
  - test/helper.rb
89
90
  - test/test_benchmark.rb
90
91
  - test/test_curve.rb
@@ -92,12 +93,12 @@ files:
92
93
  - test/test_evaluator.rb
93
94
  - test/test_node_processor.rb
94
95
  - test/test_parser.rb
96
+ - test/test_ractor.rb
95
97
  - tickly.gemspec
96
98
  homepage: http://github.com/julik/tickly
97
99
  licenses:
98
100
  - MIT
99
101
  metadata: {}
100
- post_install_message:
101
102
  rdoc_options: []
102
103
  require_paths:
103
104
  - lib
@@ -105,16 +106,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
105
106
  requirements:
106
107
  - - ">="
107
108
  - !ruby/object:Gem::Version
108
- version: '0'
109
+ version: '2.6'
109
110
  required_rubygems_version: !ruby/object:Gem::Requirement
110
111
  requirements:
111
112
  - - ">="
112
113
  - !ruby/object:Gem::Version
113
114
  version: '0'
114
115
  requirements: []
115
- rubyforge_project:
116
- rubygems_version: 2.2.2
117
- signing_key:
116
+ rubygems_version: 4.0.3
118
117
  specification_version: 4
119
118
  summary: Assists in parsing Nuke scripts in TCL
120
119
  test_files: []