jekyll-documents 0.1.2 → 0.2.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: 3764cd33724860fdb0325ef5552df27221b66588fb7edda7eec81523fa393f5d
4
- data.tar.gz: 2792f1be315312a19aa77eec29e788f3b04193fc7cde9da0522546164bf4885c
3
+ metadata.gz: d806534ca1d7d2b56106885f003e99845646369f842d03a01ac330a5f8dbaacc
4
+ data.tar.gz: 50ff80ef20340823fd852265f87f90d6eb630aa56e3795cfc2ca3a58b94fb612
5
5
  SHA512:
6
- metadata.gz: ead7f7d8a71316d40e47ca53c356257a4bfc5a4d0885b924899347690b48682e9b03fd0330a145afd323f5c5e7cf01c4d6aa8f49074f26be246d40c2f87bf169
7
- data.tar.gz: 84f1545b85bfdd385c26ecaf0efc21f9851c5bd564081c64df52b07e402bfcca338e5608cbb4e341f791f271cc70a8fd36447faf700a4bc741ce6399177ef755
6
+ metadata.gz: cf282187748db50d46e256dcee6f2f9b8b7e34f5e265acf35b4b1d4a5bda55950b66a668000f58aacad9195241c0b8e30e84fd06ad493be2cbc4f238cb3b28ed
7
+ data.tar.gz: 95bd40229f6c2cd987e35bf6fab49d89f09a6070bbacf2bb5cedf412866bc368f458e367804a19e4f2fa1479cd2cfdbfab13acfce0ccc9af69aee9fa9be2b294
data/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.2.0] - 2026-03-12
4
+
5
+ ### Added
6
+ - **Comprehensive code quality tools** (RuboCop, Reek, Bundler Audit, SimpleCov)
7
+ - **98.99% test coverage** with integration tests for Liquid tags
8
+ - **Enhanced release automation** with 10 safety checks and validations
9
+ - **Pre-commit hooks** for automatic quality checks
10
+ - **Dry-run mode** for release preview
11
+ - **Rollback capability** for undoing releases
12
+ - **Automated CHANGELOG templates** when bumping versions
13
+ - **Release notes generator** with clipboard integration
14
+ - **Git status and dependency checks** before release
15
+ - **Version consistency validation** across files
16
+ - **Post-release verification** with helpful links
17
+
18
+ ### Changed
19
+ - **Consolidated documentation** (README.Development.md combines all dev docs)
20
+ - **Simplified README.md** with KISS approach
21
+ - **Improved Rake tasks** with better organization and help system
22
+ - **Enhanced test suite** with 79 passing tests
23
+ - **Better error handling** in release scripts
24
+
25
+ ### Fixed
26
+ - **Liquid tag testing** through integration tests (resolves 98% coverage)
27
+ - **Keyword argument compatibility** in filters
28
+ - **Release script safety** with comprehensive validation
29
+ - **Documentation consistency** across all markdown files
30
+
31
+ ### Development
32
+ - **Quality metrics**: 98.99% coverage • 0 vulnerabilities • 3 RuboCop offenses
33
+ - **Release workflow**: Fully automated with rollback capability
34
+ - **Testing**: 79 examples, 0 failures, integration tests for all features
35
+
3
36
  ## [0.1.2] - 2026-03-09
4
37
 
5
38
  ### Added
data/README.md CHANGED
@@ -1,13 +1,8 @@
1
1
  # jekyll-documents
2
2
 
3
- Turn files in `assets/documents/` into browsable document pages with icons, categories, and search.
3
+ Turn files in `assets/documents/` into browsable document pages.
4
4
 
5
- **Features:**
6
- - Auto-collection from files
7
- - File type icons (4 styles)
8
- - Categories from folders
9
- - Client-side search
10
- - Strict validation
5
+ **Features**: Auto-collection • File icons • Categories • Search
11
6
 
12
7
  ## Quick Start
13
8
 
@@ -38,89 +33,67 @@ assets/documents/minutes/2026-02-15_Board_Meeting.docx
38
33
  {% include category_list.html %}
39
34
  ```
40
35
 
41
- ## Requirements
42
-
43
- Ruby >= 2.7, Jekyll >= 4.0
44
36
  ## File Naming
45
37
 
46
- **Format:** `YYYY-MM-DD_Title_With_Underscores.ext`
38
+ **Format**: `YYYY-MM-DD_Title.ext`
47
39
 
48
40
  ```
