bridgetown-core 0.14.1 → 0.15.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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +3 -1
  3. data/bin/bridgetown +9 -23
  4. data/bridgetown-core.gemspec +3 -1
  5. data/lib/bridgetown-core.rb +9 -2
  6. data/lib/bridgetown-core/commands/apply.rb +73 -0
  7. data/lib/bridgetown-core/commands/base.rb +45 -0
  8. data/lib/bridgetown-core/commands/build.rb +91 -86
  9. data/lib/bridgetown-core/commands/clean.rb +30 -29
  10. data/lib/bridgetown-core/commands/concerns/actions.rb +128 -0
  11. data/lib/bridgetown-core/commands/concerns/build_options.rb +76 -0
  12. data/lib/bridgetown-core/commands/concerns/configuration_overridable.rb +18 -0
  13. data/lib/bridgetown-core/commands/concerns/summarizable.rb +13 -0
  14. data/lib/bridgetown-core/commands/console.rb +57 -39
  15. data/lib/bridgetown-core/commands/doctor.rb +126 -126
  16. data/lib/bridgetown-core/commands/new.rb +120 -155
  17. data/lib/bridgetown-core/commands/plugins.rb +167 -130
  18. data/lib/bridgetown-core/commands/registrations.rb +16 -0
  19. data/lib/bridgetown-core/commands/serve.rb +219 -215
  20. data/lib/bridgetown-core/concerns/convertible.rb +1 -4
  21. data/lib/bridgetown-core/concerns/site/renderable.rb +1 -2
  22. data/lib/bridgetown-core/drops/document_drop.rb +9 -1
  23. data/lib/bridgetown-core/drops/page_drop.rb +1 -1
  24. data/lib/bridgetown-core/excerpt.rb +4 -1
  25. data/lib/bridgetown-core/generators/prototype_generator.rb +2 -0
  26. data/lib/bridgetown-core/liquid_renderer.rb +1 -0
  27. data/lib/bridgetown-core/liquid_renderer/file.rb +1 -4
  28. data/lib/bridgetown-core/liquid_renderer/file_system.rb +3 -1
  29. data/lib/bridgetown-core/page.rb +3 -18
  30. data/lib/bridgetown-core/plugin_manager.rb +31 -17
  31. data/lib/bridgetown-core/renderer.rb +31 -18
  32. data/lib/bridgetown-core/tags/include.rb +14 -0
  33. data/lib/bridgetown-core/tags/render_content.rb +39 -16
  34. data/lib/bridgetown-core/tags/with.rb +15 -0
  35. data/lib/bridgetown-core/utils.rb +44 -0
  36. data/lib/bridgetown-core/version.rb +2 -2
  37. data/lib/bridgetown-core/watcher.rb +17 -10
  38. data/lib/site_template/Gemfile.erb +19 -0
  39. data/lib/site_template/bridgetown.config.yml +5 -3
  40. data/lib/site_template/package.json +1 -0
  41. data/lib/site_template/src/_components/footer.liquid +3 -0
  42. data/lib/site_template/src/_components/head.liquid +9 -0
  43. data/lib/site_template/src/{_includes/navbar.html → _components/navbar.liquid} +0 -0
  44. data/lib/site_template/src/_layouts/default.html +3 -3
  45. data/lib/site_template/start.js +1 -1
  46. data/lib/site_template/webpack.config.js +3 -3
  47. metadata +53 -19
  48. data/lib/bridgetown-core/command.rb +0 -112
  49. data/lib/bridgetown-core/commands/help.rb +0 -34
  50. data/lib/site_template/src/_components/.keep +0 -0
  51. data/lib/site_template/src/_includes/footer.html +0 -3
  52. data/lib/site_template/src/_includes/head.html +0 -9
@@ -1,187 +1,152 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "erb"
4
-
5
3
  module Bridgetown
6
4
  module Commands
