extattr 0.2 → 0.4
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 +5 -5
- data/HISTORY.ja.md +49 -0
- data/LICENSE.md +4 -1
- data/QUICKREF.ja.md +112 -0
- data/README.md +55 -132
- data/Rakefile +193 -86
- data/ext/extattr-extattr.h +18 -18
- data/ext/extattr-windows.h +5 -5
- data/ext/extattr-xattr.h +6 -6
- data/ext/extattr.c +279 -217
- data/ext/extconf.rb +6 -7
- data/gemstub.rb +22 -0
- data/lib/extattr.rb +249 -32
- data/test/test_extattr.rb +75 -0
- metadata +34 -24
- data/spec/extattr_spec.rb +0 -62
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0a1d94f6586158eb3abf46fb3fc8d43edd251763379f32e57f77ebfaa1db0a6f
|
4
|
+
data.tar.gz: 80e8c90ee1e866018f7ddc06d621f733f33276b5beaeac8cd9687da3a086a9a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ccd9f917160b92b4cc52e02d56505b5824750a73442b8bad7d71041e3e5bd3f0b81dc2a93b5db14312093df65e12fca78085b7f0fc91c2263c53571821ff5679
|
7
|
+
data.tar.gz: 0b68f33f665fc50938567a64f8adb3ecdec402c699b3bc26e143a41a73ffd489c6b5d6ffdfc5ee813a82f26bef9ff9b1df4e3850ff2bb853274525fefcb86d74
|
data/HISTORY.ja.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# extattr-0.4
|
2
|
+
|
3
|
+
- Ruby 3 の `Ractor` への対応 (thanks @okeeblow, https://github.com/dearblue/ruby-extattr/pull/1)
|
4
|
+
- `bin/extattr` コマンドラインプログラムを削除
|
5
|
+
|
6
|
+
まだ小さな不具合があり、調整が必要です。
|
7
|
+
独立した gem `extattr-cli` として提供することを計画しています。
|
8
|
+
|
9
|
+
|
10
|
+
# extattr-0.3
|
11
|
+
|
12
|
+
extattr-0.2 との互換性はありません。
|
13
|
+
|
14
|
+
- `ExtAttr` モジュールを追加して実装をそちらに移動
|
15
|
+
- `File` クラスに対するメソッドの追加は、リファインメント機能によって拡張されます。
|
16
|
+
```ruby
|
17
|
+
using ExtAttr
|
18
|
+
```
|
19
|
+
- `File::EXTATTR_VERSION` 定数は冗長と判断し削除しました。
|
20
|
+
- `ExtAttr::Accessor` クラスの追加
|
21
|
+
- 拡張属性の操作に特化したオブジェクトを扱えるようになりました。
|
22
|
+
- `bin/extattr` コマンドラインプログラムの追加
|
23
|
+
- mingw でライブラリを構築する時 C 実行時ライブラリを静的リンクするように変更
|
24
|
+
|
25
|
+
# extattr-0.2
|
26
|
+
|
27
|
+
* セーフレベルに関する改善
|
28
|
+
* `$SAFE` と汚染状態を確認するようになりました
|
29
|
+
* 汚染状態を伝播させるようになりました
|
30
|
+
* バージョン情報と実装 API に関する情報の取得
|
31
|
+
* `File::EXTATTR_VERSION` 定数によって、バージョン情報が取得できるようになりました
|
32
|
+
* `File::EXTATTR_IMPLEMENT` 定数によって、実装に関する情報が取得できるようになりました
|
33
|
+
* 機能の改善
|
34
|
+
* `File.extattr_each` / `File#extattr_each` によって、ファイル拡張属性の名前と値を繰り返し取得できるようになりました
|
35
|
+
* Windows 版に関する改善
|
36
|
+
* `File::EXTATTR_NAMESPACE_SYSTEM` によって、本来の拡張ファイル属性の操作が行えるようになりました
|
37
|
+
(NtQueryEaFile / NtSetEaFile)
|
38
|
+
|
39
|
+
# extattr-0.1.2
|
40
|
+
|
41
|
+
# extattr-0.1.1
|
42
|
+
|
43
|
+
# extattr-0.1
|
44
|
+
|
45
|
+
はじめてのりりーす
|
46
|
+
|
47
|
+
* 拡張ファイル属性の一覧、取得、設定、削除を行うことが出来ます
|
48
|
+
* **セキュリティリスクあり**: `$SAFE` の確認や汚染状態の伝播を行ないません
|
49
|
+
* Windows 版では、NTFS ADS に対する操作となります。`File::EXTATTR_NAMESPACE_USER` のみが有効です
|
data/LICENSE.md
CHANGED
data/QUICKREF.ja.md
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
# Quick Reference
|
2
|
+
|
3
|
+
メソッド名に『!』がついているものはシンボリックリンクに対する操作となります。
|
4
|
+
|
5
|
+
キーワード引数の `namespace` を与えると、拡張属性の名前空間を指定できます。
|
6
|
+
|
7
|
+
与えられる値:
|
8
|
+
|
9
|
+
- `ExtAttr::USER`
|
10
|
+
- `ExtAttr::SYSTEM`
|
11
|
+
- `user` 又は `system` を文字列かシンボルで (大文字小文字は区別されない)
|
12
|
+
- `nil` (`ExtAttr::USER` と等価)
|
13
|
+
|
14
|
+
規定値は `ExtAttr::USER` です。
|
15
|
+
|
16
|
+
|
17
|
+
## モジュール `ExtAttr`
|
18
|
+
|
19
|
+
- `ExtAttr.list(path, namespace) -> array`
|
20
|
+
- `ExtAttr.list!(path, namespace) -> array`
|
21
|
+
- `ExtAttr.size(path, namespace, name) -> integer`
|
22
|
+
- `ExtAttr.size!(path, namespace, name) -> integer`
|
23
|
+
- `ExtAttr.get(path, namespace, name) -> string`
|
24
|
+
- `ExtAttr.get!(path, namespace, name) -> string`
|
25
|
+
- `ExtAttr.set(path, namespace, name, value) -> nil`
|
26
|
+
- `ExtAttr.set!(path, namespace, name, value) -> nil`
|
27
|
+
- `ExtAttr.delete(path, namespace, name) -> nil`
|
28
|
+
- `ExtAttr.delete!(path, namespace, name) -> nil`
|
29
|
+
- `ExtAttr.open(path) -> a ExtAttr::Accessor instance`
|
30
|
+
- `ExtAttr.open(path) { |ea| ... } -> returned value from yield block`
|
31
|
+
- `ExtAttr.each(path, namespace) -> an ExtAttr::Accessor instance`
|
32
|
+
- `ExtAttr.each(path, namespace = ExtAttr::USER) -> an enumerator instance`
|
33
|
+
- `ExtAttr.each(path, namespace = ExtAttr::USER) { |name, data| ... } -> path`
|
34
|
+
- `ExtAttr.each!(path, namespace = ExtAttr::USER) -> an enumerator instance`
|
35
|
+
- `ExtAttr.each!(path, namespace = ExtAttr::USER) { |name, data| ... } -> path`
|
36
|
+
|
37
|
+
|
38
|
+
## クラス `ExtAttr::Accessor`
|
39
|
+
|
40
|
+
- `ExtAttr::Accessor#each(namespace: ExtAttr::USER) -> an enumerator instance`
|
41
|
+
- `ExtAttr::Accessor#each(namespace: ExtAttr::USER) { |name, data| ... } -> path`
|
42
|
+
- `ExtAttr::Accessor#list(namespace: ExtAttr::USER) -> array`
|
43
|
+
- `ExtAttr::Accessor#size(name, namespace: ExtAttr::USER) -> integer`
|
44
|
+
- `ExtAttr::Accessor#get(name, namespace: ExtAttr::USER) -> string`
|
45
|
+
- `ExtAttr::Accessor#set(name, data, namespace: ExtAttr::USER) -> nil`
|
46
|
+
- `ExtAttr::Accessor#delete(name, namespace: ExtAttr::USER) -> nil`
|
47
|
+
|
48
|
+
|
49
|
+
## リファインメント `using ExtAttr`
|
50
|
+
|
51
|
+
リファインメント機能を使うことにより、`File` が拡張されます。
|
52
|
+
|
53
|
+
### 拡張属性オブジェクトを生成する
|
54
|
+
|
55
|
+
```ruby:ruby
|
56
|
+
File.extattr(path) -> an ExtAttr::Accessor instance
|
57
|
+
File#extattr -> an ExtAttr::Accessor instance
|
58
|
+
```
|
59
|
+
|
60
|
+
### 拡張属性の属性名を取得
|
61
|
+
|
62
|
+
```ruby:ruby
|
63
|
+
File.extattr_list(path, namespace: ExtAttr::USER) -> array
|
64
|
+
File.extattr_list(path, namespace: ExtAttr::USER) { |name| ... } -> nil
|
65
|
+
File.extattr_list!(path, namespace: ExtAttr::USER) -> array
|
66
|
+
File.extattr_list!(path, namespace: ExtAttr::USER) { |name| ... } -> nil
|
67
|
+
File#extattr_list(namespace: ExtAttr::USER) -> array
|
68
|
+
File#extattr_list(namespace: ExtAttr::USER) { |name| ... } -> nil
|
69
|
+
```
|
70
|
+
|
71
|
+
### 拡張属性の要素の大きさを取得
|
72
|
+
|
73
|
+
```ruby:ruby
|
74
|
+
File.extattr_size(path, name, namespace: ExtAttr::USER) -> size
|
75
|
+
File.extattr_size!(path, name, namespace: ExtAttr::USER) -> size
|
76
|
+
File#extattr_size(name, namespace: ExtAttr::USER) -> size
|
77
|
+
```
|
78
|
+
|
79
|
+
### 拡張属性の要素を取得
|
80
|
+
|
81
|
+
```ruby:ruby
|
82
|
+
File.extattr_get(path, name, namespace: ExtAttr::USER) -> data (String)
|
83
|
+
File.extattr_get!(path, name, namespace: ExtAttr::USER) -> data (String)
|
84
|
+
File#extattr_get(name, namespace: ExtAttr::USER) -> data (String)
|
85
|
+
```
|
86
|
+
|
87
|
+
### 拡張属性の要素を設定
|
88
|
+
|
89
|
+
```ruby:ruby
|
90
|
+
File.extattr_set(path, name, data, namespace: ExtAttr::USER) -> nil
|
91
|
+
File.extattr_set!(path, name, data, namespace: ExtAttr::USER) -> nil
|
92
|
+
File#extattr_set(name, data, namespace: ExtAttr::USER) -> nil
|
93
|
+
```
|
94
|
+
|
95
|
+
### 拡張属性の要素を削除
|
96
|
+
|
97
|
+
```ruby:ruby
|
98
|
+
File.extattr_delete(path, name, namespace: ExtAttr::USER) -> nil
|
99
|
+
File.extattr_delete!(path, name, namespace: ExtAttr::USER) -> nil
|
100
|
+
File#extattr_delete(name, namespace: ExtAttr::USER) -> nil
|
101
|
+
```
|
102
|
+
|
103
|
+
### 拡張属性の属性名と要素を列挙する
|
104
|
+
|
105
|
+
```ruby:ruby
|
106
|
+
File.extattr_each(path, namespace: ExtAttr::USER) -> Enumerator
|
107
|
+
File.extattr_each(path, namespace: ExtAttr::USER) { |name, data| ... } -> nil
|
108
|
+
File.extattr_each!(path, namespace: ExtAttr::USER) -> Enumerator
|
109
|
+
File.extattr_each!(path, namespace: ExtAttr::USER) { |name, data| ... } -> nil
|
110
|
+
File#extattr_each(namespace: ExtAttr::USER) -> Enumerator
|
111
|
+
File#extattr_each(namespace: ExtAttr::USER) { |name, data| ... } -> file
|
112
|
+
```
|
data/README.md
CHANGED
@@ -1,14 +1,9 @@
|
|
1
|
-
#
|
1
|
+
# extattr - filesystem extended attributes manipurator for Ruby
|
2
2
|
|
3
|
-
|
3
|
+
extattr is filesystem extended attributes manipurator for Ruby on FreeBSD, GNU/Linux and Microsoft Windows.
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
***END OF DOCUMENT IN ENGLISH***
|
8
|
-
|
9
|
-
----
|
10
|
-
|
11
|
-
***START OF DOCUMENT IN JAPANESE***
|
5
|
+
- [Quick Reference](QUICKREF.ja.md) (in Japanese)
|
6
|
+
- [HISTORY](HISTORY.ja.md) (in Japanese)
|
12
7
|
|
13
8
|
extattr はファイルシステムの拡張属性を操作するライブラリで、FreeBSD、GNU/Linux、Windows に対応しています。
|
14
9
|
|
@@ -16,146 +11,74 @@ extattr はファイルシステムの拡張属性を操作するライブラリ
|
|
16
11
|
|
17
12
|
実装については、以下のようになっています。
|
18
13
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
## Support ruby version
|
25
|
-
|
26
|
-
- ruby-1.9.3+
|
27
|
-
- ruby-2.0+
|
28
|
-
- ruby-2.1+
|
14
|
+
* FreeBSD: extattr (`extattr_list`, `extattr_get`, `extattr_set`, `extattr_delete`)
|
15
|
+
* GNU/Linux: xattr (`listxattr`, `getxattr`, `setxattr`, `removexattr`)
|
16
|
+
* Microsoft Windows: NTFS ADS (代替データストリーム) / 拡張ファイル属性 (`NtQueryEaFile`, `NtSetEaFile`)
|
29
17
|
|
30
18
|
|
31
19
|
## Tested system
|
32
20
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
## 簡易リファレンスマニュアル
|
40
|
-
|
41
|
-
クラスメソッドに『!』がついているものはシンボリックリンクに対する操作となります。
|
42
|
-
|
43
|
-
キーワード引数の `namespace` を与えると、拡張属性の名前空間を指定できます。
|
44
|
-
|
45
|
-
規定値は `File::EXTATTR_NAMESPACE_USER` で、ほかの値は `File::EXTATTR_NAMESPACE_SYSTEM` のみが指定できます。
|
46
|
-
|
47
|
-
|
48
|
-
### 拡張属性の属性名を取得
|
49
|
-
|
50
|
-
File.extattr_list(path, namespace: File::EXTATTR_NAMESPACE_USER) -> array
|
51
|
-
File.extattr_list(path, namespace: File::EXTATTR_NAMESPACE_USER) { |name| ... } -> nil
|
52
|
-
File.extattr_list!(path, namespace: File::EXTATTR_NAMESPACE_USER) -> array
|
53
|
-
File.extattr_list!(path, namespace: File::EXTATTR_NAMESPACE_USER) { |name| ... } -> nil
|
54
|
-
File#extattr_list(namespace: File::EXTATTR_NAMESPACE_USER) -> array
|
55
|
-
File#extattr_list(namespace: File::EXTATTR_NAMESPACE_USER) { |name| ... } -> nil
|
56
|
-
|
57
|
-
### 拡張属性の要素の大きさを取得
|
58
|
-
|
59
|
-
File.extattr_size(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> size
|
60
|
-
File.extattr_size!(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> size
|
61
|
-
File#extattr_size(name, namespace: File::EXTATTR_NAMESPACE_USER) -> size
|
62
|
-
|
63
|
-
### 拡張属性の要素を取得
|
64
|
-
|
65
|
-
File.extattr_get(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> data (String)
|
66
|
-
File.extattr_get!(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> data (String)
|
67
|
-
File#extattr_get(name, namespace: File::EXTATTR_NAMESPACE_USER) -> data (String)
|
68
|
-
|
69
|
-
### 拡張属性の要素を設定
|
70
|
-
|
71
|
-
File.extattr_set(path, name, data, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
72
|
-
File.extattr_set!(path, name, data, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
73
|
-
File#extattr_set(name, data, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
74
|
-
|
75
|
-
### 拡張属性の要素を削除
|
76
|
-
|
77
|
-
File.extattr_delete(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
78
|
-
File.extattr_delete!(path, name, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
79
|
-
File#extattr_delete(name, namespace: File::EXTATTR_NAMESPACE_USER) -> nil
|
80
|
-
|
81
|
-
### 拡張属性の属性名と要素を列挙する
|
82
|
-
|
83
|
-
File.extattr_each(path, namespace: File::EXTATTR_NAMESPACE_USER) -> Enumerator
|
84
|
-
File.extattr_each(path, namespace: File::EXTATTR_NAMESPACE_USER) { |name, data| ... } -> nil
|
85
|
-
File.extattr_each!(path, namespace: File::EXTATTR_NAMESPACE_USER) -> Enumerator
|
86
|
-
File.extattr_each!(path, namespace: File::EXTATTR_NAMESPACE_USER) { |name, data| ... } -> nil
|
87
|
-
File#extattr_each(namespace: File::EXTATTR_NAMESPACE_USER) -> Enumerator
|
88
|
-
File#extattr_each(namespace: File::EXTATTR_NAMESPACE_USER) { |name, data| ... } -> file
|
21
|
+
* PC-BSD/AMD64 10.0
|
22
|
+
* lubuntu 13.10 (i386)
|
23
|
+
* Microsoft Windows XP Professional SP3
|
24
|
+
* Microsoft Windows 7 Professional SP1
|
89
25
|
|
90
26
|
|
91
27
|
## GNU/Linux における特記事項
|
92
28
|
|
93
|
-
|
29
|
+
* GNU/Linux で利用されている名前空間〈security〉〈trusted〉には未対応です。
|
94
30
|
|
95
31
|
|
96
32
|
## Microsoft Windows における特記事項
|
97
33
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
34
|
+
* Windows XP 以降を必要とします。Win2k でも動作するかもしれません (未検証)。<br>
|
35
|
+
Windows 9x シリーズでは `require "extattr"` の段階で例外が発生すると思われます (未検証)。
|
36
|
+
* ``ExtAttr::USER`` は (比較的よく利用される) NTFS ADS に対する操作で、``ExtAttr::SYSTEM`` が本来の (あまり利用されていない) 拡張ファイル属性に対する操作となります。
|
37
|
+
* リパースポイント (ジャンクションやシンボリックリンク) に対する NTFS ADS は要素の取得や設定、削除は出来ません。<br>
|
38
|
+
必ずリンク先に対する操作となります (やり方がわかりません)。
|
39
|
+
* 64 KiB を超える NTFS ADS は取得も設定も出来ません。<br>
|
40
|
+
これは『拡張属性』と捉えた場合、巨大なデータを扱えるべきではないという考えによるためです
|
41
|
+
(本当のところは FreeBSD の拡張属性が最大 64KiB 弱であることが由来です)。
|
42
|
+
* 巨大な NTFS ADS を扱いたい場合は、``File.open`` でファイルとして扱えるので自由に読み書きできます。<br>
|
43
|
+
これは Ruby に限ったことではなく、Windows による仕様です。<br>
|
44
|
+
この場合の与えるファイル名は、``path + ":" + name`` という形になります。
|
45
|
+
|
46
|
+
``` ruby:ruby
|
47
|
+
filepath = "sample.txt"
|
48
|
+
extattrname = "category"
|
49
|
+
ntfs_ads_name = filepath + ":" + extattrname
|
50
|
+
File.open(ntfs_ads_name, "r") do |file|
|
51
|
+
...
|
52
|
+
end
|
53
|
+
```
|
116
54
|
|
117
55
|
## 既知のバグ
|
118
56
|
|
119
|
-
|
120
|
-
|
121
|
-
解決方法: `extattr_set` か `extattr_delete` のどちらかを同時に利用したい場合、`extattr_list.each` を用いてください。
|
122
|
-
|
123
|
-
|
124
|
-
## 変更履歴
|
125
|
-
|
126
|
-
### 0.1
|
127
|
-
|
128
|
-
はじめてのりりーす
|
129
|
-
|
130
|
-
- 拡張ファイル属性の一覧、取得、設定、削除を行うことが出来ます
|
131
|
-
- **セキュリティリスクあり**: `$SAFE` の確認や汚染状態の伝播を行ないません
|
132
|
-
- Windows 版では、NTFS ADS に対する操作となります。`File::EXTATTR_NAMESPACE_USER` のみが有効です
|
133
|
-
|
134
|
-
### 0.2
|
57
|
+
* ``extattr_list`` のブロック内で ``extattr_set`` ``extattr_delete`` を行うと正確な列挙がされない場合がある
|
135
58
|
|
136
|
-
|
137
|
-
- `$SAFE` と汚染状態を確認するようになりました
|
138
|
-
- 汚染状態を伝播させるようになりました
|
139
|
-
- バージョン情報と実装 API に関する情報の取得
|
140
|
-
- `File::EXTATTR_VERSION` 定数によって、バージョン情報が取得できるようになりました
|
141
|
-
- `File::EXTATTR_IMPLEMENT` 定数によって、実装に関する情報が取得できるようになりました
|
142
|
-
- 機能の改善
|
143
|
-
- `File.extattr_each` / `File#extattr_each` によって、ファイル拡張属性の名前と値を繰り返し取得できるようになりました
|
144
|
-
- Windows 版に関する改善
|
145
|
-
- `File::EXTATTR_NAMESPACE_SYSTEM` によって、本来の拡張ファイル属性の操作が行えるようになりました
|
146
|
-
(NtQueryEaFile / NtSetEaFile)
|
59
|
+
解決方法: ``extattr_set`` か ``extattr_delete`` のどちらかを同時に利用したい場合、``extattr_list.each`` を用いてください。
|
147
60
|
|
148
61
|
|
149
62
|
## 参考資料
|
150
63
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
64
|
+
* extattr
|
65
|
+
* <https://www.freebsd.org/cgi/man.cgi?query=extattr&sektion=2>
|
66
|
+
* xattr
|
67
|
+
* <https://linuxjm.osdn.jp/html/LDP_man-pages/man2/listxattr.2.html>
|
68
|
+
* windows
|
69
|
+
* <https://msdn.microsoft.com/en-us/library/cc232069.aspx>
|
70
|
+
* <https://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/File/FILE_INFORMATION_CLASS.html>
|
71
|
+
* <https://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/File/NtQueryInformationFile.html>
|
72
|
+
* <https://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/File/NtQueryEaFile.html>
|
73
|
+
* <https://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/File/NtSetEaFile.html>
|
74
|
+
* FileTest <http://www.zezula.net/en/fstools/filetest.html> <https://github.com/ladislav-zezula/FileTest>
|
75
|
+
|
76
|
+
## Specification
|
77
|
+
|
78
|
+
- package name: [extattr](https://rubygems.org/gems/extattr)
|
79
|
+
- Author: dearblue
|
80
|
+
- Version: 0.4
|
81
|
+
- Product quality: technical preview
|
82
|
+
- License: [2-clause BSD License](LICENSE.md)
|
83
|
+
- Project page: <https://github.com/dearblue/ruby-extattr>
|
84
|
+
- Support Ruby: Ruby 2.5+
|