geb 0.1.11

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 (106) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +3 -0
  3. data/CHANGELOG.md +37 -0
  4. data/CODE_OF_CONDUCT.md +84 -0
  5. data/LICENSE +21 -0
  6. data/README.md +384 -0
  7. data/Rakefile +21 -0
  8. data/bin/geb +21 -0
  9. data/lib/geb/cli.rb +40 -0
  10. data/lib/geb/commands/build.rb +59 -0
  11. data/lib/geb/commands/init.rb +70 -0
  12. data/lib/geb/commands/release.rb +54 -0
  13. data/lib/geb/commands/remote.rb +48 -0
  14. data/lib/geb/commands/server.rb +77 -0
  15. data/lib/geb/commands/upload.rb +48 -0
  16. data/lib/geb/commands/version.rb +36 -0
  17. data/lib/geb/config.rb +103 -0
  18. data/lib/geb/defaults.rb +44 -0
  19. data/lib/geb/git.rb +112 -0
  20. data/lib/geb/page.rb +217 -0
  21. data/lib/geb/partial.rb +150 -0
  22. data/lib/geb/samples/basic/assets/css/site.css +7 -0
  23. data/lib/geb/samples/basic/assets/images/android-chrome-192x192.png +0 -0
  24. data/lib/geb/samples/basic/assets/images/android-chrome-512x512.png +0 -0
  25. data/lib/geb/samples/basic/assets/images/apple-touch-icon.png +0 -0
  26. data/lib/geb/samples/basic/assets/images/favicon-16x16.png +0 -0
  27. data/lib/geb/samples/basic/assets/images/favicon-32x32.png +0 -0
  28. data/lib/geb/samples/basic/assets/images/favicon.ico +0 -0
  29. data/lib/geb/samples/basic/assets/images/hero.png +0 -0
  30. data/lib/geb/samples/basic/assets/images/og-thumb.png +0 -0
  31. data/lib/geb/samples/basic/assets/images/twitter-thumb.png +0 -0
  32. data/lib/geb/samples/basic/assets/js/site.js +5 -0
  33. data/lib/geb/samples/basic/geb.config.yml +70 -0
  34. data/lib/geb/samples/basic/index.html +11 -0
  35. data/lib/geb/samples/basic/page.html +11 -0
  36. data/lib/geb/samples/basic/shared/partials/_analytics.html +9 -0
  37. data/lib/geb/samples/basic/shared/partials/_footer.html +3 -0
  38. data/lib/geb/samples/basic/shared/partials/_global_assets.html +19 -0
  39. data/lib/geb/samples/basic/shared/partials/_header.html +0 -0
  40. data/lib/geb/samples/basic/shared/partials/_meta_tags.html +34 -0
  41. data/lib/geb/samples/basic/shared/templates/_blog_post.html +0 -0
  42. data/lib/geb/samples/basic/shared/templates/_site.html +19 -0
  43. data/lib/geb/samples/basic/site.webmanifest +1 -0
  44. data/lib/geb/samples/bootstrap_jquery/assets/css/site.css +7 -0
  45. data/lib/geb/samples/bootstrap_jquery/assets/images/android-chrome-192x192.png +0 -0
  46. data/lib/geb/samples/bootstrap_jquery/assets/images/android-chrome-512x512.png +0 -0
  47. data/lib/geb/samples/bootstrap_jquery/assets/images/apple-touch-icon.png +0 -0
  48. data/lib/geb/samples/bootstrap_jquery/assets/images/favicon-16x16.png +0 -0
  49. data/lib/geb/samples/bootstrap_jquery/assets/images/favicon-32x32.png +0 -0
  50. data/lib/geb/samples/bootstrap_jquery/assets/images/favicon.ico +0 -0
  51. data/lib/geb/samples/bootstrap_jquery/assets/images/hero.png +0 -0
  52. data/lib/geb/samples/bootstrap_jquery/assets/images/og-thumb.png +0 -0
  53. data/lib/geb/samples/bootstrap_jquery/assets/images/twitter-thumb.png +0 -0
  54. data/lib/geb/samples/bootstrap_jquery/assets/js/site.js +5 -0
  55. data/lib/geb/samples/bootstrap_jquery/blog/blog_post_1.html +35 -0
  56. data/lib/geb/samples/bootstrap_jquery/blog/blog_post_2.html +35 -0
  57. data/lib/geb/samples/bootstrap_jquery/blog/blog_post_3.html +35 -0
  58. data/lib/geb/samples/bootstrap_jquery/blog/index.html +17 -0
  59. data/lib/geb/samples/bootstrap_jquery/geb.config.yml +69 -0
  60. data/lib/geb/samples/bootstrap_jquery/index.html +11 -0
  61. data/lib/geb/samples/bootstrap_jquery/page.html +11 -0
  62. data/lib/geb/samples/bootstrap_jquery/shared/partials/_analytics.html +9 -0
  63. data/lib/geb/samples/bootstrap_jquery/shared/partials/_footer.html +3 -0
  64. data/lib/geb/samples/bootstrap_jquery/shared/partials/_global_assets.html +19 -0
  65. data/lib/geb/samples/bootstrap_jquery/shared/partials/_header.html +0 -0
  66. data/lib/geb/samples/bootstrap_jquery/shared/partials/_meta_tags.html +34 -0
  67. data/lib/geb/samples/bootstrap_jquery/shared/templates/_blog_post.html +0 -0
  68. data/lib/geb/samples/bootstrap_jquery/shared/templates/_site.html +19 -0
  69. data/lib/geb/samples/bootstrap_jquery/site.webmanifest +1 -0
  70. data/lib/geb/samples/geb.config.yml +70 -0
  71. data/lib/geb/server.rb +138 -0
  72. data/lib/geb/site/build.rb +189 -0
  73. data/lib/geb/site/core.rb +229 -0
  74. data/lib/geb/site/release.rb +70 -0
  75. data/lib/geb/site/remote.rb +142 -0
  76. data/lib/geb/site/template.rb +208 -0
  77. data/lib/geb/site.rb +83 -0
  78. data/lib/geb/template.rb +166 -0
  79. data/lib/geb/utilities.rb +110 -0
  80. data/lib/geb.rb +36 -0
  81. data/lib/seth.rb +50 -0
  82. data/sig/geb.rbs +4 -0
  83. data/test/api tests/test_cli.rb +200 -0
  84. data/test/api tests/test_config.rb +330 -0
  85. data/test/api tests/test_defaults.rb +62 -0
  86. data/test/api tests/test_git.rb +105 -0
  87. data/test/api tests/test_page.rb +320 -0
  88. data/test/api tests/test_partial.rb +152 -0
  89. data/test/api tests/test_server.rb +416 -0
  90. data/test/api tests/test_site.rb +1315 -0
  91. data/test/api tests/test_template.rb +249 -0
  92. data/test/api tests/test_utilities.rb +162 -0
  93. data/test/command tests/test_geb_build.rb +199 -0
  94. data/test/command tests/test_geb_init.rb +312 -0
  95. data/test/command tests/test_geb_release.rb +166 -0
  96. data/test/command tests/test_geb_remote.rb +66 -0
  97. data/test/command tests/test_geb_server.rb +122 -0
  98. data/test/command tests/test_geb_upload.rb +96 -0
  99. data/test/command tests/test_geb_version.rb +58 -0
  100. data/test/support/geb_api_test.rb +37 -0
  101. data/test/support/geb_cli_test.rb +275 -0
  102. data/test/support/geb_minitest_ext.rb +35 -0
  103. data/test/support/geb_test_helpers.rb +84 -0
  104. data/test/support/geb_web_server_proxy.rb +128 -0
  105. data/test/test_helper.rb +61 -0
  106. metadata +301 -0