7
- class New < Command
8
- class << self
9
- DOCSURL = "https://bridgetownrb.com/docs"
10
-
11
- def init_with_program(prog)
12
- prog.command(:new) do |c|
13
- c.syntax "new PATH"
14
- c.description "Creates a new Bridgetown site scaffold in PATH"
15
-
16
- c.option "force", "--force", "Force creation even if PATH already exists"
17
- c.option "skip-bundle", "--skip-bundle", "Skip 'bundle install'"
18
- c.option "skip-yarn", "--skip-yarn", "Skip 'yarn install'"
19
-
20
- c.action do |args, options|
21
- Bridgetown::Commands::New.process(args, options)
22
- end
23
- end
24
- end
25
-
26
- def process(args, options = {})
27
- raise ArgumentError, "You must specify a path." if args.empty?
28
-
29
- new_site_path = File.expand_path(args.join(" "), Dir.pwd)
30
- FileUtils.mkdir_p new_site_path
31
- if preserve_source_location?(new_site_path, options)
32
- Bridgetown.logger.error "Conflict:", "#{new_site_path} exists and is not empty."
33
- Bridgetown.logger.abort_with "", "Ensure #{new_site_path} is empty or else " \
34
- "try again with `--force` to proceed and overwrite any files."
35
- end
36
-
37
- Bridgetown.logger.info("Creating:".green, new_site_path)
5
+ class New < Thor::Group
6
+ include Thor::Actions
7
+ extend Summarizable
38
8
 
39
- create_site new_site_path
40
-
41
- after_install(new_site_path, args.join(" "), options)
42
- end
43
-
44
- def scaffold_post_content
45
- ERB.new(File.read(File.expand_path(scaffold_path, site_template))).result
46
- end
47
-
48
- # Internal: Gets the filename of the sample post to be created
49
- #
50
- # Returns the filename of the sample post, as a String
51
- def initialized_post_name
52
- "src/_posts/#{Time.now.strftime("%Y-%m-%d")}-welcome-to-bridgetown.md"
53
- end
9
+ Registrations.register do
10
+ register(New, "new", "new PATH", New.summary)
11
+ end
54
12
 
55
- private
56
-
57
- def gemfile_contents
58
- <<~RUBY
59
- source "https://rubygems.org"
60
- # Hello! This is where you manage which Bridgetown version is used to run.
61
- # When you want to use a different version, change it below, save the
62
- # file and run `bundle install`. Run Bridgetown with `bundle exec`, like so:
63
- #
64
- # bundle exec bridgetown serve
65
- #
66
- # This will help ensure the proper Bridgetown version is running.
67
- #
68
- # To install a plugin, simply run bundle add and specify the group
69
- # "bridgetown_plugins". For example:
70
- #
71
- # bundle add some-new-plugin -g bridgetown_plugins
72
- #
73
- # Happy Bridgetowning!
74
-
75
- gem "bridgetown", "~> #{Bridgetown::VERSION}"
76
-
77
- RUBY
78
- end
13
+ def self.banner
14
+ "bridgetown new PATH"
15
+ end
16
+ summary "Creates a new Bridgetown site scaffold in PATH"
17
+
18
+ class_option :apply,
19
+ aliases: "-a",
20
+ banner: "PATH|URL",
21
+ desc: "Apply an automation after creating the site scaffold"
22
+ class_option :force,
23
+ type: :boolean,
24
+ desc: "Force creation even if PATH already exists"
25
+ class_option :"skip-bundle",
26
+ type: :boolean,
27
+ desc: "Skip 'bundle install'"
28
+ class_option :"skip-yarn",
29
+ type: :boolean,
30
+ desc: "Skip 'yarn install'"
31
+
32
+ DOCSURL = "https://bridgetownrb.com/docs"
33
+
34
+ def self.exit_on_failure?
35
+ false
36
+ end
79
37
 
80
- def create_site(new_site_path)
81
- create_sample_files new_site_path
38
+ def self.source_root
39
+ File.expand_path("../../site_template", __dir__)
40
+ end
82
41
 
