gitlab-glfm-markdown 0.0.4 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Cargo.lock +249 -245
- data/LICENSE +9 -2
- data/README.md +26 -3
- data/ext/glfm_markdown/Cargo.toml +10 -4
- data/ext/glfm_markdown/extconf.rb +3 -1
- data/ext/glfm_markdown/src/glfm.rs +33 -11
- data/ext/glfm_markdown/src/lib.rs +28 -5
- data/ext/glfm_markdown/src/main.rs +121 -41
- data/lib/glfm_markdown/loader.rb +8 -0
- data/lib/glfm_markdown/version.rb +1 -1
- data/lib/glfm_markdown.rb +26 -4
- metadata +16 -14
data/LICENSE
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
-
|
1
|
+
Copyright (c) 2011-present GitLab B.V.
|
2
2
|
|
3
|
-
|
3
|
+
Portions of this software are licensed as follows:
|
4
|
+
|
5
|
+
* All content residing under the "doc/" directory of this repository is licensed under "Creative Commons: CC BY-SA 4.0 license".
|
6
|
+
* All content that resides under the "ee/" directory of this repository, if that directory exists, is licensed under the license defined in "ee/LICENSE".
|
7
|
+
* All content that resides under the "jh/" directory of this repository, if that directory exists, is licensed under the license defined in "jh/LICENSE".
|
8
|
+
* All client-side JavaScript (when served directly or after being compiled, arranged, augmented, or combined), is licensed under the "MIT Expat" license.
|
9
|
+
* All third party components incorporated into the GitLab Software are licensed under the original license provided by the owner of the applicable component.
|
10
|
+
* Content outside of the above mentioned directories or restrictions above is available under the "MIT Expat" license as defined below.
|
4
11
|
|
5
12
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
13
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# GitLab Flavored Markdown
|
2
2
|
|
3
|
+
[![Pipeline status](https://gitlab.com/gitlab-org/ruby/gems/gitlab-glfm-markdown/badges/main/pipeline.svg)](https://gitlab.com/gitlab-org/ruby/gems/gitlab-glfm-markdown/-/commits/main)
|
4
|
+
[![Latest Release](https://gitlab.com/gitlab-org/ruby/gems/gitlab-glfm-markdown/-/badges/release.svg)](https://gitlab.com/gitlab-org/ruby/gems/gitlab-glfm-markdown/-/releases)
|
5
|
+
|
3
6
|
Implements GLFM (as used by GitLab) using a Rust-based markdown parser.
|
4
7
|
|
5
8
|
This project is currently EXPLORATORY, so anything and everything will change.
|
@@ -22,7 +25,7 @@ Try on command line:
|
|
22
25
|
rake compile
|
23
26
|
bin/console
|
24
27
|
|
25
|
-
GLFMMarkdown.to_html('# header', options: {
|
28
|
+
GLFMMarkdown.to_html('# header', options: { glfm: true })
|
26
29
|
```
|
27
30
|
|
28
31
|
## Development
|
@@ -30,12 +33,32 @@ GLFMMarkdown.to_html('# header', options: {sourcepos: true})
|
|
30
33
|
A command line executable can be built for debugging.
|
31
34
|
|
32
35
|
```
|
33
|
-
|
34
|
-
cargo run --bin glfm_markdown -- --sourcepos
|
36
|
+
cargo run --bin glfm_markdown --features="cli" -- --help
|
37
|
+
cargo run --bin glfm_markdown --features="cli" -- --sourcepos
|
35
38
|
```
|
36
39
|
|
37
40
|
There is a VSCode workspace that allows you to `Debug executable`
|
38
41
|
|
42
|
+
When developing another project locally and using `gitlab-glfm-markdown` by linking
|
43
|
+
directly to the gem's source directory, make sure that you're using the same version
|
44
|
+
of Ruby for the project and the gem. Otherwise you can see unexplained errors when
|
45
|
+
calling into the gem.
|
46
|
+
|
47
|
+
### Releasing a new version
|
48
|
+
|
49
|
+
To release a new version:
|
50
|
+
|
51
|
+
1. Update `lib/glfm_markdown/version.rb` with the version number.
|
52
|
+
1. Update `CHANGELOG.md` with the changes in the release.
|
53
|
+
1. Create a merge request and merge it to `master`.
|
54
|
+
1. Push a new tag to the repository.
|
55
|
+
|
56
|
+
The new version with precompiled, native gems will automatically be
|
57
|
+
published to [RubyGems](https://rubygems.org/gems/gitlab-glfm-markdown) when the
|
58
|
+
pipeline for the tag completes.
|
59
|
+
|
39
60
|
## Contributing
|
40
61
|
|
41
62
|
Bug reports and merge requests are welcome on GitLab at https://gitlab.com/gitlab-org/ruby/gems/gitlab-glfm-markdown.
|
63
|
+
|
64
|
+
Please refer to [CONTRIBUTING](CONTRIBUTING.md) for more details.
|
@@ -1,8 +1,9 @@
|
|
1
1
|
[package]
|
2
2
|
name = "glfm_markdown"
|
3
|
-
version = "0.0.
|
3
|
+
version = "0.0.8"
|
4
4
|
edition = "2021"
|
5
5
|
authors = ["digitalmoksha <bwalker@gitlab.com>"]
|
6
|
+
description = "GitLab Flavored Markdown parser and formatter. 100% CommonMark-compatible. Experimental."
|
6
7
|
publish = false
|
7
8
|
|
8
9
|
[lib]
|
@@ -10,8 +11,13 @@ crate-type = ["cdylib"]
|
|
10
11
|
|
11
12
|
[[bin]]
|
12
13
|
name = "glfm_markdown"
|
14
|
+
required-features = ["cli"]
|
13
15
|
|
14
16
|
[dependencies]
|
15
|
-
|
16
|
-
|
17
|
-
|
17
|
+
clap = { version = "4.0", optional = true, features = ["derive", "string"] }
|
18
|
+
comrak = { version = "0.20.0", default-features = false }
|
19
|
+
magnus = "0.6.2"
|
20
|
+
rb-sys = { version = "0.9.83", default-features = false, features = ["stable-api-compiled-fallback"] }
|
21
|
+
|
22
|
+
[features]
|
23
|
+
cli = ["clap", "comrak/syntect"]
|
@@ -1,6 +1,23 @@
|
|
1
1
|
#[derive(Debug)]
|
2
2
|
pub struct RenderOptions {
|
3
|
+
pub autolink: bool,
|
4
|
+
pub escape: bool,
|
5
|
+
pub description_lists: bool,
|
6
|
+
pub footnotes: bool,
|
7
|
+
pub full_info_string: bool,
|
8
|
+
pub github_pre_lang: bool,
|
9
|
+
pub hardbreaks: bool,
|
10
|
+
pub relaxed_autolinks: bool,
|
11
|
+
pub relaxed_tasklist_character: bool,
|
3
12
|
pub sourcepos: bool,
|
13
|
+
pub smart: bool,
|
14
|
+
pub strikethrough: bool,
|
15
|
+
pub superscript: bool,
|
16
|
+
pub table: bool,
|
17
|
+
pub tagfilter: bool,
|
18
|
+
pub tasklist: bool,
|
19
|
+
pub unsafe_: bool,
|
20
|
+
|
4
21
|
pub debug: bool,
|
5
22
|
}
|
6
23
|
|
@@ -11,20 +28,25 @@ pub fn render(text: String, options: RenderOptions) -> String {
|
|
11
28
|
fn render_comrak(text: String, options: RenderOptions) -> String {
|
12
29
|
let mut comrak_options = comrak::ComrakOptions::default();
|
13
30
|
|
14
|
-
comrak_options.extension.
|
15
|
-
comrak_options.extension.
|
16
|
-
comrak_options.extension.
|
17
|
-
comrak_options.extension.
|
18
|
-
comrak_options.extension.
|
31
|
+
comrak_options.extension.autolink = options.autolink;
|
32
|
+
comrak_options.extension.description_lists = options.description_lists;
|
33
|
+
comrak_options.extension.footnotes = options.footnotes;
|
34
|
+
comrak_options.extension.strikethrough = options.strikethrough;
|
35
|
+
comrak_options.extension.superscript = options.superscript;
|
36
|
+
comrak_options.extension.table = options.table;
|
37
|
+
comrak_options.extension.tagfilter = options.tagfilter;
|
38
|
+
comrak_options.extension.tasklist = options.tasklist;
|
19
39
|
|
20
|
-
comrak_options.render.
|
21
|
-
comrak_options.render.
|
22
|
-
comrak_options.render.
|
23
|
-
comrak_options.render.hardbreaks =
|
40
|
+
comrak_options.render.escape = options.escape;
|
41
|
+
comrak_options.render.full_info_string = options.full_info_string;
|
42
|
+
comrak_options.render.github_pre_lang = options.github_pre_lang;
|
43
|
+
comrak_options.render.hardbreaks = options.hardbreaks;
|
24
44
|
comrak_options.render.sourcepos = options.sourcepos;
|
45
|
+
comrak_options.render.unsafe_ = options.unsafe_;
|
25
46
|
|
26
|
-
comrak_options.parse.
|
27
|
-
comrak_options.parse.
|
47
|
+
comrak_options.parse.relaxed_autolinks = options.relaxed_autolinks;
|
48
|
+
comrak_options.parse.relaxed_tasklist_matching = options.relaxed_tasklist_character;
|
49
|
+
comrak_options.parse.smart = options.smart;
|
28
50
|
|
29
51
|
comrak::markdown_to_html(&text, &comrak_options)
|
30
52
|
}
|
@@ -3,10 +3,33 @@ use magnus::{define_module, function, prelude::*, Error, RHash, Symbol};
|
|
3
3
|
mod glfm;
|
4
4
|
use glfm::{render, RenderOptions};
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
/// Lookup symbol in provided `RHash`. Returns `false` if the key is not present
|
7
|
+
/// or value cannot be converted to a boolean.
|
8
|
+
fn get_opt(arg: &str, options: RHash) -> bool {
|
9
|
+
options.lookup(Symbol::new(arg)).unwrap_or_default()
|
10
|
+
}
|
11
|
+
|
12
|
+
pub fn render_to_html_rs(text: String, options: RHash) -> String {
|
13
|
+
let render_options = RenderOptions {
|
14
|
+
autolink: get_opt("autolink", options),
|
15
|
+
description_lists: get_opt("description_lists", options),
|
16
|
+
escape: get_opt("escape", options),
|
17
|
+
footnotes: get_opt("footnotes", options),
|
18
|
+
full_info_string: get_opt("full_info_string", options),
|
19
|
+
github_pre_lang: get_opt("github_pre_lang", options),
|
20
|
+
hardbreaks: get_opt("hardbreaks", options),
|
21
|
+
relaxed_autolinks: get_opt("relaxed_autolinks", options),
|
22
|
+
relaxed_tasklist_character: get_opt("relaxed_tasklist_character", options),
|
23
|
+
sourcepos: get_opt("sourcepos", options),
|
24
|
+
smart: get_opt("smart", options),
|
25
|
+
strikethrough: get_opt("strikethrough", options),
|
26
|
+
superscript: get_opt("superscript", options),
|
27
|
+
table: get_opt("table", options),
|
28
|
+
tagfilter: get_opt("tagfilter", options),
|
29
|
+
tasklist: get_opt("tasklist", options),
|
30
|
+
unsafe_: get_opt("unsafe", options),
|
31
|
+
debug: get_opt("debug", options),
|
32
|
+
};
|
10
33
|
|
11
34
|
render(text, render_options)
|
12
35
|
}
|
@@ -15,7 +38,7 @@ pub fn render_to_html(text: String, options: RHash) -> String {
|
|
15
38
|
fn init() -> Result<(), Error> {
|
16
39
|
let module = define_module("GLFMMarkdown")?;
|
17
40
|
|
18
|
-
module.define_singleton_method("
|
41
|
+
module.define_singleton_method("render_to_html_rs", function!(render_to_html_rs, 2))?;
|
19
42
|
|
20
43
|
Ok(())
|
21
44
|
}
|
@@ -3,52 +3,132 @@ use glfm::{render, RenderOptions};
|
|
3
3
|
use std::io::Read;
|
4
4
|
use std::io::Write;
|
5
5
|
|
6
|
+
use clap::Parser;
|
7
|
+
|
8
|
+
#[derive(Parser, Debug)]
|
9
|
+
#[command(author, version, about, long_about = None)]
|
10
|
+
struct Args {
|
11
|
+
/// CommonMark file(s) to parse; or standard input if none passed
|
12
|
+
#[arg(value_name = "FILE")]
|
13
|
+
file: Option<String>,
|
14
|
+
|
15
|
+
/// Enable 'autolink' extension
|
16
|
+
#[arg(long)]
|
17
|
+
autolink: bool,
|
18
|
+
|
19
|
+
/// Enable 'description-lists' extension
|
20
|
+
#[arg(long)]
|
21
|
+
description_lists: bool,
|
22
|
+
|
23
|
+
/// Escape raw HTML instead of clobbering it
|
24
|
+
#[arg(long)]
|
25
|
+
escape: bool,
|
26
|
+
|
27
|
+
/// Enable 'footnotes' extension
|
28
|
+
#[arg(long)]
|
29
|
+
footnotes: bool,
|
30
|
+
|
31
|
+
/// Enable full info strings for code blocks
|
32
|
+
#[arg(long)]
|
33
|
+
full_info_string: bool,
|
34
|
+
|
35
|
+
/// Use GitHub-style <pre lang> for code blocks
|
36
|
+
#[arg(long)]
|
37
|
+
github_pre_lang: bool,
|
38
|
+
|
39
|
+
/// Treat newlines as hard line breaks
|
40
|
+
#[arg(long)]
|
41
|
+
hardbreaks: bool,
|
42
|
+
|
43
|
+
/// Write output to FILE instead of stdout
|
44
|
+
#[arg(short, long, value_name = "FILE")]
|
45
|
+
output: Option<String>,
|
46
|
+
|
47
|
+
/// Enable relaxing of autolink parsing, allowing links to be recognized when in brackets
|
48
|
+
#[arg(long)]
|
49
|
+
relaxed_autolinks: bool,
|
50
|
+
|
51
|
+
/// Enable relaxing which character is allowed in a tasklists
|
52
|
+
#[arg(long)]
|
53
|
+
relaxed_tasklist_character: bool,
|
54
|
+
|
55
|
+
/// Include source mappings in HTML attributes
|
56
|
+
#[arg(long)]
|
57
|
+
sourcepos: bool,
|
58
|
+
|
59
|
+
/// Use smart punctuation
|
60
|
+
#[arg(long)]
|
61
|
+
smart: bool,
|
62
|
+
|
63
|
+
/// Enable 'strikethrough' extension
|
64
|
+
#[arg(long)]
|
65
|
+
strikethrough: bool,
|
66
|
+
|
67
|
+
/// Enable 'superscript' extension
|
68
|
+
#[arg(long)]
|
69
|
+
superscript: bool,
|
70
|
+
|
71
|
+
/// Enable 'table' extension
|
72
|
+
#[arg(long)]
|
73
|
+
table: bool,
|
74
|
+
|
75
|
+
/// Enable 'tagfilter' extension
|
76
|
+
#[arg(long)]
|
77
|
+
tagfilter: bool,
|
78
|
+
|
79
|
+
/// Enable 'tasklist' extension
|
80
|
+
#[arg(long)]
|
81
|
+
tasklist: bool,
|
82
|
+
|
83
|
+
/// Allow raw HTML and dangerous URLs
|
84
|
+
#[arg(long = "unsafe")]
|
85
|
+
unsafe_: bool,
|
86
|
+
|
87
|
+
/// Show debug information
|
88
|
+
#[arg(long)]
|
89
|
+
debug: bool,
|
90
|
+
}
|
91
|
+
|
6
92
|
fn main() {
|
7
|
-
let mut
|
8
|
-
let
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
cli.refer(&mut input)
|
19
|
-
.add_argument("file", argparse::Store, "File to read");
|
20
|
-
cli.refer(&mut output)
|
21
|
-
.add_option(&["-o", "--output"], argparse::Store, "File to write");
|
22
|
-
cli.refer(&mut sourcepos).add_option(
|
23
|
-
&["--sourcepos"],
|
24
|
-
argparse::StoreTrue,
|
25
|
-
"Include source mappings in HTML attributes.",
|
26
|
-
);
|
27
|
-
cli.refer(&mut debug).add_option(
|
28
|
-
&["--debug"],
|
29
|
-
argparse::StoreTrue,
|
30
|
-
"Show debug information",
|
31
|
-
);
|
32
|
-
|
33
|
-
cli.parse_args_or_exit();
|
34
|
-
}
|
35
|
-
|
36
|
-
let vec = if input == "-" {
|
37
|
-
let mut vec = Vec::new();
|
38
|
-
std::io::stdin().read_to_end(&mut vec).unwrap();
|
39
|
-
vec
|
40
|
-
} else {
|
41
|
-
std::fs::read(input).unwrap()
|
93
|
+
let mut s: Vec<u8> = Vec::with_capacity(2048);
|
94
|
+
let cli = Args::parse();
|
95
|
+
|
96
|
+
match cli.file {
|
97
|
+
None => {
|
98
|
+
std::io::stdin().read_to_end(&mut s).unwrap();
|
99
|
+
}
|
100
|
+
Some(fs) => {
|
101
|
+
s = std::fs::read(fs).unwrap();
|
102
|
+
}
|
42
103
|
};
|
43
104
|
|
44
|
-
let source = String::from_utf8_lossy(&
|
45
|
-
let options = RenderOptions {
|
105
|
+
let source = String::from_utf8_lossy(&s);
|
106
|
+
let options = RenderOptions {
|
107
|
+
autolink: cli.autolink,
|
108
|
+
description_lists: cli.description_lists,
|
109
|
+
escape: cli.escape,
|
110
|
+
footnotes: cli.footnotes,
|
111
|
+
full_info_string: cli.full_info_string,
|
112
|
+
github_pre_lang: cli.github_pre_lang,
|
113
|
+
hardbreaks: cli.hardbreaks,
|
114
|
+
relaxed_autolinks: cli.relaxed_autolinks,
|
115
|
+
relaxed_tasklist_character: cli.relaxed_tasklist_character,
|
116
|
+
sourcepos: cli.sourcepos,
|
117
|
+
smart: cli.smart,
|
118
|
+
strikethrough: cli.strikethrough,
|
119
|
+
superscript: cli.superscript,
|
120
|
+
table: cli.table,
|
121
|
+
tagfilter: cli.tagfilter,
|
122
|
+
tasklist: cli.tasklist,
|
123
|
+
unsafe_: cli.unsafe_,
|
124
|
+
debug: cli.debug,
|
125
|
+
};
|
46
126
|
|
47
127
|
let result = render(source.to_string(), options);
|
48
128
|
|
49
|
-
if
|
50
|
-
std::
|
129
|
+
if let Some(output_filename) = cli.output {
|
130
|
+
std::fs::write(output_filename, &result).unwrap();
|
51
131
|
} else {
|
52
|
-
std::
|
53
|
-
}
|
132
|
+
std::io::stdout().write_all(result.as_bytes()).unwrap();
|
133
|
+
};
|
54
134
|
}
|
data/lib/glfm_markdown.rb
CHANGED
@@ -1,17 +1,39 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'glfm_markdown/version'
|
4
|
-
require_relative 'glfm_markdown/
|
4
|
+
require_relative 'glfm_markdown/loader'
|
5
5
|
|
6
|
-
|
6
|
+
load_rust_extension
|
7
|
+
|
8
|
+
GLFM_DEFAULT_OPTIONS = {
|
9
|
+
autolink: true,
|
10
|
+
footnotes: true,
|
11
|
+
full_info_string: true,
|
12
|
+
github_pre_lang: false,
|
13
|
+
hardbreaks: false,
|
14
|
+
relaxed_autolinks: false,
|
7
15
|
sourcepos: true,
|
16
|
+
smart: false,
|
17
|
+
strikethrough: true,
|
18
|
+
table: true,
|
19
|
+
tagfilter: false,
|
20
|
+
tasklist: true,
|
21
|
+
unsafe: true,
|
22
|
+
|
8
23
|
debug: false
|
9
24
|
}.freeze
|
10
25
|
|
11
26
|
module GLFMMarkdown
|
12
27
|
class << self
|
13
|
-
def to_html(
|
14
|
-
|
28
|
+
def to_html(markdown, options: {})
|
29
|
+
raise TypeError, 'markdown must be a String' unless markdown.is_a?(String)
|
30
|
+
raise TypeError, 'markdown must be UTF-8 encoded' unless markdown.encoding.name == "UTF-8"
|
31
|
+
raise TypeError, 'options must be a Hash' unless options.is_a?(Hash)
|
32
|
+
|
33
|
+
default_options = options[:glfm] ? GLFM_DEFAULT_OPTIONS : {}
|
34
|
+
options = options.merge(unsafe: true) if options[:tagfilter]
|
35
|
+
|
36
|
+
render_to_html_rs(markdown, default_options.merge(options))
|
15
37
|
end
|
16
38
|
end
|
17
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitlab-glfm-markdown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brett Walker
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-12-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rb_sys
|
@@ -25,19 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.9'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: pry
|
28
|
+
name: pry-byebug
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
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
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,7 +80,7 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.3'
|
83
|
-
description:
|
83
|
+
description: Markdown processing for GitLab Flavored Markdown
|
84
84
|
email:
|
85
85
|
- bwalker@gitlab.com
|
86
86
|
executables: []
|
@@ -97,13 +97,15 @@ files:
|
|
97
97
|
- ext/glfm_markdown/src/lib.rs
|
98
98
|
- ext/glfm_markdown/src/main.rs
|
99
99
|
- lib/glfm_markdown.rb
|
100
|
+
- lib/glfm_markdown/loader.rb
|
100
101
|
- lib/glfm_markdown/version.rb
|
101
102
|
homepage: https://gitlab.com/gitlab-org/ruby/gems/gitlab-glfm-markdown
|
102
|
-
licenses:
|
103
|
+
licenses:
|
104
|
+
- MIT
|
103
105
|
metadata:
|
104
106
|
homepage_uri: https://gitlab.com/gitlab-org/ruby/gems/gitlab-glfm-markdown
|
105
107
|
source_code_uri: https://gitlab.com/gitlab-org/ruby/gems/gitlab-glfm-markdown
|
106
|
-
changelog_uri: https://gitlab.com/gitlab-org/ruby/gems/gitlab-glfm-markdown/-/
|
108
|
+
changelog_uri: https://gitlab.com/gitlab-org/ruby/gems/gitlab-glfm-markdown/-/releases
|
107
109
|
post_install_message:
|
108
110
|
rdoc_options: []
|
109
111
|
require_paths:
|
@@ -112,14 +114,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
112
114
|
requirements:
|
113
115
|
- - ">="
|
114
116
|
- !ruby/object:Gem::Version
|
115
|
-
version:
|
117
|
+
version: '2.7'
|
116
118
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
119
|
requirements:
|
118
120
|
- - ">="
|
119
121
|
- !ruby/object:Gem::Version
|
120
|
-
version:
|
122
|
+
version: '0'
|
121
123
|
requirements: []
|
122
|
-
rubygems_version: 3.
|
124
|
+
rubygems_version: 3.3.26
|
123
125
|
signing_key:
|
124
126
|
specification_version: 4
|
125
127
|
summary: GLFM Markdown
|