fulgur 0.5.11 → 0.11.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: d1d5a7461dba4fc21b2d985705ff6927ca76dfff374a9fe0a45ba708f3e8bfd6
4
- data.tar.gz: 0e156641ae26f162b566016ad4e2b8f00ce47b8994d6f6e628de694265237621
3
+ metadata.gz: e16007779f7132c238d5f058c4fa782524fc9705f67a7ecc1fbf9355ca2e061a
4
+ data.tar.gz: 5fe11b5eda725b998320ff30a9b4c3993eb3a4c6e911663f422d079ac0f02a29
5
5
  SHA512:
6
- metadata.gz: f87dac164212bbcd7259d492a104bf36d92afd8a2650d9f9e962a1d9cf79ac95cdccb852d44bb92a08df5bcea3bddfded602bfba3ef25886bcbbe00fd4c605ed
7
- data.tar.gz: 344817409650eb9c02507826eb372fe3f034b7a2acdb7b65d903e146151e1c5da83dab8e96bdb940a17a2da40ade4b9e5a070ce5d2a93f9ce001ea392c6a2c2a
6
+ metadata.gz: f7378dc902976084f25f80627afe63449906276ba8310ba02025ae0da3dad3e0d004c074a9608bcde7ebf6329c2f29f2f0efe0b1314fe3bad148f737f12e6ac8
7
+ data.tar.gz: 7c43ccb6999d9534f9addc7fd5000c20506cbf4d08b90ba14a056f51580a7dcefd199bf6c2fe1301e5128b94cebc85be2cbefe8cde6725b707540ad7b333a034
data/Cargo.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "fulgur-ruby"
3
- version = "0.5.11"
3
+ version = "0.11.0"
4
4
  # rb_sys cross-gem-action は `directory: crates/fulgur-ruby` のみをコンテナに
5
5
  # マウントするため、この Cargo.toml は workspace root 不在でも cargo metadata
6
6
  # を解決できる必要がある。したがって workspace 継承 (`.workspace = true`) は
@@ -23,7 +23,7 @@ ruby-api = ["dep:magnus", "dep:rb-sys"]
23
23
  [dependencies]
24
24
  fulgur = { path = "../fulgur" }
25
25
  base64 = "0.22"
26
- magnus = { version = "0.7", optional = true }
26
+ magnus = { version = "0.8", optional = true }
27
27
  rb-sys = { version = "0.9", optional = true }
28
28
  # Send/Sync 保証 (Engine) のコンパイル時 assertion で使用。
29
29
  # ext/fulgur/Cargo.toml にも同じ依存を追加していること。
@@ -2,7 +2,7 @@
2
2
 
3
3
  [package]
4
4
  name = "fulgur"
5
- version = "0.5.11"
5
+ version = "0.11.0"
6
6
  # crates/fulgur-ruby/Cargo.toml と同じ src を共有 (path = "../../src/lib.rs")。
7
7
  # workspace と同じ edition 2024 に揃える。
8
8
  edition = "2024"
@@ -22,7 +22,7 @@ ruby-api = ["dep:magnus", "dep:rb-sys"]
22
22
  # を参照する (release 時は release.yml → release: published → release-ruby.yml の順で
23
23
  # 発火するため、この時点で fulgur のバージョンは crates.io に存在する)。
24
24
  # release-prepare.yml が sed でこの行のバージョンを同期する。
25
- fulgur = "0.5.11"
25
+ fulgur = "0.11.0"
26
26
  base64 = "0.22"
27
27
  magnus = { version = "0.7", optional = true }
28
28
  rb-sys = { version = "0.9", optional = true }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Fulgur
4
- VERSION = "0.5.11"
4
+ VERSION = "0.11.0"
5
5
  end
data/src/asset_bundle.rs CHANGED
@@ -66,8 +66,8 @@ impl RbAssetBundle {
66
66
  }
67
67
  }
68
68
 