83
- File.open(File.expand_path(initialized_post_name, new_site_path), "w") do |f|
84
- f.write(scaffold_post_content)
85
- end
42
+ class << self
43
+ attr_accessor :created_site_dir
44
+ end
86
45
 
87
- File.open(File.expand_path("Gemfile", new_site_path), "w") do |f|
88
- f.write(gemfile_contents)
89
- end
90
- end
46
+ def new_site
47
+ raise ArgumentError, "You must specify a path." if args.empty?
91
48
 
92
- def preserve_source_location?(path, options)
93
- !options["force"] && !Dir["#{path}/**/*"].empty?
49
+ new_site_path = File.expand_path(args.join(" "), Dir.pwd)
50
+ if preserve_source_location?(new_site_path, options)
51
+ say_status :conflict, "#{new_site_path} exists and is not empty.", :red
52
+ Bridgetown.logger.abort_with "Ensure #{new_site_path} is empty or else " \
53
+ "try again with `--force` to proceed and overwrite any files."
94
54
  end
95
55
 
96
- def create_sample_files(path)
97
- FileUtils.cp_r site_template + "/.", path
98
- FileUtils.chmod_R "u+w", path
99
- FileUtils.rm File.expand_path(scaffold_path, path)
100
- end
56
+ self.destination_root = self.class.created_site_dir = new_site_path
101
57
 
102
- def site_template
103
- File.expand_path("../../site_template", __dir__)
104
- end
58
+ say_status :create, new_site_path
59
+ create_site new_site_path
60
+ after_install new_site_path, args.join(" "), options
61
+ end
105
62
 
106
- def scaffold_path
107
- "src/_posts/0000-00-00-welcome-to-bridgetown.md.erb"
108
- end
63
+ protected
109
64
 
110
- # After a new site has been created, print a success notification and
111
- # then automatically execute bundle install from within the new site dir
112
- # unless the user opts to skip 'bundle install'.
113
- # rubocop:disable Metrics/AbcSize, Metrics/MethodLength #
114
- def after_install(path, cli_path, options = {})
115
- logger = Bridgetown.logger
116
- git_init path
117
-
118
- unless options["skip-bundle"]
119
- begin
120
- require "bundler"
121
- bundle_install path
122
- rescue LoadError
123
- logger.info "Could not load Bundler. Bundle install skipped."
124
- end
125
- end
65
+ def preserve_source_location?(path, options)
66
+ !options["force"] && Dir.exist?(path)
67
+ end
126
68
 
127
- yarn_install path unless options["skip-yarn"]
69
+ def create_site(new_site_path)
70
+ directory ".", ".", exclude_pattern: %r!\.erb|DS_Store$!
71
+ FileUtils.chmod_R "u+w", new_site_path
128
72
 
129
- yarn_start = "yarn start"
73
+ template(
74
+ "src/_posts/0000-00-00-welcome-to-bridgetown.md.erb",
75
+ "src/_posts/#{Time.now.strftime("%Y-%m-%d")}-welcome-to-bridgetown.md"
76
+ )
77
+ template("Gemfile.erb", "Gemfile")
78
+ end
130
79
 
