processing 1.1.17 → 1.1.18

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: e50909c9512c824caba22c77bcca692a84174e3d09e227080980589e616b643c
4
- data.tar.gz: 2511f64137c36a7464ad063f7df7045f0993899bed1a9b2207cf87f3d3b9b5f4
3
+ metadata.gz: cb185e6835ce1e5361fcb66b667eb4d328c2af7e32a047bbb54e3397f4ea6973
4
+ data.tar.gz: 4988d984b6c9ef039902d812ff2af813a967f11e43834cbfc168a980e2cc3179
5
5
  SHA512:
6
- metadata.gz: a7b194cba66b6fe6933aaa584405a58d7d3675d232116d87e5cf713b5bd004a507c209843da5cd6bfd8a411e2153a9fed015f29ddcb35d5102a7ecc3131ea47c
7
- data.tar.gz: f33a5d8216523f976840a065394e73ce535809d51381ee5ed6488194c0f2c3a80e526be3613ae517684ed018ec3d7e9436f31991e9c60e178305fd594788a582
6
+ metadata.gz: '09f27de2e255f090068e1e4a9c3d421debbe37758e64e0436859be28a7a0fcf0fbc43c39f9bcafb913847df3a8eb3ddbe0ee0e5ee7cc9f680f6bef6ddb8cfeb0'
7
+ data.tar.gz: 0b51113d2705579a0f7474aa60d8b73f393afc0f76c30085a87dd9381afa5c98ab69a2062d222550f04b9e06b56ae830898879628e8379323a4bd3ff71e4826d
@@ -4,6 +4,9 @@ on:
4
4
  push:
5
5
  tags: ['v[0-9]*']
6
6
 
7
+ permissions:
8
+ contents: write
9
+
7
10
  jobs:
8
11
  release:
9
12
  runs-on: macos-latest
@@ -16,7 +16,7 @@ jobs:
16
16
  ruby-version: 3.2
17
17
 
18
18
  - name: checkout
19
- uses: actions/checkout@v2
19
+ uses: actions/checkout@v4
20
20
 
21
21
  - name: setup gems
22
22
  run: bundle install
@@ -1,3 +1,9 @@
1
+ require 'shellwords'
2
+
3
+ ALL_REPO = 'xord/all'
4
+ ALL_DIR = '../all'
5
+ ALL_FETCH_DEPTH = 100
6
+
1
7
  RENAMES = {reflex: 'reflexion'}
2
8
 
3
9
  def sh(cmd)
@@ -5,7 +11,7 @@ def sh(cmd)
5
11
  system cmd
6
12
  end
7
13
 
8
- def setup_dependencies(build: true, only: nil)
14
+ def setup_dependencies(only: nil)
9
15
  gemspec_path = `git ls-files`.lines(chomp: true).find {|l| l =~ /\.gemspec$/}
10
16
  return unless gemspec_path
11
17
 
@@ -13,44 +19,109 @@ def setup_dependencies(build: true, only: nil)
13
19
  name = File.basename gemspec_path, '.gemspec'
14
20
 
15
21
  exts = File.readlines('Rakefile')
16
- .map {|l| l[%r|^\s*require\W+(\w+)/extension\W+$|, 1]}
22
+ .map {|l| l[%r|^\s*require\W+([\w\-\_]+)/extension\W+$|, 1]}
17
23
  .compact
18
24
  .reject {|ext| ext == name}
19
25
  exts = exts & [only].flatten.map(&:to_s) if only
