kar 0.1.1 → 0.1.2

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: bd14a44367840ddf1ed8e199a4682bd4cfad4f734d06d3220d7aee30e92ea64c
4
- data.tar.gz: fdd7c35b0aded9a6c25de853e6274cf4cd4a524c4f6113ceee710182d6188ee7
3
+ metadata.gz: 997bfcbcd92bf9aea3625eaa6f66622c9077e93e754c83328ee48a24d0d42a59
4
+ data.tar.gz: 1a32d287aa169199d98d8af143c3a12be8c84b3be894faf7c5a32479bf1887c8
5
5
  SHA512:
6
- metadata.gz: 21cbecd6b7218e5d17d081db576e90015688d5957d796b65899138ee6e12a42a1d7a44447e70d16b65992fe2b7b0129eebe6a6a34c8d455a5c596aa1c15bea78
7
- data.tar.gz: 40c5df4efcce865bb3f03fb9483a0b33313acbf6f6462bb33b89b2481dfae8497d7c664251f51b8b0d43ce84e4cc4e0ee3df28d00ecd85c79e9a20f25a43a9de
6
+ metadata.gz: d71c84b1473e99ceb209f8c9510f66823446be3ae68aca1e31e389f6ff5c23c6bdcad4cf3886e28b8144dbf7c04c76ef4dede8ed2721d6d75e9d5ae11e28c0c9
7
+ data.tar.gz: 240afac657222785391bb06b87254137e9fdacc71c323e155a12787d51abe163221c4c0560d1bb6bc89d68f1fbdd8fcb985a01f2ff1be289afdedbb4241a253a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.2] - 2025-10-26
4
+
5
+ - CargoTask, build extension in Rust
6
+
3
7
  ## [0.1.1] - 2025-10-24
4
8
 
5
9
  - URITask, handle redirection
data/README.md CHANGED
@@ -23,6 +23,7 @@ Usage
23
23
  download "local/path/to/file" => "https://example.net/remote/path/to/file"
24
24
  FILES = FileList["fileA", "fileB", "fileC"]
25
25
  files FILES
26
+ cargo "my_gem"
26
27
 
27
28
  Development
28
29
  -----------
data/kar.gemspec CHANGED
@@ -1,10 +1,6 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "lib/kar/version"
4
-
5
1
  Gem::Specification.new do |spec|
6
2
  spec.name = "kar"
7
- spec.version = Kar::VERSION
3
+ spec.version = "0.1.2"
8
4
  spec.authors = ["Kitaiti Makoto"]
9
5
  spec.email = ["KitaitiMakoto@gmail.com"]
10
6
 