131
- logger.info "Success!".green, "🎉 Your new Bridgetown site was" \
132
- " generated in #{cli_path.cyan}."
133
- if options["skip-yarn"]
134
- logger.info "You can now #{"cd".cyan} #{cli_path.cyan} to get started."
135
- logger.info "You'll probably also want to #{"yarn install".cyan}" \
136
- " to load in your frontend assets."
137
- else
138
- logger.info "You can now #{"cd".cyan} and run #{yarn_start.cyan} to get started."
139
- end
140
- logger.info "Then check out our online documentation for" \
141
- " next steps: #{DOCSURL.cyan}"
142
- logger.info "Bundle install skipped." if options["skip-bundle"]
80
+ # After a new site has been created, print a success notification and
81
+ # then automatically execute bundle install from within the new site dir
82
+ # unless the user opts to skip 'bundle install'.
83
+ # rubocop:todo Metrics/CyclomaticComplexity
84
+ def after_install(path, cli_path, options = {})
85
+ git_init path
86
+
87
+ @skipped_bundle = true # is set to false if bundle install worked
88
+ bundle_install path unless options["skip-bundle"]
89
+
90
+ @skipped_yarn = true
91
+ yarn_install path unless options["skip-yarn"]
92
+
93
+ invoke(Apply, [], options) if options[:apply]
94
+
95
+ logger = Bridgetown.logger
96
+ yarn_start = "yarn start"
97
+ logger.info ""
98
+ logger.info "Success!".green, "🎉 Your new Bridgetown site was" \
99
+ " generated in #{cli_path.cyan}."
100
+ if options["skip-yarn"]
101
+ logger.info "You can now #{"cd".cyan} #{cli_path.cyan} to get started."
102
+ logger.info "You'll probably also want to #{"yarn install".cyan}" \
103
+ " to load in your frontend assets."
104
+ else
105
+ logger.info "You can now #{"cd".cyan} and run #{yarn_start.cyan} to get started."
143
106
  end
144
- # rubocop:enable Metrics/AbcSize, Metrics/MethodLength #
107
+ logger.info "Then check out our online documentation for" \
108
+ " next steps: #{DOCSURL.cyan}"
145
109
 
146
- def bundle_install(path)
147
- Bridgetown.logger.info "Running bundle install in #{path.cyan}..."
148
- Dir.chdir(path) do
149
- exe = Gem.bin_path("bundler", "bundle")
150
- process, output = Bridgetown::Utils::Exec.run("ruby", exe, "install")
151
-
152
- output.to_s.each_line do |line|
153
- Bridgetown.logger.info("Bundler:".green, line.strip) unless line.to_s.empty?
110
+ logger.info "Bundle install skipped.".yellow if @skipped_bundle
111
+ logger.info "Yarn install skipped.".yellow if @skipped_yarn
112
+ end
113
+ # rubocop:enable Metrics/CyclomaticComplexity
114
+
115
+ def bundle_install(path)
116
+ unless Bridgetown.environment == "test"
117
+ require "bundler"
118
+ Bundler.with_clean_env do
119
+ inside(path) do
120
+ run "bundle install", abort_on_failure: true
154
121
  end
155
-
156
- raise SystemExit unless process.success?
157
122
  end
158
123
  end
124
+ @skipped_bundle = false
125
+ rescue LoadError
126
+ say_status :run, "Could not load Bundler. Bundle install skipped.", :red
127
+ rescue SystemExit
128
+ say_status :run, "Problem occured while running bundle install.", :red
129
+ end
159
130
 
160
- def git_init(path)
161
- Dir.chdir(path) do
162
- _process, output = Bridgetown::Utils::Exec.run("git", "init")
163
- output.to_s.each_line do |line|
164
- Bridgetown.logger.info("Git:".green, line.strip) unless line.to_s.empty?
165
- end
131
+ def git_init(path)
132
+ unless Bridgetown.environment == "test"
133
+ inside(path) do
134
+ run "git init", abort_on_failure: true
166
135
  end
167
- rescue SystemCallError
168
136
  end
137
+ rescue SystemExit
138
+ say_status :run, "Could not load git. git init skipped.", :red
139
+ end
169
140
 
170
- def yarn_install(path)
171
- Bridgetown.logger.info "Running yarn install in #{path.cyan}..."
172
- Dir.chdir(path) do
173
- _process, output = Bridgetown::Utils::Exec.run("yarn", "install")
174
- output.to_s.each_line do |line|
175
- next if line.to_s.empty? ||
176
- line.strip.start_with?("warning ") ||
177
- line.include?("No lockfile found")
178
-
179
- Bridgetown.logger.info("Yarn:".green, line.strip)
180
- end
141
+ def yarn_install(path)
142
+ unless Bridgetown.environment == "test"
143
+ inside(path) do
144
+ run "yarn install", abort_on_failure: true
181
145
  end