69
- pub fn define(_ruby: &Ruby, fulgur: &RModule) -> Result<(), Error> {
70
- let class = fulgur.define_class("AssetBundle", magnus::class::object())?;
69
+ pub fn define(ruby: &Ruby, fulgur: &RModule) -> Result<(), Error> {
70
+ let class = fulgur.define_class("AssetBundle", ruby.class_object())?;
71
71
  class.define_singleton_method("new", function!(RbAssetBundle::new, 0))?;
72
72
  class.define_method("add_css", method!(RbAssetBundle::add_css, 1))?;
73
73
  class.define_method("add_css_file", method!(RbAssetBundle::add_css_file, 1))?;
data/src/engine.rs CHANGED
@@ -36,8 +36,9 @@ impl RbEngineBuilder {
36
36
 
37
37
  fn take(&self) -> Result<EngineBuilder, Error> {
38
38
  self.inner.borrow_mut().take().ok_or_else(|| {
39
+ let ruby = Ruby::get().expect("ruby vm");
39
40
  Error::new(
40
- magnus::exception::runtime_error(),
41
+ ruby.exception_runtime_error(),
41
42
  "EngineBuilder has already been built",
42
43
  )
43
44
  })
@@ -273,8 +274,8 @@ fn engine_builder() -> RbEngineBuilder {
273
274
  RbEngineBuilder::new()
274
275
  }
275
276
 
276
- pub fn define(_ruby: &Ruby, fulgur: &RModule) -> Result<(), Error> {
277
- let engine = fulgur.define_class("Engine", magnus::class::object())?;
277
+ pub fn define(ruby: &Ruby, fulgur: &RModule) -> Result<(), Error> {
278
+ let engine = fulgur.define_class("Engine", ruby.class_object())?;
278
279
  engine.define_singleton_method("new", function!(engine_new, -1))?;
279
280
  engine.define_singleton_method("builder", function!(engine_builder, 0))?;
280
281
  engine.define_method("render_html", method!(RbEngine::render_html, 1))?;
@@ -283,7 +284,7 @@ pub fn define(_ruby: &Ruby, fulgur: &RModule) -> Result<(), Error> {
283
284
  method!(RbEngine::render_html_to_file, 2),
284
285
  )?;
285
286
 
286
- let builder = fulgur.define_class("EngineBuilder", magnus::class::object())?;
287
+ let builder = fulgur.define_class("EngineBuilder", ruby.class_object())?;
287
288
  builder.define_method("page_size", method!(builder_page_size, 1))?;
288
289
  builder.define_method("margin", method!(builder_margin, 1))?;
289
290
  builder.define_method("assets", method!(builder_assets, 1))?;
data/src/error.rs CHANGED
@@ -5,7 +5,7 @@
5
5
  //! `fulgur::Error` の variant に応じて適切な Ruby 例外に変換する。
6
6
 
7
7
  use fulgur::Error as FulgurError;
8
- use magnus::{Error, ExceptionClass, Module, RModule, Ruby, exception};
8
+ use magnus::{Error, ExceptionClass, Module, RModule, Ruby};
9
9
 
10
10
  /// Ruby 側の `Fulgur::<name>` 例外クラスを lookup する。
11
11
  fn class(ruby: &Ruby, name: &str) -> Result<ExceptionClass, Error> {
@@ -28,7 +28,7 @@ pub fn map_fulgur_error(ruby: &Ruby, err: FulgurError) -> Error {
28
28
  .class_object()
29
29
  .const_get::<_, RModule>("Errno")
30
30
  .and_then(|m| m.const_get::<_, ExceptionClass>("ENOENT"))
31
- .unwrap_or_else(|_| exception::runtime_error());
31
+ .unwrap_or_else(|_| ruby.exception_runtime_error());
32
32
  Error::new(errno, io_err.to_string())
33
33
  }
34
34
  _ => render_error(ruby, io_err.to_string()),
@@ -38,20 +38,21 @@ pub fn map_fulgur_error(ruby: &Ruby, err: FulgurError) -> Error {
38
38
  | FulgurError::HtmlParse(msg)
39
39
  | FulgurError::Layout(msg)
40
40
  | FulgurError::PdfGeneration(msg)
41
- | FulgurError::Template(msg) => render_error(ruby, msg),
41
+ | FulgurError::Template(msg)
42
+ | FulgurError::Other(msg) => render_error(ruby, msg),
42
43
  }
43
44
  }
44
45
 
45
46
  fn render_error(ruby: &Ruby, msg: String) -> Error {
46
47
  match class(ruby, "RenderError") {
47
48
  Ok(c) => Error::new(c, msg),
48
- Err(_) => Error::new(exception::runtime_error(), msg),
49
+ Err(_) => Error::new(ruby.exception_runtime_error(), msg),
49
50
  }
50
51
  }
51
52
 
52
53
  fn asset_error(ruby: &Ruby, msg: String) -> Error {
53
54
  match class(ruby, "AssetError") {
54
55
  Ok(c) => Error::new(c, msg),
55
- Err(_) => Error::new(exception::runtime_error(), msg),
56
+ Err(_) => Error::new(ruby.exception_runtime_error(), msg),
56
57
  }
57
58
  }
data/src/lib.rs CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  #![cfg(feature = "ruby-api")]
8
8
 
9
- use magnus::{Error, define_module};
9
+ use magnus::Error;
10
10
 
11
11
  mod asset_bundle;
12
12
  mod engine;
@@ -30,7 +30,7 @@ mod assertions {
30
30
 
31
31
  #[magnus::init]
32
32
  fn init(ruby: &magnus::Ruby) -> Result<(), Error> {
33
- let fulgur = define_module("Fulgur")?;
33
+ let fulgur = ruby.define_module("Fulgur")?;
34
34
  page_size::define(ruby, &fulgur)?;
35
35
  margin::define(ruby, &fulgur)?;
36
36
  asset_bundle::define(ruby, &fulgur)?;
data/src/margin.rs CHANGED
@@ -61,8 +61,8 @@ impl RbMargin {
61
61
  }
62
62
  }
63
63
 
64
- pub fn define(_ruby: &Ruby, fulgur: &RModule) -> Result<(), Error> {
65
- let class = fulgur.define_class("Margin", magnus::class::object())?;
64
+ pub fn define(ruby: &Ruby, fulgur: &RModule) -> Result<(), Error> {
65
+ let class = fulgur.define_class("Margin", ruby.class_object())?;
66
66
  class.define_singleton_method("__build__", function!(RbMargin::from_trbl, 4))?;
67
67
  class.define_singleton_method("uniform", function!(RbMargin::uniform, 1))?;
68
68
  class.define_singleton_method("symmetric", function!(RbMargin::symmetric, 2))?;
data/src/page_size.rs CHANGED
@@ -59,8 +59,9 @@ pub fn extract(value: Value) -> Result<PageSize, Error> {
59
59
  if let Ok(s) = <String>::try_convert(value) {
60
60
  return parse_name(&s);
61
61
  }
62
+ let ruby = Ruby::get().expect("ruby vm");
62
63
  Err(Error::new(
63
- magnus::exception::arg_error(),
64
+ ruby.exception_arg_error(),
64
65
  "page_size must be Symbol, String, or Fulgur::PageSize",
65
66
  ))
66
67
  }
@@ -70,15 +71,18 @@ fn parse_name(name: &str) -> Result<PageSize, Error> {
70
71
  "A4" => Ok(PageSize::A4),
71
72
  "LETTER" => Ok(PageSize::LETTER),
72
73
  "A3" => Ok(PageSize::A3),
73
- other => Err(Error::new(
74
- magnus::exception::arg_error(),
75
- format!("unknown page size: {other}"),
76
- )),
74
+ other => {
75
+ let ruby = Ruby::get().expect("ruby vm");
76
+ Err(Error::new(
77
+ ruby.exception_arg_error(),
78
+ format!("unknown page size: {other}"),
79
+ ))
80
+ }
77
81
  }
78
82
  }
79
83
 
80
- pub fn define(_ruby: &Ruby, fulgur: &RModule) -> Result<(), Error> {
81
- let class = fulgur.define_class("PageSize", magnus::class::object())?;
84
+ pub fn define(ruby: &Ruby, fulgur: &RModule) -> Result<(), Error> {
85
+ let class = fulgur.define_class("PageSize", ruby.class_object())?;
82
86
  class.define_singleton_method("custom", function!(RbPageSize::custom, 2))?;
83
87
  class.define_method("width", method!(RbPageSize::width, 0))?;
84
88
  class.define_method("height", method!(RbPageSize::height, 0))?;
data/src/pdf.rs CHANGED
@@ -24,8 +24,9 @@ impl RbPdf {
24
24
  }
25
25
 
26
26
  fn to_s(&self) -> RString {
27
- // `RString::from_slice` は ASCII-8BIT (binary) encoding の Ruby String を返す。
28
- RString::from_slice(&self.bytes)
27
+ // `Ruby::str_from_slice` は ASCII-8BIT (binary) encoding の Ruby String を返す。
28
+ let ruby = Ruby::get().expect("ruby vm");
29
+ ruby.str_from_slice(&self.bytes)
29
30
  }
30
31
 
31
32
  fn to_base64(&self) -> String {
@@ -62,18 +63,19 @@ impl RbPdf {
62
63
  /// - `IO#write` が要求より少ないバイト数を返した場合 (socket / pipe / 独自 IO の短書き込み)
63
64
  /// は残りを再送する。戻り値が 0 の場合は無限ループを防ぐため `RuntimeError` を返す。
64
65
  fn write_to_io(&self, io: Value) -> Result<(), Error> {
65
- let responds: bool = io.funcall("respond_to?", (magnus::Symbol::new("binmode"),))?;
66
+ let ruby = Ruby::get().expect("ruby vm");
67
+ let responds: bool = io.funcall("respond_to?", (ruby.to_symbol("binmode"),))?;
66
68
  if responds {
67
69
  let _: Value = io.funcall("binmode", ())?;
68
70
  }
69
71
  for chunk in self.bytes.chunks(CHUNK_SIZE) {
70
72
  let mut offset = 0;
71
73
  while offset < chunk.len() {
72
- let rb_bytes = RString::from_slice(&chunk[offset..]);
74
+ let rb_bytes = ruby.str_from_slice(&chunk[offset..]);
73
75
  let written: usize = io.funcall("write", (rb_bytes,))?;
74
76
  if written == 0 {
75
77
  return Err(Error::new(
76
- magnus::exception::runtime_error(),
78
+ ruby.exception_runtime_error(),
77
79
  "IO#write returned 0 bytes; cannot make progress",
78
80
  ));
79
81
  }
@@ -87,7 +89,8 @@ impl RbPdf {
87
89
  /// Ruby 値をファイルパス文字列に変換する。`Pathname` 等 `to_path` に応答する
88
90
  /// オブジェクトを受け入れ、そうでなければ `to_str` で暗黙変換する。
89
91
  pub(crate) fn coerce_to_path(value: Value) -> Result<String, Error> {
90
- let responds: bool = value.funcall("respond_to?", (magnus::Symbol::new("to_path"),))?;
92
+ let ruby = Ruby::get().expect("ruby vm");
93
+ let responds: bool = value.funcall("respond_to?", (ruby.to_symbol("to_path"),))?;
91
94
  let converted: Value = if responds {
92
95
  value.funcall("to_path", ())?
93
96
  } else {
@@ -95,14 +98,14 @@ pub(crate) fn coerce_to_path(value: Value) -> Result<String, Error> {
95
98
  };
96
99
  <String>::try_convert(converted).map_err(|_| {
97
100
  Error::new(
98
- magnus::exception::type_error(),
101
+ ruby.exception_type_error(),
99
102
  "path must be a String or respond to to_path",
100
103
  )
101
104
  })
102
105
  }
103
106
 
104
- pub fn define(_ruby: &Ruby, fulgur: &RModule) -> Result<(), Error> {
105
- let class = fulgur.define_class("Pdf", magnus::class::object())?;
107
+ pub fn define(ruby: &Ruby, fulgur: &RModule) -> Result<(), Error> {
108
+ let class = fulgur.define_class("Pdf", ruby.class_object())?;
106
109
  class.define_method("bytesize", method!(RbPdf::bytesize, 0))?;
107
110
  class.define_method("to_s", method!(RbPdf::to_s, 0))?;
108
111
  class.define_method("to_base64", method!(RbPdf::to_base64, 0))?;
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fulgur
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.11
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitsuru Hayasaka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-04-22 00:00:00.000000000 Z
11
+ date: 2026-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rb_sys