49
41
  assets/documents/reports/2026-03-01_Annual_Report.pdf
50
- assets/documents/minutes/2026-02-15_Board_Meeting.docx
51
42
  ```
52
43
 
53
- - Date: `YYYY-MM-DD`
54
- - Title: Underscores → spaces
55
- - Category: From folder name
56
-
57
-
58
-
59
- ## File Type Icons
60
-
61
- The plugin automatically displays file type icons for all supported formats. Icons are included in the gem and based on designs from [svgrepo.com](https://www.svgrepo.com/).
44
+ Date `YYYY-MM-DD` • Title → underscores to spaces • Category → folder name
62
45
 
63
- **Icon Sets:** color (default), lines, minimal, ultra-minimal
46
+ ## Icons
64
47
 
65
- **Supported:** PDF, DOCX, XLSX, PPTX, ODT, ODS, ODP, TXT, ZIP, MP3, MP4, JPG, PNG, HTML, XML, CSV, RTF
48
+ 4 icon sets: `color` (default), `lines`, `minimal`, `ultra-minimal`
66
49
 
67
- **Configuration:**
68
50
  ```yaml
69
51
  documents:
70
- icon_set: "color" # color, lines, minimal, ultra-minimal
52
+ icon_set: "color"
71
53
  ```
72
54
 
73
- **Icons appear in:** document pages, lists, search results, category folders
74
-
75
- **Liquid filters:**
76
55
  ```liquid
77
56
  {{ page.file_type | file_type_icon_tag }}
78
- {{ page.file_type | file_type_icon }}
79
57
  ```
80
58
 
81
- *Icons from [svgrepo.com](https://www.svgrepo.com/)*
82
-
83
- ## Includes
59
+ ## Usage
84
60
 
85
61
  ```liquid
86
62
  {% include latest_documents.html count=5 %}
87
63
  {% include documents_list.html %}
88
- {% include category_list.html %}
89
64
  {% include documents_search.html %}
90
65
  ```
91
66
 
92
- ## Search
93
-
94
- ```html
95
- <script src="https://unpkg.com/lunr/lunr.js"></script>
96
- <script src="{{ '/assets/js/documents-search.js' | relative_url }}"></script>
97
- ```
98
67
  ## Configuration
99
68
 
100
69
  ```yaml
101
70
  documents:
102
71
  root: "assets/documents"
103
- permalink: "/documents/:category/:slug/"
104
- icon_set: "color" # color, lines, minimal, ultra-minimal
105
- include_extensions: [".pdf", ".docx", ".pptx", ".xlsx"]
72
+ icon_set: "color"
106
73
  strict_filename: true
107
- json_index: true
108
74
  ```
109
75
 
110
76
  See [configuration.rb](lib/jekyll/documents/configuration.rb) for all options.
77
+
111
78
  ## Development
112
79
 
113
80
  ```bash
