geb 0.1.11

Sign up to get free protection for your applications and to get access to all the features.
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