182
- rescue SystemCallError
183
- Bridgetown.logger.info "Could not load yarn. yarn install skipped."
184
146
  end
147
+ @skipped_yarn = false
148
+ rescue SystemExit
149
+ say_status :run, "Could not load yarn. yarn install skipped.", :red
185
150
  end
186
151
  end
187
152
  end
@@ -2,166 +2,203 @@
2
2
 
3
3
  module Bridgetown
4
4
  module Commands
5
- class Plugins < Command
6
- class << self
7
- def init_with_program(prog)
8
- plugins_cmd = prog.command(:plugins) do |c|
9
- c.syntax "plugins <subcommand>"
10
- c.description "List installed plugins or access plugin content"
11
-
12
- c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", Array,
13
- "Custom configuration file"
14
-
15
- c.action do
16
- output_supercommand_syntax(c)
17
- end
18
- end
5
+ class Plugins < Thor
6
+ include Thor::Actions
7
+ include ConfigurationOverridable
19
8
 
20
- plugins_cmd.command(:list) do |subcmd|
21
- subcmd.syntax "list"
22
- subcmd.description "List information about installed plugins"
9
+ Registrations.register do
10
+ desc "plugins <command>", "List installed plugins or access plugin content"
11
+ subcommand "plugins", Plugins
12
+ end
23
13
 
24
- subcmd.action do |_, options|
25
- list(options)
26
- end
27
- end
14
+ desc "list", "List information about installed plugins"
15
+ def list
16
+ site = Bridgetown::Site.new(configuration_with_overrides(options))
17
+ site.reset
18
+ Bridgetown::Hooks.trigger :site, :pre_read, site
28
19
 
29
- plugins_cmd.command(:cd) do |subcmd|
30
- subcmd.syntax "cd <origin/dir>"
31
- subcmd.description "Open directory (content, layouts, etc.) within the plugin origin"
20
+ pm = site.plugin_manager
32
21
 
33
- subcmd.action do |args, options|
34
- if args.empty?
35
- puts subcmd.to_s
36
- else
37
- cd(args, options)
38
- end
39
- end
40
- end
22
+ plugins_list = pm.class.registered_plugins.reject do |plugin|
23
+ plugin.to_s.end_with? "site_builder.rb"
41
24
  end
42
25
 
43
- def output_supercommand_syntax(supercmd)
44
- puts supercmd.to_s
26
+ Bridgetown.logger.info("Registered Plugins:", plugins_list.length.to_s.yellow.bold)
27
+
28
+ plugins_list.each do |plugin|
29
+ unless plugin.to_s.end_with? "site_builder.rb"
30
+ Bridgetown.logger.info("", plugin.to_s.sub(site.in_root_dir("/"), ""))
31
+ end
45
32
  end
46
33
 
47
- def list(options)
48
- site = Bridgetown::Site.new(configuration_from_options(options))
49
- site.reset
50
- Bridgetown::Hooks.trigger :site, :pre_read, site
34
+ Bridgetown.logger.info("Source Manifests:", "---") unless pm.class.source_manifests.empty?
51
35
 
52
- pm = site.plugin_manager
36
+ pm.class.source_manifests.each do |manifest|
37
+ Bridgetown.logger.info("Origin:", (manifest.origin || "n/a").to_s.green)
38
+ Bridgetown.logger.info("Components:", (manifest.components || "n/a").to_s.cyan)
39
+ Bridgetown.logger.info("Content:", (manifest.content || "n/a").to_s.cyan)
40
+ Bridgetown.logger.info("Layouts:", (manifest.layouts || "n/a").to_s.cyan)
53
41
 
54
- plugins_list = pm.class.registered_plugins.reject do |plugin|
55
- plugin.to_s.end_with? "site_builder.rb"
56
- end
42
+ Bridgetown.logger.info("", "---")
43
+ end
57
44
 