@@ -0,0 +1,35 @@
1
+ <% template: shared/templates/_blog_post.html %>
2
+
3
+ <% start: title %>
4
+ Blog Post 1
5
+ <% end: title %>
6
+
7
+ <% start: content %>
8
+
9
+ <h1>Blog Post 1 Title</h1>
10
+
11
+ <p class="lead">
12
+ This is the first blog post. It is very interesting and you should read it.
13
+ </p>
14
+
15
+ <p>
16
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac purus nec
17
+ libero ultrices ultricies. Nullam nec nunc nec nunc ultricies ultricies. Ut
18
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
19
+ ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc
20
+ ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc
21
+ nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut
22
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
23
+ </p>
24
+
25
+ <p>
26
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac purus nec
27
+ libero ultrices ultricies. Nullam nec nunc nec nunc ultricies ultricies. Ut
28
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
29
+ ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc
30
+ ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc
31
+ nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut
32
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
33
+ </p>
34
+
35
+ <% end: content %>
@@ -0,0 +1,35 @@
1
+ <% template: shared/templates/_blog_post.html %>
2
+
3
+ <% start: title %>
4
+ Blog Post 2
5
+ <% end: title %>
6
+
7
+ <% start: content %>
8
+
9
+ <h1>Blog Post 2 Title</h1>
10
+
11
+ <p class="lead">
12
+ This is the second blog post. It is very interesting and you should read it.
13
+ </p>
14
+
15
+ <p>
16
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac purus nec
17
+ libero ultrices ultricies. Nullam nec nunc nec nunc ultricies ultricies. Ut
18
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
19
+ ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc
20
+ ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc
21
+ nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut
22
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
23
+ </p>
24
+
25
+ <p>
26
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac purus nec
27
+ libero ultrices ultricies. Nullam nec nunc nec nunc ultricies ultricies. Ut
28
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
29
+ ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc
30
+ ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc
31
+ nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut
32
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
33
+ </p>
34
+
35
+ <% end: content %>
@@ -0,0 +1,35 @@
1
+ <% template: shared/templates/_blog_post.html %>
2
+
3
+ <% start: title %>
4
+ Blog Post 3
5
+ <% end: title %>
6
+
7
+ <% start: content %>
8
+
9
+ <h1>Blog Post 3 Title</h1>
10
+
11
+ <p class="lead">
12
+ This is the third blog post. It is very interesting and you should read it.
13
+ </p>
14
+
15
+ <p>
16
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac purus nec
17
+ libero ultrices ultricies. Nullam nec nunc nec nunc ultricies ultricies. Ut
18
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
19
+ ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc
20
+ ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc
21
+ nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut
22
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
23
+ </p>
24
+
25
+ <p>
26
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac purus nec
27
+ libero ultrices ultricies. Nullam nec nunc nec nunc ultricies ultricies. Ut
28
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
29
+ ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc
30
+ ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut eget nunc
31
+ nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies ultricies. Ut
32
+ eget nunc nec nunc ultricies ultricies. Ut eget nunc nec nunc ultricies
33
+ </p>
34
+
35
+ <% end: content %>
@@ -0,0 +1,17 @@
1
+ <% template: shared/templates/_site.html %>
2
+
3
+ <% start: title %>
4
+ Blog
5
+ <% end: title %>
6
+
7
+ <% start: content %>
8
+
9
+ <h1>Welcome to the Blog</h1>
10
+
11
+ <ul>
12
+ <li><a href="blog_post_1.html">First Blog Post</a></li>
13
+ <li><a href="blog_post_2.html">Second Blog Post</a></li>
14
+ <li><a href="blog_post_3.html">Third Blog Post</a></li>
15
+ </ul>
16
+
17
+ <% end: content %>
@@ -0,0 +1,69 @@
1
+
2
+ # Geb Configuration File
3
+ # =======================
4
+ #
5
+ # This is a sample configuration file for the geb command line tool.
6
+ # You pretty much don't have to specify anything in this file, unless you want to
7
+ # customize the site. The default values are good enough for most sites.
8
+ #
9
+ # EVEN IF YOU DON"T SPECIFY ANYTHING IN THIS FILE, THIS CONFIG FILE MUST EXIST
10
+ # AT THE ROOT OF THE SITE DIRECTORY. OTHERWISE, THE GEB COMMANDS WILL NOT WORK.
11
+ # IT CAN BE EMPTY, BUT IT MUST EXIST. GEB DEMANDS IT.
12
+ #
13
+ # However, remote_uri and remote_path are required if you want to use
14
+ # the geb remote and upload commands. If you plan to upload the site on your own then
15
+ # you don't need to specify these values.
16
+ #
17
+
18
+ # Name of the site.
19
+ # If not specified, the default is the name of the directory where the site is located.
20
+ # Just for display purposes.
21
+ #site_name: "My Site"
22
+
23
+ # The remote_uri is the SSH URI of the remote server that you are deploying to.
24
+ # Geb remote and upload commands will use this URI to connect to the server.
25
+ # If you don't specify a remote_uri, geb remote and upload commands will not work.
26
+ # Typical format is username@server
27
+ #remote_uri: "user@server.com"
28
+
29
+ # The remote_path is the path on the remote server where the site is located.
30
+ # If you don't specify a remote_path, upload commands will not work.
31
+ #remote_path: "/path/to/site"
32
+
33
+ # Set the local web server port that the site will run on.
34
+ # Geb server command will use this port to start the local web server
35
+ # If you don't specify a port, geb server command auto selects a port
36
+ #local_port: 4000
37
+
38
+ # Specifies the output directory, this directory will be used to store the output of
39
+ # the build and release commands.
40
+ # the output directory is relative to the site directory.
41
+ # The default value is "output"
42
+ #output_dir: "output"
43
+
44
+ # Specifies the assets directory, this directory will be used to store the assets.
45
+ # The assets directory is relative to the site directory.
46
+ # The default value is "assets"
47
+ #assets_dir: "assets"
48
+
49
+ # Specifies the page extensions that are used in the site. This can be any text file extension.
50
+ # Default value is ['.md', '.markdown', '.html', '.htm', '.txt', '.js', '.css']
51
+ #page_extensions: ["html", "htm", "md", "markdown"]
52
+
53
+ # Template and partial identifier is a regular expression that is used to identify the template
54
+ # and partial files in the site. The default value is /^_/, any filename that starts with an underscore.
55
+ # These files are processed, but not included in the output directory, local or release.
56
+ # This setting does not impact template paths below, which are used to share the site as a template,
57
+ # which will include the template and partial files, if the template_paths includes them.
58
+ #template_and_partial_identifier: /^_/
59
+
60
+ # if you want to share the site as a template site, specify which files and directories
61
+ # are part of the template.
62
+ # When you create a new site, these files and directories will be copied to the new site
63
+ # If you don't specify template_paths, the site will not be shared as a template site and
64
+ # the geb release --with_template option will not work.
65
+ # Likewise, for other sites to use this site as a template, you must specify the template_paths.
66
+ # The site template files will be archived into geb-template.tar.gz file and put within
67
+ # the release directory.
68
+ # e.g. template_paths: ["assets", "shared", "*.html", "site.webmanifest"]
69
+ template_paths: ["assets", "shared", "*.html", "site.webmanifest", "geb.config.yml"]
@@ -0,0 +1,11 @@
1
+ <% template: shared/templates/_site.html %>
2
+
3
+ <% start: title %>
4
+ This is a website title
5
+ <% end: title %>
6
+
7
+ <% start: content %>
8
+
9
+ <p>Welcome to the site</p>
10
+
11
+ <% end: content %>
@@ -0,0 +1,11 @@
1
+ <% template: shared/templates/_site.html %>
2
+
3
+ <% start: title %>
4
+ This is another page
5
+ <% end: title %>
6
+
7
+ <% start: content %>
8
+
9
+ <p>Welcome to the other page</p>
10
+
11
+ <% end: content %>
@@ -0,0 +1,9 @@
1
+
2
+ <!-- Global Site Tag (gtag-js) - Google Analytics -->
3
+ <script async src="https://www.googletagmanager.com/gtag/js?id=GA_TRACKING_ID"></script>
4
+ <script>
5
+ window.dataLayer = window.dataLayer || [];
6
+ function gtag() {databayer-push (arguments) ; }
7
+ gtag( 'js', new Date());
8
+ gtag( 'config', 'GA_TRACKING_ID' );
9
+ </script>
@@ -0,0 +1,3 @@
1
+
2
+ <!-- Bootstrap Bundle -->
3
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
@@ -0,0 +1,19 @@
1
+ <!-- Bootstrap icons-->
2
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" rel="stylesheet" >
3
+
4
+ <!-- Bootstrap CSS -->
5
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
6
+
7
+ <!-- Custom CSS styles -->
8
+ <link href="_{site_url}_/assets/css/site.css" rel="stylesheet" />
9
+
10
+ <!--
11
+ The Bootstrap JavaScript bundle is not here, but is included in the footer of the page.
12
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
13
+ -->
14
+
15
+ <!-- jQuery -->
16
+ <script src="https://code.jquery.com/jquery-3.7.1.slim.min.js" integrity="sha256-kmHvs0B+OpCW5GVHUNjv9rOmY0IvSIRcf7zGUDTDQM8=" crossorigin="anonymous"></script>
17
+
18
+ <!-- Custom Javascript -->
19
+ <script src="_{site_url}_/assets/js/site.js"></script>
@@ -0,0 +1,34 @@
1
+
2
+ <!-- Meta tags -->
3
+ <meta charset="utf-8" />
4
+ <meta name="generator" content="Geb 1.0.0" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
6
+ <meta name=”robots” content="index, follow" />
7
+ <meta name="description" content="_{title}_" />
8
+ <meta name="keywords" content="geb,geb static site,static site" />
9
+ <meta name="author" content="Geb, the Egyptian god of earth" />
10
+
11
+ <!-- Favicon and site icon -->
12
+ <link rel="apple-touch-icon" type="image/png" sizes="180x180" href="_{site_url}_/assets/images/apple-touch-icon.png" />
13
+ <link rel="icon" type="image/png" sizes="32x32" href="_{site_url}_/assets/images/favicon-32x32.png" />
14
+ <link rel="icon" type="image/png" sizes="16x16" href="_{site_url}_/assets/images/favicon-16x16.png" />
15
+ <link rel="icon" type="image/x-icon" href="_{site_url}_/assets/images/favicon.ico" />
16
+ <link rel="shortcut icon" type="image/x-icon" href="_{site_url}_/assets/images/favicon.ico" />
17
+
18
+ <!-- Site manifest -->
19
+ <link rel="canonical" href="_{site_url}_/_{relative_path}_" />
20
+ <link rel="manifest" type="image/png" href="/site.webmanifest" />
21
+
22
+ <!-- Open Graph -->
23
+ <meta property="og:type" content="website" />
24
+ <meta property="og:title" content="_{title}_" />
25
+ <meta property="og:description" content="_{title}_." />
26
+ <meta property="og:image" content="_{site_url}_/assets/images/og-thumb.png" />
27
+
28
+ <!-- Twitter Cards -->
29
+ <meta name="twitter:card" content="summary_large_image" />
30
+ <meta name="twitter:site" content="@twitter" />
31
+ <meta name="twitter:title" content="_{title}_" />
32
+ <meta name="twitter:description" content="_{title}_" />
33
+ <meta name="twitter:image" content="_{site_url}_/assets/images/twitter-thumb.png" />
34
+
@@ -0,0 +1,19 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+
5
+ <title><%= insert: title %></title>
6
+
7
+ <%= partial: shared/partials/_analytics.html %>
8
+ <%= partial: shared/partials/_meta_tags.html %>
9
+ <%= partial: shared/partials/_global_assets.html %>
10
+
11
+ </head>
12
+ <body>
13
+
14
+ <%= partial: shared/partials/_header.html %>
15
+ <%= insert: content %>
16
+ <%= partial: shared/partials/_footer.html %>
17
+
18
+ </body>
19
+ </html>
@@ -0,0 +1 @@
1
+ {"name":"","short_name":"","icons":[{"src":"/assets/images/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/assets/images/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
@@ -0,0 +1,70 @@
1
+
2
+ # Geb Configuration File
3
+ # =======================
4
+ #
5
+ # This is a sample configuration file for the geb command line tool.
6
+ # You pretty much don't have to specify anything in this file, unless you want to
7
+ # customize the site. The default values are good enough for most sites.
8
+ #
9
+ # EVEN IF YOU DON"T SPECIFY ANYTHING IN THIS FILE, THIS CONFIG FILE MUST EXIST
10
+ # AT THE ROOT OF THE SITE DIRECTORY. OTHERWISE, THE GEB COMMANDS WILL NOT WORK.
11
+ # IT CAN BE EMPTY, BUT IT MUST EXIST. GEB DEMANDS IT.
12
+ #
13
+ # However, remote_uri and remote_path are required if you want to use
14
+ # the geb remote and upload commands. If you plan to upload the site on your own then
15
+ # you don't need to specify these values.
16
+ #
17
+
18
+ # Name of the site.
19
+ # If not specified, the default is the name of the directory where the site is located.
20
+ # Just for display purposes.
21
+ #site_name: "My Site"
22
+
23
+ # The remote_uri is the SSH URI of the remote server that you are deploying to.
24
+ # Geb remote and upload commands will use this URI to connect to the server.
25
+ # If you don't specify a remote_uri, geb remote and upload commands will not work.
26
+ # Typical format is username@server
27
+ #remote_uri: "user@server.com"
28
+
29
+ # The remote_path is the path on the remote server where the site is located.
30
+ # If you don't specify a remote_path, upload commands will not work.
31
+ #remote_path: "/path/to/site"
32
+
33
+ # Set the local web server port that the site will run on.
34
+ # Geb server command will use this port to start the local web server
35
+ # If you don't specify a port, geb server command auto selects a port
36
+ #local_port: 4000
37
+
38
+ # Specifies the output directory, this directory will be used to store the output of
39
+ # the build and release commands.
40
+ # the output directory is relative to the site directory.
41
+ # The default value is "output"
42
+ #output_dir: "output"
43
+
44
+ # Specifies the assets directory, this directory will be used to store the assets.
45
+ # The assets directory is relative to the site directory.
46
+ # The default value is "assets"
47
+ #assets_dir: "assets"
48
+
49
+ # Specifies the page extensions that are used in the site. This can be any text file extension.
50
+ # Default value is ['.md', '.markdown', '.html', '.htm', '.txt', '.js', '.css']
51
+ #page_extensions: ["html", "htm", "md", "markdown"]
52
+
53
+ # Template and partial identifier is a regular expression that is used to identify the template
54
+ # and partial files in the site. The default value is /^_/, any filename that starts with an underscore.
55
+ # These files are processed, but not included in the output directory, local or release.
56
+ # This setting does not impact template paths below, which are used to share the site as a template,
57
+ # which will include the template and partial files, if the template_paths includes them.
58
+ #template_and_partial_identifier: /^_/
59
+
60
+ # if you want to share the site as a template site, specify which files and directories
61
+ # are part of the template.
62
+ # When you create a new site, these files and directories will be copied to the new site
63
+ # If you don't specify template_paths, the site will not be shared as a template site and
64
+ # the geb release --with_template option will not work.
65
+ # Likewise, for other sites to use this site as a template, you must specify the template_paths.
66
+ # The site template files will be archived into geb-template.tar.gz file and put within
67
+ # the release directory.
68
+ # e.g. template_paths: ["assets", "shared", "*.html", "site.webmanifest"]
69
+ #template_paths: []
70
+
data/lib/geb/server.rb ADDED
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # The http server class. This class is used to run a simple http server
4
+ # for the Geb gem. It also contains the file monitoring code to automatically.
5
+ # build the site when a file changes.
6
+ #
7
+ # @title Geb - Server
8
+ # @author Edin Mustajbegovic <edin@actiontwelve.com>
9
+ # @copyright 2024 Edin Mustajbegovic
10
+ # @license MIT
11
+ #
12
+ # @see https://github.com/mainfram-work/geb for more information
13
+
14
+ # include the required libraries
15
+ require 'webrick'
16
+ require 'listen'
17
+
18
+ module Geb
19
+ class Server
20
+
21
+ # initialise the http server class with the site and port, use auto_build to start the file watcher.
22
+ # @param site [Geb::Site] the site instance to serve
23
+ # @param port [Integer] the port to run the server on
24
+ # @param auto_build [Boolean] whether to start the file watcher
25
+ def initialize(site, port, auto_build)
26
+
27
+ # set the site and port
28
+ @site = site
29
+ @port = port
30
+
31
+ # get the http server instance and file watcher if auto_build is set
32
+ @http_server = get_http_server()
33
+ @file_watcher = auto_build ? get_file_watcher() : nil
34
+
35
+ # initialize the http server and file watcher threads
36
+ @http_server_thread = nil
37
+ @file_watcher_thread = nil
38
+
39
+ end # def initialize
40
+
41
+ # start the http server and file watcher
42
+ def start
43
+
44
+ # start the http server in its own thread
45
+ @http_server_thread = Thread.new { @http_server.start }
46
+
47
+ # start the file watcher if it is set in its own thread
48
+ @file_watcher_thread = @file_watcher ? Thread.new { @file_watcher.start } : nil
49
+
50
+ end # def start
51
+
52
+ # stop the http server and file watcher
53
+ def stop
54
+
55
+ # shutdown the http server
56
+ Geb.log "Shutting down http server."
57
+ @http_server.shutdown
58
+ @http_server_thread.join
59
+
60
+ # shutdown the file watcher
61
+ Geb.log "Shutting down file watcher." if @file_watcher
62
+ @file_watcher.stop if @file_watcher
63
+ @file_watcher_thread.join if @file_watcher_thread
64
+
65
+ end # def stop
66
+
67
+ private
68
+
69
+ # Get an instance of the http server
70
+ # @return [WEBrick::HTTPServer] the http server instance
71
+ def get_http_server
72
+
73
+ # Create a new WEBrick server
74
+ server = WEBrick::HTTPServer.new(
75
+ Port: @port,
76
+ DocumentRoot: @site.get_site_output_directory()
77
+ ) # WEBrick::HTTPServer.new
78
+
79
+ Geb.log "Server running on http://localhost:#{server.config[:Port]}/"
80
+
81
+ # return the http server
82
+ return server
83
+
84
+ end # get an instance of the http server
85
+
86
+ # Get an instance of the file watcher
87
+ # @return [Listen] the file watcher instance
88
+ # @note the file watcher will ignore the output and release directories
89
+ # @note the file watcher will attempt to rebuild the site when a file changes
90
+ # @note the file watcher will log any errors to the console, but will not stop watching
91
+ def get_file_watcher()
92
+
93
+ # create a new file watcher and define the block to run when a file changes
94
+ watcher = Listen.to(@site.site_path) do |modified, added, removed|
95
+
96
+ # check if any files have been modified, added or removed
97
+ if modified.any? || added.any? || removed.any?
98
+
99
+ Geb.log "Modified files detected: #{modified}" if modified.any?
100
+ Geb.log "New files detected: #{added}" if added.any?
101
+ Geb.log "File removal detected: #{removed}" if removed.any?
102
+ Geb.log_start "Found changes, rebuilding site ... "
103
+
104
+ # attempt to rebuild the site, log any errors but do not stop watching
105
+ begin
106
+
107
+ # rebuild the site, suppress log output
108
+ Geb.no_log { @site.build() }
109
+
110
+ rescue Geb::Error => e
111
+ Geb.log "\nError rebuilding site: #{e.message}"
112
+ end # begin rescue
113
+
114
+ Geb.log "done."
115
+
116
+ end # if
117
+
118
+ end # Listen.to(site.site_path) do |modified, added, removed|
119
+
120
+ # set ignore the output and release directories, cleanup the paths and make them relative to the site path
121
+ ignore_output_dir = @site.get_site_output_directory().gsub(@site.site_path, '').gsub(/\A\W+/, '')
122
+ ignore_release_dir = @site.get_site_release_directory().gsub(@site.site_path, '').gsub(/\A\W+/, '')
123
+
124
+ Geb.log "Watching for changes in [#{@site.site_path}]"
125
+ Geb.log "Ignoring [#{ignore_output_dir}]"
126
+ Geb.log "Ignoring [#{ignore_release_dir}]"
127
+
128
+ # ignore the output directory and the release directory
129
+ watcher.ignore(%r{^#{Regexp.escape(ignore_output_dir)}})
130
+ watcher.ignore(%r{^#{Regexp.escape(ignore_release_dir)}})
131
+
132
+ # return the file watcher
133
+ return watcher
134
+
135
+ end # def get_file_watcher
136
+
137
+ end # class Server
138
+ end # module Geb