114
- bundle install
115
- bundle exec rspec # Run tests
116
- bundle exec rake doc # Generate docs
117
- cd example && bundle exec jekyll serve # Example site
81
+ rake # All quality checks
82
+ rake quick # Fast check
83
+ rake help # Show commands
118
84
  ```
119
85
 
120
- ## License
86
+ **Quality**: 98.99% coverage • 0 vulnerabilities • RuboCop • Reek
87
+
88
+ See [README.Development.md](README.Development.md) for details.
121
89
 
122
- AGPL-3.0-only
90
+ ## Release
123
91
 
124
- ## Attribution
92
+ ```bash
93
+ ./bump_version.sh patch
94
+ ./release.sh
95
+ ```
96
+
97
+ ## License
125
98
 
126
- Icons by [SVG Repo](https://www.svgrepo.com)
99
+ AGPL-3.0-only • Icons by [SVG Repo](https://www.svgrepo.com)
@@ -3,22 +3,25 @@
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "jekyll-documents"
5
5
  spec.version = File.read(File.expand_path("lib/jekyll/documents/version.rb", __dir__))
6
- .match(/VERSION\s*=\s*"([^"]+)"/)[1]
6
+ .match(/VERSION\s*=\s*"([^"]+)"/)[1]
7
7
  spec.authors = ["Svend Gundestrup"]
8
8
  spec.email = ["no-reply@borg-collective.eu"]
9
9
 
10
- spec.summary = "Auto-generate Jekyll pages for documents (PDF/DOCX/...) with category/date/title parsing."
11
- spec.description = "A Jekyll plugin + theme that scans assets/documents/**, creates a collection item per file, " \
12
- "adds metadata (title/date/category), outputs pages, generates a JSON index for Lunr, and integrates with jekyll-sitemap."
10
+ spec.summary = "Auto-generate Jekyll pages for documents (PDF/DOCX/...) " \
11
+ "with category/date/title parsing."
12
+ spec.description = "A Jekyll plugin + theme that scans assets/documents/**, " \
13
+ "creates a collection item per file, adds metadata " \
14
+ "(title/date/category), outputs pages, generates " \
15
+ "a JSON index for Lunr, and integrates with jekyll-sitemap."
13
16
  spec.homepage = "https://github.com/gundestrup/jekyll-documents"
14
17
  spec.license = "AGPL-3.0-only"
15
18
 
16
19
  spec.metadata = {
17
- "source_code_uri" => "https://github.com/gundestrup/jekyll-documents",
18
- "bug_tracker_uri" => "https://github.com/gundestrup/jekyll-documents/issues",
19
- "changelog_uri" => "https://github.com/gundestrup/jekyll-documents/blob/main/CHANGELOG.md",
20
+ "source_code_uri" => "https://github.com/gundestrup/jekyll-documents",
21
+ "bug_tracker_uri" => "https://github.com/gundestrup/jekyll-documents/issues",
22
+ "changelog_uri" => "https://github.com/gundestrup/jekyll-documents/blob/main/CHANGELOG.md",
20
23
  "documentation_uri" => "https://github.com/gundestrup/jekyll-documents",
21
- "homepage_uri" => "https://github.com/gundestrup/jekyll-documents",
24
+ "homepage_uri" => "https://github.com/gundestrup/jekyll-documents",
22
25
  "rubygems_mfa_required" => "true"
23
26
  }
24
27
 
@@ -29,8 +32,13 @@ Gem::Specification.new do |spec|
29
32
  spec.require_paths = ["lib"]
30
33
 
31
34
  spec.add_dependency "jekyll", ">= 4.0"
32
-
33
- spec.add_development_dependency "rspec", "~> 3.12"
35
+
36
+ spec.add_development_dependency "bundler-audit", "~> 0.9"
34
37
  spec.add_development_dependency "rake", "~> 13.0"
38
+ spec.add_development_dependency "reek", "~> 6.1"
39
+ spec.add_development_dependency "rspec", "~> 3.12"
40
+ spec.add_development_dependency "rubocop", "~> 1.60"
41
+ spec.add_development_dependency "rubocop-performance", "~> 1.20"
42
+ spec.add_development_dependency "simplecov", "~> 0.22"
35
43
  spec.add_development_dependency "yard", "~> 0.9"
36
44
  end
@@ -104,7 +104,8 @@ module Jekyll
104
104
  def file_type_icon(file_type, context = nil)
105
105
  icon_set = get_icon_set(context)
106
106
  icons = ICON_MAP[icon_set] || ICON_MAP["color"]
107
- icons[file_type.to_s.downcase] || "/assets/icons/#{icon_set}/unknown-document-svgrepo-com.svg"
107
+ icons[file_type.to_s.downcase] ||
108
+ "/assets/icons/#{icon_set}/unknown-document-svgrepo-com.svg"
108
109
  end
109
110
 
110
111
  # Returns an HTML img tag for the file type icon
@@ -114,7 +115,8 @@ module Jekyll
114
115
  # @param context [Liquid::Context] the Liquid context for accessing site config
115
116
  # @return [String] HTML img tag
116
117
  # @example
117
- # file_type_icon_tag('pdf') #=> '<img src="/assets/icons/color/pdf.svg" alt="PDF file" class="file-icon" />'
118
+ # file_type_icon_tag('pdf') #=> \
119
+ # '<img src="/assets/icons/color/pdf.svg" alt="PDF file" class="file-icon" />'
118
120
  def file_type_icon_tag(file_type, css_class: "file-icon", alt: nil, context: nil)
119
121
  url = file_type_icon(file_type, context)
120
122
  alt_text = alt || "#{file_type.upcase} file"
@@ -128,13 +130,14 @@ module Jekyll
128
130
  # @return [String] the icon set name
129
131
  def get_icon_set(context)
130
132
  return "color" unless context
131
-
133
+
132
134
  site_config = context.registers[:site]&.config
133
135
  documents_config = site_config["documents"] if site_config
134
136
  icon_set = documents_config["icon_set"] if documents_config
135
-
137
+
136
138
  # Validate icon set exists
137
139
  return "color" unless icon_set && ICON_MAP.key?(icon_set)
140
+
138
141
  icon_set
139
142
  end
140
143
  end
@@ -9,12 +9,12 @@ module Jekyll
9
9
  }.freeze
10
10
 
11
11
  # Slugify while handling Danish letters and basic punctuation cleanup.
12
- def documents_slugify(input, downcase = true, danish_map = true)
12
+ def documents_slugify(input, downcase: true, danish_map: true)
13
13
  s = input.to_s.dup
14
14
  s = s.gsub(/[æøåÆØÅ]/) { |ch| DANISH_MAP[ch] } if danish_map
15
15
  s = s.strip.gsub(/[^\p{Alnum}\-_\s]/u, "")
16
- s = s.tr(" ", "-").gsub(/-+/, "-")
17
- s = s.gsub(/[æøåÆØÅ]/, "") unless danish_map # Remove Danish chars if mapping disabled
16
+ s = s.tr(" ", "-").squeeze("-")
17
+ s = s.gsub(/[æøåÆØÅ]/, "") unless danish_map # Remove Danish chars if mapping disabled
18
18
  s = s.downcase if downcase
19
19
  s
20
20
  end
@@ -35,14 +35,14 @@ module Jekyll
35
35
  end
36
36
  next unless @config["include_extensions"].include?(ext)
37
37
 
38
- rel_path = path.start_with?(site.source) ? path[(site.source.length + 1)..-1] : path
38
+ rel_path = path.start_with?(site.source) ? path[(site.source.length + 1)..] : path
39
39
  category = infer_category_from(rel_path)
40
40
  basename = File.basename(path, ext)
41
41
 
42
42
  date, title, valid = parse_filename(basename)
43
43
  if !valid && @config["strict_filename"]
44
44
  ::Jekyll.logger.abort_with "jekyll-documents",
45
- "Filename must be 'YYYY-MM-DD_Title.ext' → #{rel_path}"
45
+ "Filename must be 'YYYY-MM-DD_Title.ext' → #{rel_path}"
46
46
  end
47
47
 
48
48
  slug = build_slug(basename)
@@ -57,13 +57,13 @@ module Jekyll
57
57
  doc.data["title"] = title
58
58
  doc.data["date"] = date || File.mtime(path)
59
59
  doc.data["category"] = remap_category(category)
60
- doc.data["file_url"] = "/" + rel_path
60
+ doc.data["file_url"] = "/#{rel_path}"
61
61
  doc.data["extension"] = ext
62
62
  doc.data["file_type"] = ext.sub(".", "").downcase
63
63
  doc.data["slug"] = slug
64
64
  doc.data["permalink"] = @config["permalink"]
65
- .gsub(":category", doc.data["category"].to_s)
66
- .gsub(":slug", slug)
65
+ .gsub(":category", doc.data["category"].to_s)
66
+ .gsub(":slug", slug)
67
67
 
68
68
  doc.content = "Auto-generated document page."
69
69
 
@@ -99,7 +99,8 @@ module Jekyll
99
99
  # @return [String] the category name
100
100
  def infer_category_from(rel_path)
101
101
  return "uncategorized" unless @config["categories_from_path"]
102
- category_dir = File.dirname(rel_path).sub("#{@config['root']}", "")
102
+
103
+ category_dir = File.dirname(rel_path).sub(@config["root"].to_s, "")
103
104
  category_dir.split("/").reject(&:empty?).last || "uncategorized"
104
105
  end
105
106
 
@@ -116,7 +117,8 @@ module Jekyll
116
117
  # @return [Array<Date, String, Boolean>] date, title, and validity flag
117
118
  def parse_filename(basename)
118
119
  if basename =~ /^(\d{4})-(\d{2})-(\d{2})_(.+)$/
119
- date = Date.parse("#{Regexp.last_match(1)}-#{Regexp.last_match(2)}-#{Regexp.last_match(3)}")
120
+ date = Date.parse("#{Regexp.last_match(1)}-#{Regexp.last_match(2)}-" \
121
+ "#{Regexp.last_match(3)}")
120
122
  title = Regexp.last_match(4).tr("_", " ")
121
123
  [date, title, true]
122
124
  else
@@ -131,10 +133,14 @@ module Jekyll
131
133
  # @return [String] the generated slug
132
134
  def build_slug(basename)
133
135
  s = basename.sub(/^\d{4}-\d{2}-\d{2}_/, "")
134
- s = s.gsub(/[æøåÆØÅ]/, {"æ"=>"ae","ø"=>"oe","å"=>"aa","Æ"=>"Ae","Ø"=>"Oe","Å"=>"Aa"}) if @config["slug_danish_map"]
136
+ if @config["slug_danish_map"]
137
+ s = s.gsub(/[æøåÆØÅ]/,
138
+ { "æ" => "ae", "ø" => "oe", "å" => "aa", "Æ" => "Ae", "Ø" => "Oe",
139
+ "Å" => "Aa" })
140
+ end
135
141
  s = s.downcase if @config["slug_downcase"]
136
- s = s.gsub(/[^\p{Alnum}\-_\s]/u, "").tr("_ ", "--").gsub(/-+/, "-")
137
- s = s.sub(/^-+/, "").sub(/-+$/, "") # Remove leading/trailing hyphens
142
+ s = s.gsub(/[^\p{Alnum}\-_\s]/u, "").tr("_ ", "--").squeeze("-")
143
+ s = s.sub(/^-+/, "").sub(/-+$/, "") # Remove leading/trailing hyphens
138
144
  s.empty? ? "untitled" : s
139
145
  end
140
146
  end
@@ -18,11 +18,11 @@ module Jekyll
18
18
 
19
19
  items = docs.map do |d|
20
20
  {
21
- "url" => d.url,
22
- "title" => d.data["title"],
23
- "category" => d.data["category"],
24
- "date" => (d.data["date"] || Time.at(0)).strftime("%Y-%m-%d"),
25
- "slug" => d.data["slug"],
21
+ "url" => d.url,
22
+ "title" => d.data["title"],
23
+ "category" => d.data["category"],
24
+ "date" => (d.data["date"] || Time.at(0)).strftime("%Y-%m-%d"),
25
+ "slug" => d.data["slug"],
26
26
  "file_type" => d.data["file_type"],
27
27
  "extension" => d.data["extension"]
28
28
  }
@@ -7,7 +7,7 @@ module Jekyll
7
7
  super
8
8
  @args = parse_args(markup)
9
9
  end
10
-
10
+
11
11
  public_class_method :new
12
12
 
13
13
  def render(context)
@@ -35,18 +35,21 @@ module Jekyll
35
35
 
36
36
  def escape_html(text)
37
37
  return "" unless text
38
+
38
39
  text.to_s.gsub(/[&<>"']/, {
39
- "&" => "&amp;",
40
- "<" => "&lt;",
41
- ">" => "&gt;",
42
- '"' => "&quot;",
43
- "'" => "&#39;"
44
- })
40
+ "&" => "&amp;",
41
+ "<" => "&lt;",
42
+ ">" => "&gt;",
43
+ '"' => "&quot;",
44
+ "'" => "&#39;"
45
+ })
45
46
  end
46
47
 
47
48
  def parse_args(markup)
48
49
  # supports: count:5 category:'referat'
49
50
  args = {}
51
+ # Safe: markup comes from Jekyll template authors (trusted), not end users
52
+ # Runs only during static site generation, not on user requests
50
53
  markup.scan(/(\w+)\s*:\s*'([^']*)'|(\w+)\s*:\s*([^\s]+)/).each do |m|
51
54
  if m[0]
52
55
  args[m[0]] = m[1]
@@ -61,4 +64,3 @@ module Jekyll
61
64
  end
62
65
 
63
66
  Liquid::Template.register_tag("latest_documents", Jekyll::Documents::LatestDocumentsTag)
64
-
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Documents
5
- VERSION = "0.1.2"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-documents
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Svend Gundestrup
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-09 00:00:00.000000000 Z
11
+ date: 2026-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -25,19 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rspec
28
+ name: bundler-audit
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.12'
33
+ version: '0.9'
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: '3.12'
40
+ version: '0.9'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,76 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '13.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: reek
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '6.1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '6.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.12'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.12'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.60'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.60'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-performance
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.20'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.20'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.22'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.22'
55
125
  - !ruby/object:Gem::Dependency
56
126
  name: yard
57
127
  requirement: !ruby/object:Gem::Requirement