unbrace 0.5.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5c5f1b2af0a18d498126a5aaec25c2a8310f5f5e527102162d32ddd4b2cce49d
4
+ data.tar.gz: 98eed7afd2b05a27ef189d12429e5942e4c9e849dd3692b4c2238b09a520d65d
5
+ SHA512:
6
+ metadata.gz: d93760f4f5a65918966282cfa755dbe6f5c9ddfc76d9fa2b78b828f4bd6df0585de4ad0ced9bdfbd43b420f6331c49078d8da345f8d1e2bef011bbcd064a6f13
7
+ data.tar.gz: 3ac1a167f444665e8f59e0697593bcaa5758b2acaf1d98f811f9ed5284df04072ec0870c1433012c24ac6020a2cc48333fd3eb2e45a7b52e631158f3facdd523
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # unbrace
2
+
3
+ ```unbrace``` is a Ruby gem to expand braces, similar to a file glob.
4
+
5
+ ## Usage
6
+
7
+ Just call ```String#unbrace``` for any string containing embeded braces to expand.
8
+
9
+ ## Example
10
+
11
+ ```ruby
12
+ irb> puts "lawyer_{name,{work,home}_email_{active,inactive},state}".unbrace
13
+ lawyer_name
14
+ lawyer_work_email_active
15
+ lawyer_work_email_inactive
16
+ lawyer_home_email_active
17
+ lawyer_home_email_inactive
18
+ lawyer_state
19
+ ```
20
+
21
+ ## Test
22
+
23
+ ```
24
+ ruby -runbrace test/test.rb
25
+ ```
26
+
27
+ ## License
28
+
29
+ This software is licensed under terms of the MIT License.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require "rake/extensiontask"
2
+
3
+ spec = Gem::Specification.load("unbrace.gemspec")
4
+ Rake::ExtensionTask.new("unbrace", spec)
@@ -0,0 +1,3 @@
1
+ require 'mkmf'
2
+
3
+ create_makefile 'unbrace'
@@ -0,0 +1,86 @@
1
+ // ============================================================================
2
+ // Summary: unbrace.c - Offers String#unbrace, which expands braces in strings.
3
+ // Version: 0.5.0
4
+ // Author: Steve Shreeve (steve.shreeve@gmail.com)
5
+ // Date: December 16, 2023
6
+ // Legal: Same license as Ruby (see http://www.ruby-lang.org/en/LICENSE.txt)
7
+ // Note: This file is derived from "dir.c" in the Ruby source code.
8
+ // ============================================================================
9
+
10
+ #include "ruby/ruby.h"
11
+ // FIXME: Encoding requires(?) others, such as #include "ruby/encoding.h"
12
+
13
+ static int
14
+ brace_expand(const char *str, VALUE ary) // FIXME: Add ",rb_encoding *enc)" here?
15
+ {
16
+ const char *p = str;
17
+ const char *pend = p + strlen(p);
18
+ const char *s = p;
19
+ const char *lbrace = 0, *rbrace = 0;
20
+ int nest = 0, status = 0;
21
+
22
+ while (*p) {
23
+ if (*p == '{' && nest++ == 0) {
24
+ lbrace = p;
25
+ }
26
+ if (*p == '}' && lbrace && --nest == 0) {
27
+ rbrace = p;
28
+ break;
29
+ }
30
+ if (*p == '\\' && !*++p) {
31
+ break;
32
+ }
33
+ p++; // FIXME: For encoding, use Inc(p, pend, enc) here?
34
+ }
35
+
36
+ if (lbrace && rbrace) {
37
+ size_t len = strlen(s) + 1;
38
+ char *buf = (char *) malloc(len); // FIXME: Use ALLOC_N(...) here?
39
+ long shift;
40
+
41
+ if (!buf) return -1;
42
+ memcpy(buf, s, lbrace - s);
43
+ shift = (lbrace - s);
44
+ p = lbrace;
45
+ while (p < rbrace) {
46
+ const char *t = ++p;
47
+ nest = 0;
48
+ while (p < rbrace && !(*p == ',' && nest == 0)) {
49
+ if (*p == '{') nest++;
50
+ if (*p == '}') nest--;
51
+ if (*p == '\\' && (++p == rbrace)) break;
52
+ p++; // FIXME: For encoding, use Inc(p, pend, enc) here?
53
+ }
54
+ memcpy(buf + shift, t, p - t);
55
+ strlcpy(buf + shift + (p - t), rbrace + 1, len - (shift + (p - t)));
56
+ status = brace_expand(buf, ary);
57
+ }
58
+ free(buf); // FIXME: Use GLOB_FREE(buf) here?
59
+ }
60
+ else if (!lbrace && !rbrace) {
61
+ rb_ary_push(ary, rb_str_new_cstr(str));
62
+ status = 1;
63
+ }
64
+
65
+ return status;
66
+ }
67
+
68
+ static VALUE
69
+ rb_str_unbrace(VALUE str)
70
+ {
71
+ if (!rb_block_given_p()) {
72
+ VALUE ary = rb_ary_new();
73
+ brace_expand(RSTRING_PTR(str), ary);
74
+ return ary;
75
+ }
76
+ else {
77
+ return Qnil;
78
+ }
79
+ }
80
+
81
+ void
82
+ Init_unbrace(void)
83
+ {
84
+ VALUE rb_cString = rb_define_class("String", rb_cObject);
85
+ rb_define_method(rb_cString, "unbrace", rb_str_unbrace, 0);
86
+ }
data/test/test.rb ADDED
@@ -0,0 +1,17 @@
1
+ require "unbrace"
2
+
3
+ strs = <<'EOS'
4
+ 1{2,{3,4}5{6,7},8}{9,{a,b,c},d}e
5
+ a{b,{c,d}_e_{f,g},h}{i,{j,k,l},m}n
6
+ lawyer_{name,{work,home}_email_{active,inactive},state}
7
+ ~/{Downloads,Pictures}/*.{jpg,gif,png}
8
+ It{{em,alic}iz,erat}e{d,}, please.
9
+ {,{,gotta have{ ,\, again\, }}more }cowbell!
10
+ {}} some }{,{\\{ edge, edge} \,}{ cases, {here} \\\\\}
11
+ EOS
12
+
13
+ strs.each_line do |s|
14
+ puts s.chomp!
15
+ puts s.unbrace
16
+ puts
17
+ end
data/unbrace.gemspec ADDED
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "unbrace"
5
+ s.version = `grep -m 1 '^// Version:' ext/unbrace/unbrace.c | cut -f 3 -d ' '`
6
+ s.author = "Steve Shreeve"
7
+ s.email = "steve.shreeve@gmail.com"
8
+ s.summary = "A Ruby gem that expands braces in strings"
9
+ s.description = "Expand braces, similar to a file glob"
10
+ s.homepage = "https://github.com/shreeve/unbrace"
11
+ s.license = "MIT"
12
+ s.platform = Gem::Platform::RUBY
13
+ s.files = `git ls-files`.split("\n") - %w[.gitignore]
14
+ s.extensions << 'ext/unbrace/extconf.rb'
15
+ s.add_development_dependency "bundler", "~> 2.0"
16
+ s.add_development_dependency "rake", "~> 13.1"
17
+ s.add_development_dependency "rake-compiler", "~> 1.2"
18
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
19
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: unbrace
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - Steve Shreeve
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-12-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '13.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '13.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.2'
55
+ description: Expand braces, similar to a file glob
56
+ email: steve.shreeve@gmail.com
57
+ executables: []
58
+ extensions:
59
+ - ext/unbrace/extconf.rb
60
+ extra_rdoc_files: []
61
+ files:
62
+ - Gemfile
63
+ - README.md
64
+ - Rakefile
65
+ - ext/unbrace/extconf.rb
66
+ - ext/unbrace/unbrace.c
67
+ - test/test.rb
68
+ - unbrace.gemspec
69
+ homepage: https://github.com/shreeve/unbrace
70
+ licenses:
71
+ - MIT
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubygems_version: 3.4.22
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: A Ruby gem that expands braces in strings
92
+ test_files: []