tickly 0.0.2 → 0.0.3
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.
- data/lib/tickly/parser.rb +3 -25
- data/lib/tickly.rb +24 -4
- data/test/{nuke7_tracker_2tracks.nk → test-data/nuke7_tracker_2tracks.nk} +0 -0
- data/test/{nuke_group.txt → test-data/nuke_group.txt} +0 -0
- data/test/{nukenode.txt → test-data/nukenode.txt} +0 -0
- data/test/test-data/one_node_with_one_param.txt +3 -0
- data/test/{one_tracker_with_break.nk → test-data/one_tracker_with_break.nk} +0 -0
- data/test/{one_tracker_with_break_in_grp.nk → test-data/one_tracker_with_break_in_grp.nk} +0 -0
- data/test/{three_nodes_and_roto.txt → test-data/three_nodes_and_roto.txt} +0 -0
- data/test/{tracker_with_differing_gaps.nk → test-data/tracker_with_differing_gaps.nk} +0 -0
- data/test/{tracker_with_repeating_gaps.nk → test-data/tracker_with_repeating_gaps.nk} +0 -0
- data/test/test_parser.rb +19 -4
- data/test/test_split_array.rb +8 -0
- data/tickly.gemspec +12 -11
- metadata +81 -89
data/lib/tickly/parser.rb
CHANGED
@@ -85,20 +85,6 @@ module Tickly
|
|
85
85
|
return buf
|
86
86
|
end
|
87
87
|
|
88
|
-
def expand_one_elements!(expr)
|
89
|
-
expr.map! do | element |
|
90
|
-
if expr?(element) && element.length == 1 && element[0].class == element.class
|
91
|
-
element[0]
|
92
|
-
else
|
93
|
-
element
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def remove_empty_elements!(expr)
|
99
|
-
expr.reject! {|e| expr?(e) && e.empty? }
|
100
|
-
end
|
101
|
-
|
102
88
|
# Tells whether a passed object is a StringExpr or LiteralExpr
|
103
89
|
def expr?(something)
|
104
90
|
[StringExpr, LiteralExpr].include?(something.class)
|
@@ -107,18 +93,10 @@ module Tickly
|
|
107
93
|
# Cleans up a subexpression stack. Currently it only removes nil objects
|
108
94
|
# in-between items (which act as line separators)
|
109
95
|
def cleanup(expr)
|
110
|
-
#
|
111
|
-
|
112
|
-
|
113
|
-
# Remove empty subexprs
|
114
|
-
#remove_empty_elements!(expr)
|
115
|
-
|
116
|
-
# Squeeze out the leading and trailing nils
|
117
|
-
expr.delete_at(0) while (expr.any? && expr[0].nil?)
|
118
|
-
expr.delete_at(-1) while (expr.any? && expr[-1].nil?)
|
119
|
-
|
96
|
+
# Ensure multiple consecutive line breaks are ignored
|
97
|
+
no_multiple_breaks = Tickly.singularize_nils_in(expr)
|
120
98
|
# Convert line breaks into subexpressions
|
121
|
-
Tickly.split_array(
|
99
|
+
Tickly.split_array(no_multiple_breaks)
|
122
100
|
end
|
123
101
|
|
124
102
|
end
|
data/lib/tickly.rb
CHANGED
@@ -3,13 +3,13 @@ require File.dirname(__FILE__) + "/tickly/evaluator"
|
|
3
3
|
require 'forwardable'
|
4
4
|
|
5
5
|
module Tickly
|
6
|
-
VERSION = '0.0.
|
6
|
+
VERSION = '0.0.3'
|
7
7
|
|
8
8
|
# Represents a TCL expression with it's arguments (in curly or square braces)
|
9
9
|
class Expr
|
10
10
|
extend Forwardable
|
11
11
|
|
12
|
-
def_delegators :@e, :push, :<<, :any?, :reject!, :map!, :[], :delete_at, :include?, :each, :empty?, :join, :length
|
12
|
+
def_delegators :@e, :push, :<<, :any?, :reject!, :map!, :[], :delete_at, :include?, :each, :each_with_index, :empty?, :join, :length
|
13
13
|
|
14
14
|
def initialize(elements = [])
|
15
15
|
@e = elements
|
@@ -73,19 +73,39 @@ module Tickly
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
+
# Splits the passed Array-like object into sub-arrays of the same class,
|
77
|
+
# delimited by the passed separator. Note that when the separators occur at the beginning or at the end of
|
78
|
+
# the passed object they will be discarded
|
76
79
|
def self.split_array(arr, separator = nil)
|
77
80
|
return arr unless arr.include?(separator)
|
78
81
|
|
79
82
|
subarrays = arr.class.new
|
80
83
|
subarrays.push(arr.class.new)
|
81
84
|
|
82
|
-
arr.
|
83
|
-
if element == separator
|
85
|
+
arr.each_with_index do | element, i |
|
86
|
+
if element == separator && subarrays.length > 0 && subarrays[-1].any? && (i < (arr.length - 1))
|
84
87
|
subarrays.push(arr.class.new)
|
88
|
+
elsif element == separator
|
89
|
+
# toss it
|
85
90
|
else
|
86
91
|
subarrays[-1].push(element)
|
87
92
|
end
|
88
93
|
end
|
89
94
|
return subarrays
|
90
95
|
end
|
96
|
+
|
97
|
+
# Removes consecutive nils from the passed Array-like object and returns a new one with all consecutive nils reduced
|
98
|
+
# to one nil
|
99
|
+
def self.singularize_nils_in(arr)
|
100
|
+
new_arr = arr.class.new
|
101
|
+
arr.each_with_index do | elem, i |
|
102
|
+
if elem.nil? && arr[i-1].nil? && i > 0
|
103
|
+
# pass
|
104
|
+
else
|
105
|
+
new_arr << elem
|
106
|
+
end
|
107
|
+
end
|
108
|
+
new_arr
|
109
|
+
end
|
110
|
+
|
91
111
|
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/test/test_parser.rb
CHANGED
@@ -53,7 +53,7 @@ class TestParser < Test::Unit::TestCase
|
|
53
53
|
end
|
54
54
|
|
55
55
|
should 'parse a Nuke node' do
|
56
|
-
f = File.open(File.dirname(__FILE__) + "/nukenode.txt")
|
56
|
+
f = File.open(File.dirname(__FILE__) + "/test-data/nukenode.txt")
|
57
57
|
p = P.parse(f)
|
58
58
|
script = le(
|
59
59
|
le("set", "cut_paste_input", se("stack", "0")),
|
@@ -78,7 +78,7 @@ class TestParser < Test::Unit::TestCase
|
|
78
78
|
end
|
79
79
|
|
80
80
|
should 'parse a simple Nuke script and internalize the RotoPaint in it' do
|
81
|
-
f = File.open(File.dirname(__FILE__) + "/three_nodes_and_roto.txt")
|
81
|
+
f = File.open(File.dirname(__FILE__) + "/test-data/three_nodes_and_roto.txt")
|
82
82
|
p = P.parse(f)
|
83
83
|
# Should pass through the rotopaint node and get to the blur properly
|
84
84
|
blur = le("Blur",
|
@@ -99,7 +99,7 @@ class TestParser < Test::Unit::TestCase
|
|
99
99
|
end
|
100
100
|
|
101
101
|
should 'parse a Nuke script with indentations' do
|
102
|
-
f = File.open(File.dirname(__FILE__) + "/nuke_group.txt")
|
102
|
+
f = File.open(File.dirname(__FILE__) + "/test-data/nuke_group.txt")
|
103
103
|
p = P.parse(f)
|
104
104
|
grp = le(
|
105
105
|
le("set", "cut_paste_input", se("stack", "0")),
|
@@ -124,10 +124,25 @@ class TestParser < Test::Unit::TestCase
|
|
124
124
|
)
|
125
125
|
),
|
126
126
|
le("Output",
|
127
|
-
le(
|
127
|
+
le(
|
128
|
+
le("name", "Output1")
|
129
|
+
)
|
128
130
|
),
|
129
131
|
le("end_group")
|
130
132
|
)
|
131
133
|
assert_equal grp, p
|
132
134
|
end
|
135
|
+
|
136
|
+
def test_one_node_parsing
|
137
|
+
f = File.open(File.dirname(__FILE__) + "/test-data/one_node_with_one_param.txt")
|
138
|
+
p = P.parse(f)
|
139
|
+
ref = le("SomeNode",
|
140
|
+
le(
|
141
|
+
le("foo", "bar")
|
142
|
+
)
|
143
|
+
)
|
144
|
+
|
145
|
+
assert_equal ref, p
|
146
|
+
end
|
147
|
+
|
133
148
|
end
|
data/test/test_split_array.rb
CHANGED
@@ -9,6 +9,10 @@ class TestSplitArray < Test::Unit::TestCase
|
|
9
9
|
assert_equal [[1, 2], [3, 4]], Tickly.split_array([1, 2, nil, 3, 4])
|
10
10
|
end
|
11
11
|
|
12
|
+
should "only generate sub-elements where they make sense" do
|
13
|
+
assert_equal [[1, 2]], Tickly.split_array([nil, 1, 2, nil])
|
14
|
+
end
|
15
|
+
|
12
16
|
class Jock < Array; end
|
13
17
|
|
14
18
|
should "properly use subclasses" do
|
@@ -17,4 +21,8 @@ class TestSplitArray < Test::Unit::TestCase
|
|
17
21
|
assert_kind_of Jock, s[0]
|
18
22
|
end
|
19
23
|
|
24
|
+
should 'squeeze nils out' do
|
25
|
+
s = Tickly.singularize_nils_in([nil, nil, 1,2,3,4, nil, nil, 456, nil, 9,nil,nil])
|
26
|
+
assert_equal [nil, 1,2,3,4, nil, 456, nil, 9, nil], s
|
27
|
+
end
|
20
28
|
end
|
data/tickly.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "tickly"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Julik Tarkhanov"]
|
12
|
-
s.date = "2013-03-
|
12
|
+
s.date = "2013-03-11"
|
13
13
|
s.description = "Parses the subset of the TCL grammar needed for Nuke scripts"
|
14
14
|
s.email = "me@julik.nl"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -27,23 +27,24 @@ Gem::Specification.new do |s|
|
|
27
27
|
"lib/tickly/evaluator.rb",
|
28
28
|
"lib/tickly/parser.rb",
|
29
29
|
"test/helper.rb",
|
30
|
-
"test/nuke7_tracker_2tracks.nk",
|
31
|
-
"test/nuke_group.txt",
|
32
|
-
"test/nukenode.txt",
|
33
|
-
"test/
|
34
|
-
"test/
|
30
|
+
"test/test-data/nuke7_tracker_2tracks.nk",
|
31
|
+
"test/test-data/nuke_group.txt",
|
32
|
+
"test/test-data/nukenode.txt",
|
33
|
+
"test/test-data/one_node_with_one_param.txt",
|
34
|
+
"test/test-data/one_tracker_with_break.nk",
|
35
|
+
"test/test-data/one_tracker_with_break_in_grp.nk",
|
36
|
+
"test/test-data/three_nodes_and_roto.txt",
|
37
|
+
"test/test-data/tracker_with_differing_gaps.nk",
|
38
|
+
"test/test-data/tracker_with_repeating_gaps.nk",
|
35
39
|
"test/test_evaluator.rb",
|
36
40
|
"test/test_parser.rb",
|
37
41
|
"test/test_split_array.rb",
|
38
|
-
"test/three_nodes_and_roto.txt",
|
39
|
-
"test/tracker_with_differing_gaps.nk",
|
40
|
-
"test/tracker_with_repeating_gaps.nk",
|
41
42
|
"tickly.gemspec"
|
42
43
|
]
|
43
44
|
s.homepage = "http://github.com/julik/tickly"
|
44
45
|
s.licenses = ["MIT"]
|
45
46
|
s.require_paths = ["lib"]
|
46
|
-
s.rubygems_version = "1.8.
|
47
|
+
s.rubygems_version = "1.8.24"
|
47
48
|
s.summary = "Assists in parsing Nuke scripts in TCL"
|
48
49
|
|
49
50
|
if s.respond_to? :specification_version then
|
metadata
CHANGED
@@ -1,91 +1,88 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: tickly
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 2
|
10
|
-
version: 0.0.2
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Julik Tarkhanov
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-03-11 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: shoulda
|
22
|
-
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
23
17
|
none: false
|
24
|
-
requirements:
|
25
|
-
- -
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
|
28
|
-
segments:
|
29
|
-
- 0
|
30
|
-
version: "0"
|
31
|
-
prerelease: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :development
|
33
|
-
|
34
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
35
31
|
name: rdoc
|
36
|
-
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
37
33
|
none: false
|
38
|
-
requirements:
|
34
|
+
requirements:
|
39
35
|
- - ~>
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
|
42
|
-
segments:
|
43
|
-
- 3
|
44
|
-
- 12
|
45
|
-
version: "3.12"
|
46
|
-
prerelease: false
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '3.12'
|
47
38
|
type: :development
|
48
|
-
|
49
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '3.12'
|
46
|
+
- !ruby/object:Gem::Dependency
|
50
47
|
name: bundler
|
51
|
-
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
52
49
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
segments:
|
58
|
-
- 0
|
59
|
-
version: "0"
|
60
|
-
prerelease: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
61
54
|
type: :development
|
62
|
-
|
63
|
-
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
64
63
|
name: jeweler
|
65
|
-
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
66
65
|
none: false
|
67
|
-
requirements:
|
66
|
+
requirements:
|
68
67
|
- - ~>
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
hash: 49
|
71
|
-
segments:
|
72
|
-
- 1
|
73
|
-
- 8
|
74
|
-
- 3
|
68
|
+
- !ruby/object:Gem::Version
|
75
69
|
version: 1.8.3
|
76
|
-
prerelease: false
|
77
70
|
type: :development
|
78
|
-
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.8.3
|
79
78
|
description: Parses the subset of the TCL grammar needed for Nuke scripts
|
80
79
|
email: me@julik.nl
|
81
80
|
executables: []
|
82
|
-
|
83
81
|
extensions: []
|
84
|
-
|
85
|
-
extra_rdoc_files:
|
82
|
+
extra_rdoc_files:
|
86
83
|
- LICENSE.txt
|
87
84
|
- README.rdoc
|
88
|
-
files:
|
85
|
+
files:
|
89
86
|
- .document
|
90
87
|
- .travis.yml
|
91
88
|
- Gemfile
|
@@ -96,50 +93,45 @@ files:
|
|
96
93
|
- lib/tickly/evaluator.rb
|
97
94
|
- lib/tickly/parser.rb
|
98
95
|
- test/helper.rb
|
99
|
-
- test/nuke7_tracker_2tracks.nk
|
100
|
-
- test/nuke_group.txt
|
101
|
-
- test/nukenode.txt
|
102
|
-
- test/
|
103
|
-
- test/
|
96
|
+
- test/test-data/nuke7_tracker_2tracks.nk
|
97
|
+
- test/test-data/nuke_group.txt
|
98
|
+
- test/test-data/nukenode.txt
|
99
|
+
- test/test-data/one_node_with_one_param.txt
|
100
|
+
- test/test-data/one_tracker_with_break.nk
|
101
|
+
- test/test-data/one_tracker_with_break_in_grp.nk
|
102
|
+
- test/test-data/three_nodes_and_roto.txt
|
103
|
+
- test/test-data/tracker_with_differing_gaps.nk
|
104
|
+
- test/test-data/tracker_with_repeating_gaps.nk
|
104
105
|
- test/test_evaluator.rb
|
105
106
|
- test/test_parser.rb
|
106
107
|
- test/test_split_array.rb
|
107
|
-
- test/three_nodes_and_roto.txt
|
108
|
-
- test/tracker_with_differing_gaps.nk
|
109
|
-
- test/tracker_with_repeating_gaps.nk
|
110
108
|
- tickly.gemspec
|
111
109
|
homepage: http://github.com/julik/tickly
|
112
|
-
licenses:
|
110
|
+
licenses:
|
113
111
|
- MIT
|
114
112
|
post_install_message:
|
115
113
|
rdoc_options: []
|
116
|
-
|
117
|
-
require_paths:
|
114
|
+
require_paths:
|
118
115
|
- lib
|
119
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
120
117
|
none: false
|
121
|
-
requirements:
|
122
|
-
- -
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
|
125
|
-
segments:
|
118
|
+
requirements:
|
119
|
+
- - ! '>='
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
segments:
|
126
123
|
- 0
|
127
|
-
|
128
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
hash: 592217362083330592
|
125
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
126
|
none: false
|
130
|
-
requirements:
|
131
|
-
- -
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
|
134
|
-
segments:
|
135
|
-
- 0
|
136
|
-
version: "0"
|
127
|
+
requirements:
|
128
|
+
- - ! '>='
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
137
131
|
requirements: []
|
138
|
-
|
139
132
|
rubyforge_project:
|
140
|
-
rubygems_version: 1.8.
|
133
|
+
rubygems_version: 1.8.24
|
141
134
|
signing_key:
|
142
135
|
specification_version: 3
|
143
136
|
summary: Assists in parsing Nuke scripts in TCL
|
144
137
|
test_files: []
|
145
|
-
|