58
- Bridgetown.logger.info("Registered Plugins:", plugins_list.length.to_s.yellow.bold)
45
+ unless Bridgetown.autoload? :Builder
46
+ builders = Bridgetown::Builder.descendants
47
+ Bridgetown.logger.info("Builders:", builders.length.to_s.yellow.bold)
59
48
 
60
- plugins_list.each do |plugin|
61
- unless plugin.to_s.end_with? "site_builder.rb"
62
- Bridgetown.logger.info("", plugin.to_s.sub(site.in_root_dir("/"), ""))
63
- end
49
+ builders.each do |builder|
50
+ name = builder.respond_to?(:custom_name) ? builder.custom_name : builder.name
51
+ name_components = name.split("::")
52
+ last_name = name_components.pop
53
+ name_components.push last_name.magenta
54
+ Bridgetown.logger.info("", name_components.join("::"))
64
55
  end
56
+ end
65
57
 
66
- Bridgetown.logger.info("Source Manifests:", "---") unless pm.class.source_manifests.empty?
58
+ Bridgetown.logger.info("Converters:", site.converters.length.to_s.yellow.bold)
67
59
 
68
- pm.class.source_manifests.each do |manifest|
69
- Bridgetown.logger.info("Origin:", (manifest.origin || "n/a").to_s.green)
70
- Bridgetown.logger.info("Components:", (manifest.components || "n/a").to_s.cyan)
71
- Bridgetown.logger.info("Content:", (manifest.content || "n/a").to_s.cyan)
72
- Bridgetown.logger.info("Layouts:", (manifest.layouts || "n/a").to_s.cyan)
60
+ site.converters.each do |converter|
61
+ name = plugin_name_for(converter)
62
+ name_components = name.split("::")
63
+ last_name = name_components.pop
64
+ name_components.push last_name.magenta
65
+ Bridgetown.logger.info("", name_components.join("::"))
66
+ end
73
67
 
74
- Bridgetown.logger.info("", "---")
75
- end
68
+ Bridgetown.logger.info("Generators:", site.generators.length.to_s.yellow.bold)
76
69
 
77
- unless Bridgetown.autoload? :Builder
78
- builders = Bridgetown::Builder.descendants
79
- Bridgetown.logger.info("Builders:", builders.length.to_s.yellow.bold)
70
+ site.generators.each do |generator|
71
+ name = plugin_name_for(generator)
72
+ name_components = name.split("::")
73
+ last_name = name_components.pop
74
+ name_components.push last_name.magenta
75
+ Bridgetown.logger.info("", name_components.join("::"))
76
+ end
77
+ end
78
+
79
+ long_desc <<-DOC
80
+ Open a directory (content, layouts, etc.) within the plugin origin. \n
81
+ First run bridgetown plugins list to view source manifests currently
82
+ set up on your site.\n
83
+ Then look for the origin of the manifest and the folder you'd like to
84
+ open.\n
85
+ So for example, with an origin of SamplePlugin and a folder of
86
+ Layouts, you'd run:\n
87
+ bridgetown plugins cd SamplePlugin/Layouts
88
+ DOC
89
+ desc "cd <origin/dir>", "Open folder (content, layouts, etc.) within the plugin origin"
90
+
91
+ # This is super useful if you want to copy files out of plugins to override.
92
+ #
93
+ # Example:
94
+ # bridgetown plugins cd AwesomePlugin/layouts
95
+ # cp -r * $BRIDGETOWN_SITE/src/_layouts
96
+ #
97
+ # Now all the plugin's layouts will be in the site repo directly.
98
+ #
99
+ def cd(arg)
100
+ site = Bridgetown::Site.new(configuration_with_overrides(options))
101
+
102
+ pm = site.plugin_manager
103
+
104
+ directive = arg.split("/")
105
+ unless directive[1]
106
+ Bridgetown.logger.warn("Oops!", "Your command needs to be in the <origin/dir> format")
107
+ return
108
+ end
109
+
110
+ manifest = pm.class.source_manifests.find do |source_manifest|
111
+ source_manifest.origin.to_s == directive[0]
112
+ end
80
113
 