26
+ return if exts.empty?
27
+
28
+ unless setup_dependencies_via_monorepo(exts)
29
+ setup_dependencies_via_each_repo_by_version(gemspec, exts)
30
+ end
31
+
32
+ exts.each {|ext| sh %( cd ../#{ext} && rake ext )}
33
+ end
34
+
35
+ def setup_dependencies_via_monorepo(exts)
36
+ return false unless checkout_monorepo
37
+ exts.each {|ext| sh %( ln -snf all/#{ext} ../#{ext} )}
38
+ true
39
+ end
40
+
41
+ def checkout_monorepo()
42
+ uuid = `git log -1 --format=%B`[/^\[\[([0-9a-fA-F-]+)\]\]$/, 1]
43
+ return false unless uuid
44
+
45
+ commit = setup_monorepo uuid
46
+ return false unless commit
47
+
48
+ Dir.chdir(ALL_DIR) {sh %( git checkout -q #{commit} )}
49
+ true
50
+ end
51
+
52
+ def setup_monorepo(uuid)
53
+ unless File.directory? ALL_DIR
54
+ url = "https://github.com/#{ALL_REPO}.git"
55
+ sh %( git clone --no-tags --depth #{ALL_FETCH_DEPTH} #{url} #{ALL_DIR} )
56
+ end
57
+ loop do
58
+ commit = find_monorepo_commit uuid
59
+ return commit if commit
60
+
61
+ deepened = Dir.chdir ALL_DIR do
62
+ before = `git rev-list --count HEAD`.to_i
63
+ sh %( git fetch --deepen #{ALL_FETCH_DEPTH} )
64
+ `git rev-list --count HEAD`.to_i > before
65
+ end
66
+ return nil unless deepened
67
+ end
68
+ end
69
+
70
+ def find_monorepo_commit(uuid)
71
+ Dir.chdir ALL_DIR do
72
+ out = `git log origin/HEAD -F --grep="[[#{uuid}]]" --format=%H -1`.strip
73
+ out.empty? ? nil : out
74
+ end
75
+ end
20
76
 
77
+ def setup_dependencies_via_each_repo_by_version(gemspec, exts)
21
78
  exts.each do |ext|
22
79
  gem = RENAMES[ext.to_sym].then {|s| s || ext}
23
- ver = gemspec[/add_dependency.*['"]#{gem}['"].*['"]\s*>=\s*([\d\.]+)\s*['"]/, 1]
80
+ ver = gemspec[/add_dependency.*['"]#{gem}['"].*['"]\s*~>\s*([\d\.]+)\s*['"]/, 1]
24
81
  opts = '-c advice.detachedHead=false --depth 1'
25
82
  clone = "git clone #{opts} https://github.com/xord/#{ext}.git ../#{ext}"
26
83
 
27
84
  # 'rake subtree:push' pushes all subrepos, so cloning by new tag
28
85
  # often fails before tagging each new tag
29
86
  sh %( #{clone} --branch v#{ver} || #{clone} )
30
- sh %( cd ../#{ext} && rake ext )
31
87
  end
32
88
  end
33
89
 
34
90
  def tag_versions()
35
- tags = `git tag`.lines chomp: true
36
- vers = `git log --oneline ./VERSION`
91
+ changes = changelogs
92
+ tags = `git tag`.lines chomp: true
93
+ vers = `git log --oneline ./VERSION`
37
94
  .lines(chomp: true)
38
95
  .map {|line| line.split.first[/^\w+$/]}
39
- .map {|hash| [`git cat-file -p #{hash}:./VERSION 2>/dev/null`[/[\d\.]+/], hash]}
40
- .select {|ver, hash| ver && hash}
96
+ .map {|sha| [`git cat-file -p #{sha}:./VERSION 2>/dev/null`[/[\d\.]+/], sha]}
97
+ .select {|ver, sha| ver && sha}
41
98
  .reverse
42
99
  .to_h
43
100
 
44
- changes = File.read('ChangeLog.md')
45
- .split(/^\s*##\s*\[\s*v([\d\.]+)\s*\].*$/)
46
- .slice(1..-1)
47
- .each_slice(2)
48
- .to_h
49
- .transform_values(&:strip!)
50
-
51
- vers.to_a.reverse.each do |ver, hash|
101
+ vers.to_a.reverse.each do |ver, sha|
52
102
  tag = "v#{ver}"
53
103
  break if tags.include?(tag)
54
- sh %( git tag -a -m \"#{changes[ver]&.gsub '"', '\\"'}\" #{tag} #{hash} )
104
+ sh %( git tag -a -m \"#{changes[tag]&.gsub '"', '\\"'}\" #{tag} #{sha} )
55
105
  end
56
106
  end
107
+
108
+ def release(*paths)
109
+ tag = ENV['GITHUB_REF']&.sub(%r|^refs/tags/|, '') || raise('GITHUB_REF tag not set')
110
+ notes = (changelogs[tag] || '').shellescape
111
+ paths = paths.flatten.join ' '
112
+
113
+ sh(%( gh release create #{tag} #{paths} --notes #{notes} )) ||
114
+ sh(%( gh release upload #{tag} #{paths} --clobber )) ||
115
+ raise('failed to upload to releases')
116
+ end
117
+
118
+ def changelogs()
119
+ File.read('ChangeLog.md')
120
+ .split(/^\s*##\s*\[\s*(v[\d\.]+)\s*\].*$/)
121
+ .slice(1..)
122
+ .each_slice(2)
123
+ .to_h
124
+ .transform_values(&:strip!)
125
+ rescue Errno::ENOENT
126
+ raise 'failed to get changelogs'
127
+ end
data/ChangeLog.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # processing ChangeLog
2
2
 
3
3
 
4
+ ## [v1.1.18] - 2026-05-10
5
+
6
+ - Support WebAssembly
7
+ - Disable auto-GC on WASM to avoid mid-draw Asyncify yield
8
+ - Lazy-load net/http and disable HTTP fetch on WASM
9
+ - Skip tmpdir cleanup on WASM
10
+
11
+
4
12
  ## [v1.1.17] - 2026-04-17
5
13
 
6
14
  - Update dependencies
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.17
1
+ 1.1.18
@@ -5,8 +5,8 @@ require 'pathname'
5
5
  require 'tmpdir'
6
6
  require 'uri'
7
7
  require 'rexml'
8
- require 'net/http'
9
8
  require 'xot/inspectable'
9
+ require 'xot/util'
10
10
  require 'reflex'
11
11
 
12
12
 
@@ -45,7 +45,7 @@ module Processing
45
45
  def initialize(window)
46
46
  @@rootContext__ = self
47
47
 
48
- tmpdir__.tap {|dir| FileUtils.rm_r dir.to_s if dir.directory?}
48
+ tmpdir__.tap {|dir| FileUtils.rm_r dir.to_s if dir.directory?} unless Xot.wasm?
49
49
 
50
50
  @window__ = window
51
51
  init__(
@@ -6,8 +6,10 @@ module Processing
6
6
 
7
7
  module_function
8
8
 
9
- def name()
10
- super.split('::')[-2]
9
+ def name(downcase = false)
10
+ super().split('::')[-2].then {|s|
11
+ downcase ? s.gsub(/([a-z])([A-Z])/) {"#{$1}-#{$2}"}.downcase : s
12
+ }
11
13
  end
12
14
 
13
15
  def version()
@@ -3449,6 +3449,8 @@ module Processing
3449
3449
  path = path.sub_ext ext
3450
3450
 
3451
3451
  unless path.file?
3452
+ raise NotImplementedError, 'HTTP request is not supported on WASM' if Xot.wasm?
3453
+ require 'net/http'
3452
3454
  Net::HTTP.get_response URI.parse(uri) do |res|
3453
3455
  res.value # raise an error unless successful
3454
3456
  tmpdir.mkdir unless tmpdir.directory?
@@ -71,15 +71,17 @@ module Processing
71
71
  ENV__ = {
72
72
  attribute_position: [:vertex, :position],
73
73
  attribute_texcoord: :texCoord,
74
+ attribute_texcoord_min: :texCoordMin,
75
+ attribute_texcoord_max: :texCoordMax,
74
76
  attribute_color: :color,
75
77
  varying_position: :vertPosition,
76
78
  varying_texcoord: :vertTexCoord,
79
+ varying_texcoord_min: :vertTexCoordMin,
80
+ varying_texcoord_max: :vertTexCoordMax,
77
81
  varying_color: :vertColor,
78
82
  uniform_position_matrix: [:transform, :transformMatrix],
79
83
  uniform_texcoord_matrix: :texMatrix,
80
- uniform_texcoord_min: :texMin,
81
- uniform_texcoord_max: :texMax,
82
- uniform_texcoord_offset: :texOffset,
84
+ uniform_texcoord_pixel: :texOffset,
83
85
  uniform_texture: [:texMap, :texture]
84
86
  }.freeze
85
87
 
@@ -144,10 +146,10 @@ module Processing
144
146
  #define PI 3.1415926538
145
147
  uniform float radius;
146
148
  uniform sampler2D texMap;
147
- uniform vec3 texMin;
148
- uniform vec3 texMax;
149
149
  uniform vec3 texOffset;
150
150
  varying vec4 vertTexCoord;
151
+ varying vec3 vertTexCoordMin;
152
+ varying vec3 vertTexCoordMax;
151
153
  varying vec4 vertColor;
152
154
  float gaussian(vec2 pos, float sigma) {
153
155
  float s2 = sigma * sigma;
@@ -163,8 +165,8 @@ module Processing
163
165
  float weight = gaussian(offset, sigma);
164
166
  vec2 texcoord = vertTexCoord.xy + offset * texOffset.xy;
165
167
  if (
166
- texcoord.x < texMin.x || texMax.x < texcoord.x ||
167
- texcoord.y < texMin.y || texMax.y < texcoord.y
168
+ texcoord.x < vertTexCoordMin.x || vertTexCoordMax.x < texcoord.x ||
169
+ texcoord.y < vertTexCoordMin.y || vertTexCoordMax.y < texcoord.y
168
170
  ) continue;
169
171
  color += texture2D(texMap, texcoord).rgb * weight;
170
172
  total_weight += weight;
@@ -17,6 +17,11 @@ module Processing
17
17
  @canvas_view = add CanvasView.new name: :canvas
18
18
  @overlay_view = @canvas_view.add Reflex::View.new name: :overlay
19
19
 
20
+ # On WASM, auto-GC may yield mid-draw via Asyncify and cause partial
21
+ # frames to be presented. Disable auto-GC and run GC.start manually
22
+ # at a safe point (on_canvas_update) to avoid this.
23
+ GC.disable if Xot.wasm?
24
+
20
25
  super(*args, size: [width, height], **kwargs, &block)
21
26
 
22
27
  self.center = screen.center
@@ -101,6 +106,7 @@ module Processing
101
106
  def on_canvas_update(e)
102
107
  call_block @update, e
103
108
  @canvas_view.redraw
109
+ GC.start if Xot.wasm? # explicit GC at a safe point (no draw in progress)
104
110
  end
105
111
 
106
112
  def on_canvas_draw(e)
data/processing.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  end
11
11
 
12
12
  ext = Processing::Extension
13
- name = ext.name.downcase
13
+ name = ext.name true
14
14
  rdocs = glob.call *%w[README]
15
15
 
16
16
  s.name = name
@@ -26,10 +26,10 @@ Gem::Specification.new do |s|
26
26
  s.required_ruby_version = '>= 3.0.0'
27
27
 
28
28
  s.add_dependency 'rexml'
29
- s.add_dependency 'xot', '~> 0.3.11'
30
- s.add_dependency 'rucy', '~> 0.3.11'
31
- s.add_dependency 'rays', '~> 0.3.11'
32
- s.add_dependency 'reflexion', '~> 0.3.14'
29
+ s.add_dependency 'xot', '~> 0.3.12'
30
+ s.add_dependency 'rucy', '~> 0.3.12'
31
+ s.add_dependency 'rays', '~> 0.3.12'
32
+ s.add_dependency 'reflexion', '~> 0.3.15'
33
33
 
34
34
  s.files = `git ls-files`.split $/
35
35
  s.test_files = s.files.grep %r{^(test|spec|features)/}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: processing
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.17
4
+ version: 1.1.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - xordog
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-04-17 00:00:00.000000000 Z
11
+ date: 2026-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rexml
@@ -30,56 +30,56 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.3.11
33
+ version: 0.3.12
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.3.11
40
+ version: 0.3.12
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rucy
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.3.11
47
+ version: 0.3.12
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.3.11
54
+ version: 0.3.12
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rays
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.3.11
61
+ version: 0.3.12
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.3.11
68
+ version: 0.3.12
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: reflexion
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.3.14
75
+ version: 0.3.15
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.3.14
82
+ version: 0.3.15
83
83
  description: Creative Coding Framework has API compatible to Processing or p5.js.
84
84
  email: xordog@gmail.com
85
85
  executables: []