cloudcannon-jekyll-bookshop 2.0.0.pre.alpha.44

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4f3cc065be28b6d52075ceddab5f62ffa9d14e0ef19a02aad79d2a586d678171
4
+ data.tar.gz: 3809d9d32e5aed6d97ef19f4ca710c9af902ec0bffb1f04e2f8058617820d90e
5
+ SHA512:
6
+ metadata.gz: 06137dc1f3ea58db04db9d1d2bc3c5e203e66518b53bb7a189e95db2592e658a934a9dfdf923286ceb1288bcd8126a1f08c381f28b391a57a1da7f740b1181c4
7
+ data.tar.gz: f7018edcd9a7d08b1e342f80ec20d021eafe72abddce4d8e1eab032d1cef785d30d702270ef3285728c251d8877d7a83e84a4c16384445c09eecaa885c808f92
data/.rubocop.yml ADDED
@@ -0,0 +1,27 @@
1
+ require: rubocop-jekyll
2
+
3
+ inherit_gem:
4
+ rubocop-jekyll: .rubocop.yml
5
+
6
+ AllCops:
7
+ TargetRubyVersion: 2.4
8
+ Include:
9
+ - lib/**/*.rb
10
+ - spec/**/*.rb
11
+
12
+ Exclude:
13
+ - .gitignore
14
+ - .rspec
15
+ - .rubocop.yml
16
+ - .travis.yml
17
+ - Gemfile.lock
18
+ - HISTORY.md
19
+ - LICENSE.txt
20
+ - README.md
21
+ - script/**/*
22
+ - vendor/**/*
23
+ - gemfiles/**/*
24
+
25
+ Naming/MemoizedInstanceVariableName:
26
+ Exclude:
27
+ - lib/cloudcannon-jekyll-bookshop/page-without-a-file.rb
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem "rubocop"
7
+ gem "hashdiff"
8
+ gem "rake"
9
+ gem "minitest"
10
+ gem 'minitest-reporters'
11
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,120 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ cloudcannon-jekyll-bookshop (2.0.0.pre.alpha.44)
5
+ dry-inflector (>= 0.1, < 1.0)
6
+ jekyll (>= 3.7, < 5.0)
7
+ node-runner (>= 1.0, < 2.0)
8
+ toml-rb (>= 2.0, < 3.0)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ addressable (2.8.0)
14
+ public_suffix (>= 2.0.2, < 5.0)
15
+ ansi (1.5.0)
16
+ ast (2.4.2)
17
+ builder (3.2.4)
18
+ citrus (3.0.2)
19
+ cloudcannon-jekyll (2.0.1)
20
+ jekyll (>= 2.4.0, < 5)
21
+ colorator (1.1.0)
22
+ concurrent-ruby (1.1.9)
23
+ dry-inflector (0.2.1)
24
+ em-websocket (0.5.2)
25
+ eventmachine (>= 0.12.9)
26
+ http_parser.rb (~> 0.6.0)
27
+ eventmachine (1.2.7)
28
+ ffi (1.15.3)
29
+ forwardable-extended (2.6.0)
30
+ hashdiff (1.0.1)
31
+ http_parser.rb (0.6.0)
32
+ i18n (1.8.10)
33
+ concurrent-ruby (~> 1.0)
34
+ jaro_winkler (1.5.4)
35
+ jekyll (4.2.0)
36
+ addressable (~> 2.4)
37
+ colorator (~> 1.0)
38
+ em-websocket (~> 0.5)
39
+ i18n (~> 1.0)
40
+ jekyll-sass-converter (~> 2.0)
41
+ jekyll-watch (~> 2.0)
42
+ kramdown (~> 2.3)
43
+ kramdown-parser-gfm (~> 1.0)
44
+ liquid (~> 4.0)
45
+ mercenary (~> 0.4.0)
46
+ pathutil (~> 0.9)
47
+ rouge (~> 3.0)
48
+ safe_yaml (~> 1.0)
49
+ terminal-table (~> 2.0)
50
+ jekyll-sass-converter (2.1.0)
51
+ sassc (> 2.0.1, < 3.0)
52
+ jekyll-watch (2.2.1)
53
+ listen (~> 3.0)
54
+ kramdown (2.3.1)
55
+ rexml
56
+ kramdown-parser-gfm (1.1.0)
57
+ kramdown (~> 2.0)
58
+ liquid (4.0.3)
59
+ listen (3.6.0)
60
+ rb-fsevent (~> 0.10, >= 0.10.3)
61
+ rb-inotify (~> 0.9, >= 0.9.10)
62
+ mercenary (0.4.0)
63
+ minitest (5.14.4)
64
+ minitest-reporters (1.4.3)
65
+ ansi
66
+ builder
67
+ minitest (>= 5.0)
68
+ ruby-progressbar
69
+ node-runner (1.0.1)
70
+ parallel (1.20.1)
71
+ parser (3.0.2.0)
72
+ ast (~> 2.4.1)
73
+ pathutil (0.16.2)
74
+ forwardable-extended (~> 2.6)
75
+ public_suffix (4.0.6)
76
+ rainbow (3.0.0)
77
+ rake (13.0.6)
78
+ rb-fsevent (0.11.0)
79
+ rb-inotify (0.10.1)
80
+ ffi (~> 1.0)
81
+ rexml (3.2.5)
82
+ rouge (3.26.0)
83
+ rubocop (0.80.1)
84
+ jaro_winkler (~> 1.5.1)
85
+ parallel (~> 1.10)
86
+ parser (>= 2.7.0.1)
87
+ rainbow (>= 2.2.2, < 4.0)
88
+ rexml
89
+ ruby-progressbar (~> 1.7)
90
+ unicode-display_width (>= 1.4.0, < 1.7)
91
+ rubocop-jekyll (0.11.0)
92
+ rubocop (>= 0.68.0, < 0.81.0)
93
+ rubocop-performance (~> 1.2)
94
+ rubocop-performance (1.6.1)
95
+ rubocop (>= 0.71.0)
96
+ ruby-progressbar (1.11.0)
97
+ safe_yaml (1.0.5)
98
+ sassc (2.4.0)
99
+ ffi (~> 1.9)
100
+ terminal-table (2.0.0)
101
+ unicode-display_width (~> 1.1, >= 1.1.1)
102
+ toml-rb (2.0.1)
103
+ citrus (~> 3.0, > 3.0)
104
+ unicode-display_width (1.6.1)
105
+
106
+ PLATFORMS
107
+ ruby
108
+
109
+ DEPENDENCIES
110
+ cloudcannon-jekyll (>= 2.0, < 3.0)
111
+ cloudcannon-jekyll-bookshop!
112
+ hashdiff
113
+ minitest
114
+ minitest-reporters
115
+ rake
116
+ rubocop
117
+ rubocop-jekyll (~> 0.11)
118
+
119
+ BUNDLED WITH
120
+ 2.1.4
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rake'
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.libs.push 'lib'
8
+ t.libs.push 'specs'
9
+ t.verbose = true
10
+ t.warning = false
11
+ t.pattern = "spec/**/*_spec.rb"
12
+ t.test_files = FileList['spec/**/*_spec.rb']
13
+ end
14
+
15
+ desc "Run tests"
16
+ task :default => [:test]
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/cloudcannon-jekyll-bookshop/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "cloudcannon-jekyll-bookshop"
7
+ spec.version = CloudCannonJekyllBookshop::VERSION
8
+ spec.authors = ["Liam Bigelow"]
9
+ spec.email = ["liam@cloudcannon.com"]
10
+ spec.homepage = "https://github.com/cloudcannon/bookshop"
11
+ spec.summary = "A Jekyll plugin to configure the CloudCannon CMS using bookshop TOML files"
12
+
13
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
14
+
15
+ # Specify which files should be added to the gem when it is released.
16
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
17
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
18
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+ spec.license = "MIT"
24
+
25
+ spec.add_dependency "jekyll", ">= 3.7", "< 5.0"
26
+ spec.add_dependency "toml-rb", ">= 2.0", "< 3.0"
27
+ spec.add_dependency "node-runner", ">= 1.0", "< 2.0"
28
+ spec.add_dependency "dry-inflector", ">= 0.1", "< 1.0"
29
+ spec.add_development_dependency "cloudcannon-jekyll", ">= 2.0", "< 3.0"
30
+ spec.add_development_dependency "rubocop", "~> 0.80"
31
+ spec.add_development_dependency "rubocop-jekyll", "~> 0.11"
32
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jekyll"
4
+ require_relative "./cloudcannon-jekyll-bookshop/output-site-data"
5
+ require_relative "./cloudcannon-jekyll-bookshop/structures"
6
+
7
+ Jekyll::Hooks.register :site, :after_init do |site|
8
+ CloudCannonJekyllBookshop::Structures.build_structures(site)
9
+ end
10
+
11
+ Jekyll::Hooks.register :site, :post_write do |site|
12
+ CloudCannonJekyllBookshop::SiteData.output(site)
13
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json/ext"
4
+ require_relative "./page-without-a-file"
5
+
6
+ module CloudCannonJekyllBookshop
7
+ class SiteData
8
+ def self.output(site)
9
+ @site = site
10
+ return unless @site.data["_bookshop_site_data"]
11
+
12
+ output_payload = @site.data["_bookshop_site_data"].to_json
13
+
14
+ filename = "bookshop-site-data"
15
+ generate_file(filename, output_payload)
16
+ end
17
+
18
+ def self.generate_file(filename, content)
19
+ dest = destination_json_path(filename)
20
+ FileUtils.mkdir_p(File.dirname(dest))
21
+ File.open(dest, "w") { |file| file.write(content) }
22
+ @site.keep_files ||= []
23
+ @site.keep_files << json_path(filename)
24
+ end
25
+
26
+ def self.destination_json_path(filename)
27
+ Jekyll.sanitized_path(@site.dest, json_path(filename))
28
+ end
29
+
30
+ def self.json_path(filename)
31
+ "_cloudcannon/#{filename}.json"
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CloudCannonJekyllBookshop
4
+ # Utility class to help generate files with no source file
5
+ class PageWithoutAFile < Jekyll::Page
6
+ def read_yaml(*)
7
+ @data ||= {}
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+ require "toml-rb"
5
+ require "dry/inflector"
6
+ require "node-runner"
7
+
8
+ module CloudCannonJekyllBookshop
9
+ # Parses a bookshop and creates CloudCannon CMS structures
10
+ class Structures
11
+ def self.get_default_component_name(path)
12
+ @node_bookshop.NiceLabel(get_component_key(path))
13
+ end
14
+
15
+ def self.get_component_key(path)
16
+ @node_bookshop.GetComponentKey(path)
17
+ end
18
+
19
+ def self.rewrite_bookshop_toml(content)
20
+ @node_bookshop.RewriteTOML(content)
21
+ end
22
+
23
+ def self.parse_bookshop_toml(content)
24
+ rewritten_content = rewrite_bookshop_toml(content)
25
+ TomlRB.parse(rewritten_content)
26
+ end
27
+
28
+ def self.load_component(path)
29
+ begin
30
+ component = parse_bookshop_toml(path)
31
+ rescue StandardError => e
32
+ Jekyll.logger.error "Bookshop:",
33
+ "❌ Error Parsing Story: #{f}"
34
+ Jekyll.logger.error "",
35
+ e.message
36
+ end
37
+ component
38
+ end
39
+
40
+ def self.transform_component(path, component)
41
+ transformed_components = @node_bookshop.TransformComponent(path, component)
42
+ @structure_count += transformed_components.size
43
+ transformed_components
44
+ end
45
+
46
+ def self.add_structure(hash, component)
47
+ array_structures = component.delete("array_structures")
48
+ array_structures.each do |key|
49
+ hash[key] ||= {}
50
+ hash[key]["values"] ||= []
51
+ hash[key]["values"].push(component)
52
+ end
53
+ end
54
+
55
+ def self.build_from_location(base_path, site)
56
+ site.config["_select_data"] ||= {}
57
+ site.config["_array_structures"] ||= {}
58
+ Jekyll.logger.info "Bookshop:",
59
+ "Parsing Stories from #{base_path}"
60
+
61
+ threads = []
62
+ Dir.glob("**/*.{bookshop}.{toml,tml,tom,tm}", :base => base_path).each do |f|
63
+ threads << Thread.new do
64
+ raw_file = File.read(base_path + "/" + f)
65
+ component = load_component(raw_file)
66
+
67
+ transform_component(f, component).each do |transformed_component|
68
+ add_structure(site.config["_array_structures"], transformed_component)
69
+ end
70
+ end
71
+ end
72
+ threads.each(&:join)
73
+ end
74
+
75
+ def self.setup_helpers
76
+ @inflector = Dry::Inflector.new
77
+ @node_bookshop = NodeRunner.new(
78
+ <<~JAVASCRIPT
79
+ const {Version: TNVersion, RewriteTOML} = require('@bookshop/toml-narrator');
80
+ const {Version: CSVersion, TransformComponent, GetComponentKey, NiceLabel} = require('@bookshop/cloudcannon-structures');
81
+ JAVASCRIPT
82
+ )
83
+ end
84
+
85
+ def self.tn_version
86
+ @node_bookshop.TNVersion
87
+ end
88
+
89
+ def self.cs_version
90
+ @node_bookshop.CSVersion
91
+ end
92
+
93
+ def self.build_structures(site)
94
+ structure_start = Time.now
95
+ @structure_count = 0
96
+
97
+ setup_helpers
98
+
99
+ bookshop_locations = site.config["bookshop_locations"]&.collect do |location|
100
+ Pathname.new("#{site.source}/#{location}/components").cleanpath.to_s
101
+ end
102
+ bookshop_locations = bookshop_locations&.select do |location|
103
+ Dir.exist?(location)
104
+ end
105
+ bookshop_locations&.each do |base_path|
106
+ build_from_location(base_path, site)
107
+ end
108
+
109
+ elapsed_time = Time.now - structure_start
110
+ Jekyll.logger.info "Bookshop:",
111
+ "#{@structure_count} structure#{@structure_count == 1 ? "" : "s"}
112
+ built in #{elapsed_time.round(2)}s ✅"
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CloudCannonJekyllBookshop
4
+ VERSION = "2.0.0.pre.alpha.44"
5
+ end
metadata ADDED
@@ -0,0 +1,181 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cloudcannon-jekyll-bookshop
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0.pre.alpha.44
5
+ platform: ruby
6
+ authors:
7
+ - Liam Bigelow
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-07-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jekyll
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.7'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.7'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: toml-rb
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '2.0'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '3.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '2.0'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '3.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: node-runner
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '1.0'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '2.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '1.0'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '2.0'
73
+ - !ruby/object:Gem::Dependency
74
+ name: dry-inflector
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0.1'
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0.1'
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '1.0'
93
+ - !ruby/object:Gem::Dependency
94
+ name: cloudcannon-jekyll
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '2.0'
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '2.0'
110
+ - - "<"
111
+ - !ruby/object:Gem::Version
112
+ version: '3.0'
113
+ - !ruby/object:Gem::Dependency
114
+ name: rubocop
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '0.80'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '0.80'
127
+ - !ruby/object:Gem::Dependency
128
+ name: rubocop-jekyll
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '0.11'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '0.11'
141
+ description:
142
+ email:
143
+ - liam@cloudcannon.com
144
+ executables: []
145
+ extensions: []
146
+ extra_rdoc_files: []
147
+ files:
148
+ - ".rubocop.yml"
149
+ - Gemfile
150
+ - Gemfile.lock
151
+ - Rakefile
152
+ - cloudcannon-jekyll-bookshop.gemspec
153
+ - lib/cloudcannon-jekyll-bookshop.rb
154
+ - lib/cloudcannon-jekyll-bookshop/output-site-data.rb
155
+ - lib/cloudcannon-jekyll-bookshop/page-without-a-file.rb
156
+ - lib/cloudcannon-jekyll-bookshop/structures.rb
157
+ - lib/cloudcannon-jekyll-bookshop/version.rb
158
+ homepage: https://github.com/cloudcannon/bookshop
159
+ licenses:
160
+ - MIT
161
+ metadata: {}
162
+ post_install_message:
163
+ rdoc_options: []
164
+ require_paths:
165
+ - lib
166
+ required_ruby_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: 2.3.0
171
+ required_rubygems_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">"
174
+ - !ruby/object:Gem::Version
175
+ version: 1.3.1
176
+ requirements: []
177
+ rubygems_version: 3.0.3
178
+ signing_key:
179
+ specification_version: 4
180
+ summary: A Jekyll plugin to configure the CloudCannon CMS using bookshop TOML files
181
+ test_files: []