81
- builders.each do |builder|
82
- name = builder.respond_to?(:custom_name) ? builder.custom_name : builder.name
83
- name_components = name.split("::")
84
- last_name = name_components.pop
85
- name_components.push last_name.magenta
86
- Bridgetown.logger.info("", name_components.join("::"))
114
+ if manifest&.respond_to?(directive[1].downcase)
115
+ dir = manifest.send(directive[1].downcase)
116
+ Bridgetown.logger.info("Opening the #{dir.green} folder for" \
117
+ " #{manifest.origin.to_s.cyan}…")
118
+ Bridgetown.logger.info("Type #{"exit".yellow} when you're done to" \
119
+ " return to your site root.")
120
+ puts
121
+
122
+ Dir.chdir dir do
123
+ ENV["BRIDGETOWN_SITE"] = site.root_dir
124
+ if ENV["SHELL"]
125
+ system(ENV["SHELL"])
126
+ else
127
+ system("/bin/sh")
87
128
  end
88
129
  end
89
130
 
90
- Bridgetown.logger.info("Converters:", site.converters.length.to_s.yellow.bold)
131
+ puts
132
+ Bridgetown.logger.info("Done!", "You're back in #{Dir.pwd.green}")
133
+ else
134
+ Bridgetown.logger.warn("Oops!", "I wasn't able to find the" \
135
+ " #{directive[1]} folder for #{directive[0]}")
136
+ end
137
+ end
91
138
 
92
- site.converters.each do |converter|
93
- name = plugin_name_for(converter)
94
- name_components = name.split("::")
95
- last_name = name_components.pop
96
- name_components.push last_name.magenta
97
- Bridgetown.logger.info("", name_components.join("::"))
98
- end
139
+ desc "new NAME", "Create a new plugin NAME (please-use-dashes) by" \
140
+ " cloning the sample plugin repo"
141
+ # rubocop:disable Layout/LineLength
142
+ def new(plugin_name)
143
+ folder_name = plugin_name.underscore
144
+ name = folder_name.dasherize
145
+ module_name = folder_name.camelize
99
146
 
100
- Bridgetown.logger.info("Generators:", site.generators.length.to_s.yellow.bold)
147
+ run "git clone https://github.com/bridgetownrb/bridgetown-sample-plugin #{name}"
148
+ new_gemspec = "#{name}.gemspec"
101
149
 
102
- site.generators.each do |generator|
103
- name = plugin_name_for(generator)
104
- name_components = name.split("::")
105
- last_name = name_components.pop
106
- name_components.push last_name.magenta
107
- Bridgetown.logger.info("", name_components.join("::"))
108
- end
109
- end
150
+ inside name do # rubocop:todo Metrics/BlockLength
151
+ run "rm -rf .git"
152
+ run "git init"
110
153
 
111
- # This is super useful if you want to copy files out of plugins to override.
112
- #
113
- # Example:
114
- # bridgetown plugins cd AwesomePlugin/layouts
115
- # cp -r * $BRIDGETOWN_SITE/src/_layouts
116
- #
117
- # Now all the plugin's layouts will be in the site repo directly.
118
- #
119
- def cd(args, options)
120
- site = Bridgetown::Site.new(configuration_from_options(options))
121
-
122
- pm = site.plugin_manager
123
-
124
- directive = args[0].split("/")
125
- unless directive[1]
126
- Bridgetown.logger.warn("Oops!", "Your command needs to be in the <origin/dir> format")
127
- return
128
- end
154
+ run "mv bridgetown-sample-plugin.gemspec #{new_gemspec}"
155
+ gsub_file new_gemspec, "https://github.com/bridgetownrb/bridgetown-sample-plugin", "https://github.com/username/#{name}"
156
+ gsub_file new_gemspec, "bridgetown-sample-plugin", name
157
+ gsub_file new_gemspec, "sample-plugin", name
158
+ gsub_file new_gemspec, "SamplePlugin", module_name
129
159
 