@@ -0,0 +1,113 @@
1
+ require "rake/clean"
2
+ require "rubygems/ext"
3
+ require "json"
4
+ require "shellwords"
5
+ require "stringio"
6
+
7
+ module Kar
8
+ class CargoTask
9
+ include Rake::DSL
10
+
11
+ def initialize(target)
12
+ @target = target
13
+
14
+ define
15
+ end
16
+
17
+ private
18
+
19
+ def verbose?
20
+ Rake.verbose == true
21
+ end
22
+
23
+ def define
24
+ file dl_path => [manifest, lock_file] + src do |t|
25
+ results = Results.new
26
+ begin
27
+ Gem::Ext::CargoBuilder.new.build t.source, ".", results, [], lib_dir, File.expand_path(ext_dir)
28
+ rescue => error
29
+ $stderr.puts results unless verbose?
30
+ fail
31
+ end
32
+ end
33
+ CLEAN.include dl_name, dl_path
34
+
35
+ namespace :cargo do
36
+ task @target => dl_path
37
+
38
+ # TODO: Consider the case `target` is "validate"
39
+ namespace :validate do
40
+ task @target => manifest do |t|
41
+ `cargo metadata --format-version=1 --manifest-path=#{manifest.shellescape} --locked --quiet`
42
+ fail unless $?.success?
43
+ end
44
+ end
45
+
46
+ desc "Validate Cargo.lock files"
47
+ task validate: "cargo:validate:#{@target}"
48
+ end
49
+
50
+ desc "Build all extensions in Rust"
51
+ task cargo: "cargo:#{@target}"
52
+ end
53
+
54
+ def gemspec
55
+ @gemspec ||= Gem::Specification.load("#{@target}.gemspec")
56
+ end
57
+
58
+ def manifest
59
+ @manifest ||= gemspec.extensions.first
60
+ end
61
+
62
+ def lock_file
63
+ @lock_file ||= manifest.ext(".lock")
64
+ end
65
+
66
+ def ext_dir
67
+ @ext_dir ||= File.dirname(manifest)
68
+ end
69
+
70
+ def lib_dir
71
+ # When a gem include an extension, the first element of require_paths is the directory for extensions and the second is for Ruby files.
72
+ @lib_dir ||= gemspec.require_paths[1]
73
+ end
74
+
75
+ def dl_name
76
+ @dl_name ||= "#{gemspec.name}.#{RbConfig::CONFIG["DLEXT"]}"
77
+ end
78
+
79
+ def dl_path
80
+ @dl_path ||= File.join(lib_dir, dl_name)
81
+ end
82
+
83
+ def src
84
+ @src ||= FileList["#{ext_dir}/src/*/*.rs"]
85
+ end
86
+
87
+ class Results
88
+ def initialize
89
+ @io = verbose? ? $stdout : StringIO.new
90
+ end
91
+
92
+ def <<(output)
93
+ # Always break a line even when output isn't terminated by a line break
94
+ @io.puts output
95
+ end
96
+
97
+ def to_s
98
+ if verbose?
99
+ ""
100
+ else
101
+ @io.rewind
102
+ @io.read
103
+ end
104
+ end
105
+
106
+ private
107
+
108
+ def verbose?
109
+ Rake.verbose == true
110
+ end
111
+ end
112
+ end
113
+ end
data/lib/kar/dsl.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "kar/uritask"
2
+ require "kar/cargotask"
2
3
 
3
4
  module Kar
4
5
  # DSLs you can use in your Rakefiles
@@ -18,6 +19,9 @@ module Kar
18
19
  #
19
20
  # # Downloads file from https://example.com/remote/file and save to local/file
20
21
  # download "local/file" => "https://example.org/remote/file"
22
+ #
23
+ # # Build extension in Rust
24
+ # cargo "my_gem"
21
25
  module DSL
22
26
  def files(file_list)
23
27
  file_list.each do |file_name|
@@ -46,6 +50,27 @@ module Kar
46
50
  URITask.new args
47
51
  end
48
52
 
53
+ # Declare a cargo task which builds extension in Rust by Cargo.
54
+ #
55
+ # @example
56
+ # # Rakefile
57
+ # cargo "my_gem"
58
+ #
59
+ # task build: :cargo
60
+ #
61
+ # # shell
62
+ # % rake cargo
63
+ #
64
+ # Also defines a cargo:validate task which validates version `Cargo.lock`s are up-to-date.
65
+ # It's useful to add them to the dependency of build task and prevent building invalid gem package.
66
+ #
67
+ # Uses {https://docs.ruby-lang.org/en/master/Gem/Ext/CargoBuilder.html Gem::Ext::CargoBuilder} internally unlike {https://oxidize-rb.org/docs/api-reference/rb-sys-gem-config#rbsysextensiontask RbSys::ExtensionTask}
68
+ # in order to build in the same way as `gem install` command, even though the output might be less usefull.
69
+ # When `RbSys::Extension` uses the same way, this function may be deprecated.
70
+ def cargo(target)
71
+ CargoTask.new target
72
+ end
73
+
49
74
  Rake::DSL.prepend self
50
75
  end
51
76
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kitaiti Makoto
@@ -80,9 +80,9 @@ files:
80
80
  - agpl-3.0.txt
81
81
  - kar.gemspec
82
82
  - lib/kar.rb
83
+ - lib/kar/cargotask.rb
83
84
  - lib/kar/dsl.rb
84
85
  - lib/kar/uritask.rb
85
- - lib/kar/version.rb
86
86
  - sig/kar.rbs
87
87
  homepage: https://gitlab.com/KitaitiMakoto/kar
88
88
  licenses:
data/lib/kar/version.rb DELETED
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kar
4
- VERSION = "0.1.1"
5
- end