130
- manifest = pm.class.source_manifests.find do |source_manifest|
131
- source_manifest.origin.to_s == directive[0]
132
- end
160
+ gsub_file "package.json", "https://github.com/bridgetownrb/bridgetown-sample-plugin", "https://github.com/username/#{name}"
161
+ gsub_file "package.json", "bridgetown-sample-plugin", name
133
162
 
134
- if manifest&.respond_to?(directive[1].downcase)
135
- dir = manifest.send(directive[1].downcase)
136
- Bridgetown.logger.info("Opening the #{dir.green} folder for" \
137
- " #{manifest.origin.to_s.cyan}…")
138
- Bridgetown.logger.info("Type #{"exit".yellow} when you're done to" \
139
- " return to your site root.")
140
- puts
141
-
142
- Dir.chdir dir do
143
- ENV["BRIDGETOWN_SITE"] = site.root_dir
144
- if ENV["SHELL"]
145
- system(ENV["SHELL"])
146
- else
147
- system("/bin/sh")
148
- end
149
- end
163
+ run "mv lib/sample-plugin.rb lib/#{name}.rb"
164
+ gsub_file "lib/#{name}.rb", "sample-plugin", name
165
+ gsub_file "lib/#{name}.rb", "SamplePlugin", module_name
150
166
 
151
- puts
152
- Bridgetown.logger.info("Done!", "You're back in #{Dir.pwd.green}")
153
- else
154
- Bridgetown.logger.warn("Oops!", "I wasn't able to find the" \
155
- " #{directive[1]} folder for #{directive[0]}")
156
- end
167
+ run "mv lib/sample-plugin lib/#{name}"
168
+ gsub_file "lib/#{name}/builder.rb", "SamplePlugin", module_name
169
+ gsub_file "lib/#{name}/version.rb", "SamplePlugin", module_name
170
+
171
+ run "mv spec/sample-plugin_spec.rb spec/#{name}_spec.rb"
172
+ gsub_file "spec/#{name}_spec.rb", "SamplePlugin", module_name
173
+ gsub_file "spec/spec_helper.rb", "sample-plugin", name
174
+
175
+ run "mv components/sample_plugin components/#{folder_name}"
176
+ run "mv content/sample_plugin content/#{folder_name}"
177
+ run "mv layouts/sample_plugin layouts/#{folder_name}"
178
+
179
+ gsub_file "layouts/#{folder_name}/layout.html", "sample_plugin", folder_name
180
+ gsub_file "content/#{folder_name}/example_page.md", "sample_plugin", folder_name
181
+ gsub_file "components/#{folder_name}/layout_help.liquid", "sample_plugin", folder_name
182
+
183
+ gsub_file "frontend/javascript/index.js", "bridgetown-sample-plugin", name
184
+ gsub_file "frontend/javascript/index.js", "SamplePlugin", module_name
157
185
  end
186
+ say ""
187
+ say_status "Done!", "Have fun writing your new #{name} plugin :)"
188
+ say_status "Remember:", "Don't forget to rename the SamplePlugin" \
189
+ " code identifiers and paths to your own" \
190
+ " indentifer, as well as update your README " \
191
+ " and CHANGELOG files as necessary."
192
+ end
193
+ # rubocop:enable Layout/LineLength
158
194
 
159
- def plugin_name_for(plugin)
160
- if plugin.class.respond_to?(:custom_name)
161
- plugin.class.custom_name
162
- else
163
- plugin.class.name
164
- end
195
+ protected
196
+
197
+ def plugin_name_for(plugin)
198
+ if plugin.class.respond_to?(:custom_name)
199
+ plugin.class.custom_name
200
+ else
201
+ plugin.class.name
165
202
  end
166
203
  end
167
204
  end