frontman-ssg 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.circleci/config.yml +42 -0
- data/.github/CODE_OF_CONDUCT.md +9 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +25 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +22 -0
- data/.gitignore +5 -0
- data/.rubocop.yml +88 -0
- data/CHANGELOG.md +11 -0
- data/CONTRIBUTING.md +42 -0
- data/Gemfile +5 -0
- data/LICENSE.md +21 -0
- data/Rakefile +94 -0
- data/SECURITY.md +6 -0
- data/bin/frontman +6 -0
- data/frontman-ssg.gemspec +48 -0
- data/frontman.svg +2 -0
- data/lib/frontman.rb +15 -0
- data/lib/frontman/app.rb +175 -0
- data/lib/frontman/bootstrapper.rb +70 -0
- data/lib/frontman/builder/asset_pipeline.rb +55 -0
- data/lib/frontman/builder/builder.rb +193 -0
- data/lib/frontman/builder/file.rb +55 -0
- data/lib/frontman/builder/mapping.rb +54 -0
- data/lib/frontman/builder/statistics_collector.rb +37 -0
- data/lib/frontman/cli.rb +6 -0
- data/lib/frontman/commands/build.rb +76 -0
- data/lib/frontman/commands/init.rb +58 -0
- data/lib/frontman/commands/serve.rb +110 -0
- data/lib/frontman/concerns/dispatch_events.rb +56 -0
- data/lib/frontman/concerns/forward_calls_to_app.rb +28 -0
- data/lib/frontman/config.rb +52 -0
- data/lib/frontman/context.rb +125 -0
- data/lib/frontman/custom_struct.rb +44 -0
- data/lib/frontman/data_store.rb +106 -0
- data/lib/frontman/data_store_file.rb +60 -0
- data/lib/frontman/helpers/app_helper.rb +18 -0
- data/lib/frontman/helpers/link_helper.rb +35 -0
- data/lib/frontman/helpers/render_helper.rb +76 -0
- data/lib/frontman/helpers/url_helper.rb +11 -0
- data/lib/frontman/iterator.rb +48 -0
- data/lib/frontman/process/chain.rb +43 -0
- data/lib/frontman/process/processor.rb +11 -0
- data/lib/frontman/renderers/erb_renderer.rb +21 -0
- data/lib/frontman/renderers/haml_renderer.rb +22 -0
- data/lib/frontman/renderers/markdown_renderer.rb +26 -0
- data/lib/frontman/renderers/renderer.rb +26 -0
- data/lib/frontman/renderers/renderer_resolver.rb +26 -0
- data/lib/frontman/resource.rb +279 -0
- data/lib/frontman/sitemap_tree.rb +211 -0
- data/lib/frontman/toolbox/timer.rb +49 -0
- data/lib/frontman/version.rb +6 -0
- data/project-templates/default/.gitignore +2 -0
- data/project-templates/default/Gemfile +3 -0
- data/project-templates/default/config.rb +17 -0
- data/project-templates/default/data/site.yml +4 -0
- data/project-templates/default/helpers/site_helper.rb +7 -0
- data/project-templates/default/public/code.css +77 -0
- data/project-templates/default/public/frontman-logo.svg +2 -0
- data/project-templates/default/public/main.css +27 -0
- data/project-templates/default/public/main.js +1 -0
- data/project-templates/default/source/index.html.md.erb +7 -0
- data/project-templates/default/source/sitemap.xml.erb +11 -0
- data/project-templates/default/views/layouts/main.erb +19 -0
- data/project-templates/default/views/layouts/main.haml +15 -0
- data/project-templates/default/views/partials/menu.erb +7 -0
- data/project-templates/webpack/.gitignore +4 -0
- data/project-templates/webpack/Gemfile +3 -0
- data/project-templates/webpack/README.md +54 -0
- data/project-templates/webpack/assets/css/code.css +77 -0
- data/project-templates/webpack/assets/css/style.css +27 -0
- data/project-templates/webpack/assets/images/.gitkeep +0 -0
- data/project-templates/webpack/assets/images/frontman_logo.svg +2 -0
- data/project-templates/webpack/assets/js/index.js +1 -0
- data/project-templates/webpack/config.rb +24 -0
- data/project-templates/webpack/data/site.yml +4 -0
- data/project-templates/webpack/helpers/assets_helper.rb +24 -0
- data/project-templates/webpack/helpers/site_helper.rb +7 -0
- data/project-templates/webpack/package-lock.json +7603 -0
- data/project-templates/webpack/package.json +34 -0
- data/project-templates/webpack/source/index.html.md.erb +7 -0
- data/project-templates/webpack/source/sitemap.xml.erb +11 -0
- data/project-templates/webpack/views/layouts/main.erb +20 -0
- data/project-templates/webpack/views/layouts/main.haml +14 -0
- data/project-templates/webpack/views/partials/menu.erb +7 -0
- data/project-templates/webpack/views/partials/script_with_vendors.haml +5 -0
- data/project-templates/webpack/webpack/base.config.js +51 -0
- data/project-templates/webpack/webpack/dev.config.js +6 -0
- data/project-templates/webpack/webpack/prod.config.js +30 -0
- data/readme.md +80 -0
- data/sorbet/config +2 -0
- data/sorbet/rbi/hidden-definitions/errors.txt +27259 -0
- data/sorbet/rbi/hidden-definitions/hidden.rbi +45122 -0
- data/sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi +276 -0
- data/sorbet/rbi/todo.rbi +6 -0
- data/spec/frontman/app_spec.rb +48 -0
- data/spec/frontman/bootstrapper_spec.rb +26 -0
- data/spec/frontman/builder/builder_spec.rb +79 -0
- data/spec/frontman/builder/file_spec.rb +45 -0
- data/spec/frontman/builder/mapping_spec.rb +8 -0
- data/spec/frontman/concerns/dispatch_events_spec.rb +70 -0
- data/spec/frontman/concerns/forward_calls_to_app_spec.rb +21 -0
- data/spec/frontman/config_spec.rb +54 -0
- data/spec/frontman/context_spec.rb +48 -0
- data/spec/frontman/custom_struct_spec.rb +51 -0
- data/spec/frontman/data_store_file_spec.rb +9 -0
- data/spec/frontman/data_store_spec.rb +36 -0
- data/spec/frontman/frontman_ssg_spec.rb +7 -0
- data/spec/frontman/helpers/app_helper_spec.rb +24 -0
- data/spec/frontman/helpers/link_helper_spec.rb +37 -0
- data/spec/frontman/helpers/render_helper_spec.rb +55 -0
- data/spec/frontman/helpers/url_helper_spec.rb +21 -0
- data/spec/frontman/iterator_spec.rb +47 -0
- data/spec/frontman/mocks/asset.css +3 -0
- data/spec/frontman/mocks/config.rb +0 -0
- data/spec/frontman/mocks/helpers/formatting_helper.rb +5 -0
- data/spec/frontman/mocks/helpers/language_helper.rb +5 -0
- data/spec/frontman/mocks/helpers/link_helper.rb +5 -0
- data/spec/frontman/mocks/helpers/test_command.rb +5 -0
- data/spec/frontman/mocks/html_file.html +8 -0
- data/spec/frontman/mocks/html_file.html.md.erb +9 -0
- data/spec/frontman/mocks/html_file.md.html +8 -0
- data/spec/frontman/mocks/info.yml +4 -0
- data/spec/frontman/mocks/layouts/raw_without_body.haml +1 -0
- data/spec/frontman/mocks/nested/data.yml +4 -0
- data/spec/frontman/mocks/nested/more_data.yml +4 -0
- data/spec/frontman/mocks/partials/paragraph.haml +2 -0
- data/spec/frontman/mocks/snippet/html_file.html +8 -0
- data/spec/frontman/mocks/snippet/html_file.yml +670 -0
- data/spec/frontman/mocks/test.html +8 -0
- data/spec/frontman/mocks/wrap.haml +3 -0
- data/spec/frontman/process/chain_spec.rb +56 -0
- data/spec/frontman/renderers/erb_renderer_spec.rb +22 -0
- data/spec/frontman/renderers/haml_renderer_spec.rb +12 -0
- data/spec/frontman/renderers/markdown_renderer_spec.rb +12 -0
- data/spec/frontman/renderers/renderer_spec.rb +16 -0
- data/spec/frontman/resource_spec.rb +151 -0
- data/spec/frontman/sitemap_tree_spec.rb +128 -0
- data/spec/frontman/toolbox/timer_spec.rb +34 -0
- data/spec/spec_setup.rb +19 -0
- metadata +507 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
|
|
2
|
+
<!DOCTYPE html> <html lang=en> <head> <title> Quick Start | Magento 1 extension | Algolia Documentation </title>
|
|
3
|
+
</head> <body class=relative><main class='lg:max-w-648 min-h-full w-full'> <div class='text-grey-1000 leading-normal'> <section class=mb-48> <div class="mb-4 flex justify-between"> <div class="text-xs leading-tight"> <div class="font-sans-alt uppercase font-semibold tracking-wide"> Integrations / Extensions / <span class=text-nebula-500>Magento 1</span> </div> </div> <div class="flex items-center uppercase font-semibold tracking-wide text-grey-1000-opacity-30 text-xs leading-tight whitespace-no-wrap font-sans-alt"> <span class="block mr-4 w-16 h-16 fill-current"> <span class="block p-2"> <svg class="block h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22"><path d="M11,22A11,11,0,1,1,22,11,11,11,0,0,1,11,22ZM11,2a9,9,0,1,0,9,9A9,9,0,0,0,11,2Z"/><path d="M15,14a.93.93,0,0,1-.45-.11l-4-2A1,1,0,0,1,10,11V5a1,1,0,0,1,2,0v5.38l3.45,1.73a1,1,0,0,1,.44,1.34A1,1,0,0,1,15,14Z"/></svg> </span> </span> Feb. 15, 2019 </div> </div> <div class="flex justify-between"> <h1 class="md:text-4xl lg:text-5xl text-3xl leading-tall tracking-tight font-bold hyphenated"> Quick Start </h1> <div class="mt-16 ml-16"> <a class='edit-link w-24 h-24 items-center justify-center bg-grey-400-opacity-40 hover:bg-grey-400-opacity-60 rounded-full transition-fast-out hidden' href='https://github.com/algolia/doc/edit/master/source/doc/integration/magento-1/1-getting-started/1-quick-start.html.md.erb' rel=noopener target=_blank> <span class='flex items-center justify-center w-16 h-16 text-grey-700 fill-current'> <svg class=h-full xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32.58 31.77"><path d="M16.29,0a16.29,16.29,0,0,0-5.15,31.75c.82.15,1.11-.36,1.11-.79s0-1.41,0-2.77C7.7,29.18,6.74,26,6.74,26a4.36,4.36,0,0,0-1.81-2.39c-1.47-1,.12-1,.12-1a3.43,3.43,0,0,1,2.49,1.68,3.48,3.48,0,0,0,4.74,1.36,3.46,3.46,0,0,1,1-2.18c-3.62-.41-7.42-1.81-7.42-8a6.3,6.3,0,0,1,1.67-4.37,5.94,5.94,0,0,1,.16-4.31s1.37-.44,4.48,1.67a15.41,15.41,0,0,1,8.16,0c3.11-2.11,4.47-1.67,4.47-1.67A5.91,5.91,0,0,1,25,11.07a6.3,6.3,0,0,1,1.67,4.37c0,6.26-3.81,7.63-7.44,8a3.85,3.85,0,0,1,1.11,3c0,2.18,0,3.94,0,4.47s.29.94,1.12.78A16.29,16.29,0,0,0,16.29,0Z"/></svg> <span aria-hidden=true class=hidden> Edit this guide </span> </span> </a> </div> </div> </section> <div class='content mb-32'> <section> <p>To get started using Algolia in your Magento installation, just follow the steps in this video or on the page below.</p> <div class="flex transition-fast-in-out items-center" data-video=true> <div class="group embed flex-no-grow flex-no-shrink md:w-248 border-l-4 border-solid border-red-500-opacity-80 shadow-md rounded-r overflow-hidden mt-0 mb-0 transition-fast-in-out" data-video-container=DUuv9ALS5cM> <div class=embed-item data-video-frame=DUuv9ALS5cM data-video-start=0 id=DUuv9ALS5cM></div> <div class="absolute pin bg-center bg-cover pointer-events-none flex items-center justify-center" data-video-thumbnail=true style="background-image: url(https://img.youtube.com/vi/DUuv9ALS5cM/hqdefault.jpg)"> <div class="py-16 px-32 rounded-lg bg-gradient-red-400-red-500 shadow group-hover:shadow-md cursor-pointer transition-fast-out"> <div class="m-4 h-24 text-white"> <div class="h-full fill-current"> <svg class="block h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 10"><polygon points="0 0 0 10 8 5 0 0"/></svg> </div> </div> </div> </div> </div> <div class="ml-32 md:block hidden" data-video-description=true> <div> <div class="mb-8 text-grey-1000 font-bold text-lg"> Algolia Instant Search on your Magento Store </div> <div class=text-grey-400> By Algolia, 17 min </div> </div> </div> </div> <h2 id=installation>Installation</h2> <p>There are two possible ways to install the extension:</p> <ol> <li>Through <a href="https://github.com/colinmollenhour/modman">modman</a></li> <li>Through <a href="https://marketplace.magento.com/algolia-algoliasearch.html">Magento Marketplace</a></li> </ol> <h3 id=modman>Modman</h3> <p>With <a href="https://github.com/colinmollenhour/modman">modman</a> installed, run the following commands:</p> <div class=snippet-wrapper><div class=snippet-actions markdown=0><div class="copy-link snippet-action btn-satellite btn-satellite-white ml-8">Copy</div></div><div class=snippet-header><div class="nav nav-tabs snippet-tabs" markdown=0><span class="snippet-tab-wrapper snippet-tab-wrapper-active"><a href="#snippet_bash" data-toggle=tab class=snippet-tab>bash</a></span></div></div><div id=snippet_bash data-tab-pane class="snippet-body snippet-body-active" data-active=true data-language=bash><div class=highlight><pre class="highlight shell"><code><span class="nb">cd</span> /path/to/your/magento/directory
|
|
4
|
+
modman init
|
|
5
|
+
modman clone https://github.com/algolia/algoliasearch-magento.git
|
|
6
|
+
</code></pre></div></div></div> <h3 id=magento-marketplace>Magento Marketplace</h3> <p>Navigate to the <a href="https://marketplace.magento.com/algolia-algoliasearch.html">Magento Marketplace</a> to get the extension and follow the instructions to install.</p> <h2 id=configuration>Configuration</h2> <p>Before Algolia can be used with Magento, an Algolia account is needed. With the account, it’s possible to configure the Magento extension to work properly.</p> <h3 id=algolia-account>Algolia account</h3> <p>An account can be created in the <a href="/users/sign_up">sign-up wizard</a>.</p> <p class="alert alert-info">Pay attention while picking a data center during the sign-up. For performance reasons, it’s best to pick the one closest to the data center of your Magento installation.</p> <h3 id=magento-settings>Magento settings</h3> <p>To configure the Magento extension, you will need the following Algolia credentials:</p> <ul> <li>Application ID</li> <li><a href="/doc/guides/security/api-keys/#search-only-api-key">Search-only API key</a></li> <li><a href="/doc/guides/security/api-keys/#admin-api-key">Admin API key</a></li> </ul> <p>These credentials can be found on the <a href="/dashboard">Algolia Dashboard</a>, on the <strong>API keys</strong> page from the menu.</p> <p>In the administration section of your Magento project, navigate to <strong>System > Configuration > Catalog > Algolia Search</strong> and fill in the form with all the information required.</p> <figure> <p><img src="/doc/assets/images/integrations/magento-1/getting-started/configuration-ef05486e.png" alt="Basic information configuration"/></p> </figure> </section> <section> <h2 id=indexing>Indexing</h2> <p>With the extension configured, the data in your Magento installation should be pushed to Algolia for the first time by a process called <a href="/doc/guides/getting-started/how-algolia-works/in-depth/implementation-process/#indexing-data"><em>indexing</em></a>. This can be accomplished by navigating to <strong>System > Indexing Management</strong>. On this page, a list of indices will show up for which the <strong>Reindex Data</strong> link has to be clicked:</p> <ul> <li>Algolia Search Products</li> <li>Algolia Search Categories</li> <li>Algolia Search Pages</li> <li>Algolia Search Suggestions</li> </ul> <p>When the indexing is done, the search should now be available in your Magento installation.</p> <figure> <p><img src="/doc/assets/images/integrations/magento-1/getting-started/indexers-a88f04f2.png" alt="Magento store indexers"/></p> </figure> </section> </div> <div class=mt-88>
|
|
7
|
+
</div></div></main></body>
|
|
8
|
+
</html>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
# frozen_string_literal: false
|
|
3
|
+
|
|
4
|
+
require './spec/spec_setup'
|
|
5
|
+
require 'frontman/process/chain'
|
|
6
|
+
require 'frontman/process/processor'
|
|
7
|
+
|
|
8
|
+
describe Frontman::Process::Chain do
|
|
9
|
+
it 'should not manipulate data when there are no processors' do
|
|
10
|
+
data = 'foobar'
|
|
11
|
+
subject.process(data)
|
|
12
|
+
|
|
13
|
+
expect(data).to eq 'foobar'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'should pass data through all processors' do
|
|
17
|
+
subject.add_processors([processor_factory(lambda { |string|
|
|
18
|
+
string << 'CASE'
|
|
19
|
+
}), processor_factory(lambda { |string|
|
|
20
|
+
string.downcase!
|
|
21
|
+
})])
|
|
22
|
+
|
|
23
|
+
data = 'down'
|
|
24
|
+
subject.process(data)
|
|
25
|
+
expect(data).to eq 'downcase'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should map over all processors and return the proper result' do
|
|
29
|
+
subject.add_processors(
|
|
30
|
+
[
|
|
31
|
+
processor_factory(->(_) { 'foo' }),
|
|
32
|
+
processor_factory(->(_) { 'bar' })
|
|
33
|
+
]
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
expect(subject.process(nil)).to eq %w[foo bar]
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class Processor < Frontman::Process::Processor
|
|
41
|
+
attr_accessor :callback
|
|
42
|
+
|
|
43
|
+
def on_process(callback)
|
|
44
|
+
@callback = callback
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def process(data)
|
|
48
|
+
@callback.call(data)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def processor_factory(on_process)
|
|
53
|
+
processor = Processor.new
|
|
54
|
+
processor.on_process(on_process)
|
|
55
|
+
processor
|
|
56
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require './spec/spec_setup'
|
|
5
|
+
require 'lib/frontman/renderers/erb_renderer'
|
|
6
|
+
|
|
7
|
+
describe Frontman::ErbRenderer do
|
|
8
|
+
it 'should render ERB correctly' do
|
|
9
|
+
compiled = Frontman::ErbRenderer.instance.compile("t<%= 'es' %>t")
|
|
10
|
+
expect(Frontman::ErbRenderer.instance.render_content(compiled, nil, Frontman::Context.new, {})).to eq 'test'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'should throw an error with incorrect ERB syntax' do
|
|
14
|
+
compiled = Frontman::ErbRenderer.instance.compile('t<%= |! %> t')
|
|
15
|
+
expect { Frontman::ErbRenderer.instance.render_content(compiled, nil, Frontman::Context.new, {}) }.to raise_error SyntaxError
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'should send the data to the view' do
|
|
19
|
+
compiled = Frontman::ErbRenderer.instance.compile('t<%= string %>t')
|
|
20
|
+
expect(Frontman::ErbRenderer.instance.render_content(compiled, nil, Frontman::Context.new, string: 'es')).to eq 'test'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require './spec/spec_setup'
|
|
5
|
+
require 'lib/frontman/renderers/haml_renderer'
|
|
6
|
+
|
|
7
|
+
describe Frontman::HamlRenderer do
|
|
8
|
+
it 'should render HAML correctly' do
|
|
9
|
+
compiled = Frontman::HamlRenderer.instance.compile('%h1#hello Hello!')
|
|
10
|
+
expect(Frontman::HamlRenderer.instance.render_content(compiled, nil, Frontman::Context.new, {})).to eq "<h1 id='hello'>Hello!</h1>\n"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require './spec/spec_setup'
|
|
5
|
+
require 'lib/frontman/renderers/markdown_renderer'
|
|
6
|
+
|
|
7
|
+
describe Frontman::MarkdownRenderer do
|
|
8
|
+
it 'should render Markdown correctly' do
|
|
9
|
+
compiled = Frontman::MarkdownRenderer.instance.compile('# Hello!')
|
|
10
|
+
expect(Frontman::MarkdownRenderer.instance.render_content(compiled, nil, nil, {})).to eq "<h1 id=\"hello\">Hello!</h1>\n"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require './spec/spec_setup'
|
|
5
|
+
require 'lib/frontman/renderers/renderer'
|
|
6
|
+
|
|
7
|
+
describe Frontman::Renderer do
|
|
8
|
+
it 'should raise an error when we try to compile' do
|
|
9
|
+
expect { Frontman::Renderer.instance.compile('fakelayout') }.to raise_error RuntimeError
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it 'should raise an error when we try to render content' do
|
|
13
|
+
mock = 'fake'
|
|
14
|
+
expect { Frontman::Renderer.instance.render_content(mock, mock, mock, mock) }.to raise_error RuntimeError
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require './spec/spec_setup'
|
|
5
|
+
require 'lib/frontman/resource'
|
|
6
|
+
|
|
7
|
+
describe Frontman::Resource do
|
|
8
|
+
it 'should throw an error when creating a Frontman::Resource from a non-existing file' do
|
|
9
|
+
expect { Frontman::Resource.from_path('non-existing-file') }.to raise_error RuntimeError
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it 'should load the Frontman::Resource' do
|
|
13
|
+
expect(Frontman::Resource.from_path('spec/frontman/mocks/html_file.html').class.name).to eq 'Frontman::Resource'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'should cache the Frontman::Resource' do
|
|
17
|
+
Frontman::Resource.from_path('spec/frontman/mocks/html_file.html')
|
|
18
|
+
expect(Frontman::Resource.resources['spec/frontman/mocks/html_file.html'.gsub(%r{^/}, '')].class.name).to eq 'Frontman::Resource'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'should generate Frontman::Resources with different destinations and the same source file' do
|
|
22
|
+
Frontman::Resource.from_path('spec/frontman/mocks/html_file.html')
|
|
23
|
+
Frontman::Resource.from_path('spec/frontman/mocks/html_file.html', 'testing/bar.html')
|
|
24
|
+
expect(Frontman::Resource.resources['spec/frontman/mocks/html_file.html'.gsub(%r{^/}, '')].class.name).to eq 'Frontman::Resource'
|
|
25
|
+
expect(Frontman::Resource.resources['testing/bar.html'.gsub(%r{^/}, '')].class.name).to eq 'Frontman::Resource'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
subject { Frontman::Resource.from_path('spec/frontman/mocks/html_file.md.html') }
|
|
29
|
+
context 'parse_resource' do
|
|
30
|
+
it 'should reset the view data' do
|
|
31
|
+
subject.data = { foo: 'bar' }.to_ostruct
|
|
32
|
+
expect(subject.data.length).to eq 1
|
|
33
|
+
subject.parse_resource
|
|
34
|
+
expect(subject.data.length).to eq 0
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'should append passed data' do
|
|
38
|
+
subject.data = { foo: 'bar' }.to_ostruct
|
|
39
|
+
expect(subject.data.length).to eq 1
|
|
40
|
+
subject.parse_resource(false, foo: 'bar')
|
|
41
|
+
expect(subject.data.length).to eq 1
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'should mark the Frontman::Resource as indexable when not set' do
|
|
45
|
+
expect(subject.indexable?).to eq true
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'should mark the Frontman::Resource as not indexable when set to false' do
|
|
49
|
+
subject.data = { indexable: false }.to_ostruct
|
|
50
|
+
|
|
51
|
+
expect(subject.indexable?).to eq false
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it 'should mark the Frontman::Resource as indexable when explicitly set to true' do
|
|
55
|
+
subject.data = { indexable: true }.to_ostruct
|
|
56
|
+
|
|
57
|
+
expect(subject.indexable?).to eq true
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'should compile the view when it has just one renderer' do
|
|
61
|
+
subject.parse_resource
|
|
62
|
+
expect(subject.renderers.length).to eq 1
|
|
63
|
+
expect(subject.compiled.class.name).to eq 'Kramdown::Document'
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
let(:multiRenderer) { Frontman::Resource.from_path('spec/frontman/mocks/html_file.html.md.erb') }
|
|
67
|
+
|
|
68
|
+
it 'should not compile when it has multiple renderers' do
|
|
69
|
+
multiRenderer.parse_resource
|
|
70
|
+
expect(multiRenderer.renderers.length).to eq 2
|
|
71
|
+
expect(multiRenderer.compiled.class.name).to eq 'NilClass'
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it 'should find the correct layout' do
|
|
76
|
+
Frontman::App.instance.register_layout('spec/frontman/*', 'correct_layout')
|
|
77
|
+
expect(subject.layout).to eq 'views/layouts/correct_layout'
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it 'should split extensions correctly' do
|
|
81
|
+
expect(subject.strip_extensions('testing/file.foo.bar.baz')).to eq ['testing/file', %w[foo bar baz]]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it 'should parse an existing snippet file' do
|
|
85
|
+
resource = Frontman::Resource.from_path('spec/frontman/mocks/snippet/html_file.html')
|
|
86
|
+
resource.parse_data_file
|
|
87
|
+
expect(resource.data.yml.length).to eq 2
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it 'should have a modified-time' do
|
|
91
|
+
expect(subject.mtime).to be > Time.new(2019, 0o1, 0o1)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
context 'Strip Extensions' do
|
|
95
|
+
it 'should properly strip extensions from paths with no extensions' do
|
|
96
|
+
path, extensions = subject.strip_extensions('fake/file/path')
|
|
97
|
+
expect(path).to eq 'fake/file/path'
|
|
98
|
+
expect(extensions.length).to eq 0
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it 'should properly strip extensions from paths with one extension' do
|
|
102
|
+
path, extensions = subject.strip_extensions('fake/file/path.mock')
|
|
103
|
+
expect(path).to eq 'fake/file/path'
|
|
104
|
+
expect(extensions).to eq %w[mock]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'should properly strip extensions from paths with multiple extensions' do
|
|
108
|
+
path, extensions = subject.strip_extensions('fake/file/path.mock.foo.bar')
|
|
109
|
+
expect(path).to eq 'fake/file/path'
|
|
110
|
+
expect(extensions).to eq %w[mock foo bar]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'should not strip the extension if part of the path has a dot in it' do
|
|
114
|
+
path, extensions = subject.strip_extensions('fake/file/dot.net/path.mock.foo.bar')
|
|
115
|
+
expect(path).to eq 'fake/file/dot.net/path'
|
|
116
|
+
expect(extensions).to eq %w[mock foo bar]
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
context 'Setup Destination' do
|
|
121
|
+
it 'should set the right destination extension' do
|
|
122
|
+
subject.destination_path = 'path/to/file.html.md.erb'
|
|
123
|
+
subject.setup_destination
|
|
124
|
+
expect(subject.extension).to eq 'html'
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it 'should find the right destination path for HTML files' do
|
|
128
|
+
subject.destination_path = 'path/to/file.html.md.erb'
|
|
129
|
+
subject.setup_destination
|
|
130
|
+
expect(subject.destination_path).to eq 'path/to/file/index.html'
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it 'should find the right destination path for non-HTML files' do
|
|
134
|
+
subject.destination_path = 'path/to/file.md.erb'
|
|
135
|
+
subject.setup_destination
|
|
136
|
+
expect(subject.destination_path).to eq 'path/to/file.md'
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it 'should find the right destination path without extension' do
|
|
140
|
+
subject.destination_path = 'path/to/file'
|
|
141
|
+
subject.setup_destination
|
|
142
|
+
expect(subject.destination_path).to eq 'path/to/file/index.html'
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it 'should find the right destination path without extension' do
|
|
146
|
+
subject.destination_path = 'file.html.haml'
|
|
147
|
+
subject.setup_destination
|
|
148
|
+
expect(subject.destination_path).to eq 'file/index.html'
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require './spec/spec_setup'
|
|
5
|
+
require 'lib/frontman/sitemap_tree'
|
|
6
|
+
|
|
7
|
+
describe Frontman::SitemapTree do
|
|
8
|
+
context 'building SitemapTree' do
|
|
9
|
+
before(:each) do
|
|
10
|
+
Frontman::SitemapTree.class_variable_set :@@urls, {}
|
|
11
|
+
@sitemap_tree = Frontman::SitemapTree.new(nil)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'should add resources to the tree' do
|
|
15
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test1.html' }.to_ostruct)
|
|
16
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test22.html' }.to_ostruct)
|
|
17
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test13.html' }.to_ostruct)
|
|
18
|
+
|
|
19
|
+
expect(@sitemap_tree.flatten.size).to eq 3
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'should not add js and css resources' do
|
|
23
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test1.js' }.to_ostruct)
|
|
24
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test22.css' }.to_ostruct)
|
|
25
|
+
|
|
26
|
+
expect(@sitemap_tree.flatten.size).to eq 0
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'should find dir' do
|
|
30
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test1.html' }.to_ostruct)
|
|
31
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test22.html' }.to_ostruct)
|
|
32
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test13.html' }.to_ostruct)
|
|
33
|
+
|
|
34
|
+
expect(@sitemap_tree.find(['doc']).class).to eq Frontman::SitemapTree
|
|
35
|
+
expect(@sitemap_tree.find(%w[doc test test2]).class).to eq Frontman::SitemapTree
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'should load @sitemap_tree from url, partial urls and resource' do
|
|
39
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test1.html' }.to_ostruct)
|
|
40
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test22.html' }.to_ostruct)
|
|
41
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test13.html' }.to_ostruct)
|
|
42
|
+
|
|
43
|
+
expect(@sitemap_tree.from_url('doc/test').class).to eq described_class
|
|
44
|
+
expect(@sitemap_tree.from_url('doc/test/test1').class).to eq described_class
|
|
45
|
+
expect(@sitemap_tree.from_resource({ destination_path: 'doc/test/test1.html' }.to_ostruct).class).to eq described_class
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'should access parent, children, sibling, ancestors' do
|
|
49
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test1.html' }.to_ostruct)
|
|
50
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test22.html' }.to_ostruct)
|
|
51
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test13.html' }.to_ostruct)
|
|
52
|
+
|
|
53
|
+
tree = @sitemap_tree.from_url('doc/test/test2')
|
|
54
|
+
|
|
55
|
+
expect(tree.parent.parent.url_part).to eq 'doc'
|
|
56
|
+
expect(tree.children.size).to eq 2
|
|
57
|
+
expect(tree.children[0].siblings.size).to eq 2
|
|
58
|
+
expect(tree.children[0].siblings[0].url_part).to eq 'test22'
|
|
59
|
+
expect(tree.ancestor('doc').url_part).to eq 'doc'
|
|
60
|
+
expect(tree.ancestor('doc', 1).url_part).to eq 'test'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should get the final url with a / at the beginning and end' do
|
|
64
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test1.html' }.to_ostruct)
|
|
65
|
+
|
|
66
|
+
tree = @sitemap_tree.from_url('doc/test/test1')
|
|
67
|
+
|
|
68
|
+
expect(tree.final_url).to eq '/doc/test/test1/'
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it 'should proxy resources to a given url' do
|
|
72
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test1.html' }.to_ostruct)
|
|
73
|
+
@sitemap_tree.add_proxy('foo/bar.html', 'spec/frontman/mocks/html_file.html')
|
|
74
|
+
tree = @sitemap_tree.from_url('/foo/bar')
|
|
75
|
+
expect(tree.class).to eq described_class
|
|
76
|
+
expect(tree.resource).to be_a Frontman::Resource
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it 'should get all the pages both nested and not nested' do
|
|
80
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test1.html' }.to_ostruct)
|
|
81
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test22.html' }.to_ostruct)
|
|
82
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test13.html' }.to_ostruct)
|
|
83
|
+
|
|
84
|
+
expect(@sitemap_tree.get_all_pages.flatten.length).to eq 3
|
|
85
|
+
|
|
86
|
+
tree = @sitemap_tree.from_url('doc/test/test2')
|
|
87
|
+
expect(tree.get_all_pages.flatten.length).to eq 2
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it 'should properly set and get the value' do
|
|
91
|
+
value = 'testing'
|
|
92
|
+
@sitemap_tree.resource = value
|
|
93
|
+
|
|
94
|
+
expect(@sitemap_tree.resource).to eq value
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it 'should identify folders' do
|
|
98
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test22.html' }.to_ostruct)
|
|
99
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test13.html' }.to_ostruct)
|
|
100
|
+
|
|
101
|
+
tree = @sitemap_tree.from_url('doc/test/test2')
|
|
102
|
+
expect(tree.folder?).to eq true
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it 'should select all the pages from a folder' do
|
|
106
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test22.html' }.to_ostruct)
|
|
107
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test13.html' }.to_ostruct)
|
|
108
|
+
|
|
109
|
+
tree = @sitemap_tree.from_url('doc/test/test2')
|
|
110
|
+
expect(tree.pages.length).to eq 2
|
|
111
|
+
tree.pages.each do |page|
|
|
112
|
+
expect(page.is_a?(Frontman::SitemapTree)).to eq true
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it 'should identify non-folders' do
|
|
117
|
+
@sitemap_tree.add({ destination_path: 'doc/test/test2/test13.html' }.to_ostruct)
|
|
118
|
+
|
|
119
|
+
item = @sitemap_tree.from_url('doc/test/test2/test13')
|
|
120
|
+
expect(item.folder?).to eq false
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it 'should raise an error when adding duplicate URLs' do
|
|
124
|
+
@sitemap_tree.add({ destination_path: 'doc/test/tutorials/test13.html' }.to_ostruct)
|
|
125
|
+
expect { @sitemap_tree.add({ destination_path: 'doc/test/tutorials/test13.html' }.to_ostruct) }.to raise_error Frontman::DuplicateResourceError
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require './spec/spec_setup'
|
|
5
|
+
require 'frontman/toolbox/timer'
|
|
6
|
+
|
|
7
|
+
describe Frontman::Toolbox::Timer do
|
|
8
|
+
it 'should create and start a timer' do
|
|
9
|
+
timer = Frontman::Toolbox::Timer.start
|
|
10
|
+
expect(timer).to be_a Frontman::Toolbox::Timer
|
|
11
|
+
expect(timer.started_at).to_not eq nil
|
|
12
|
+
expect(timer.ended_at).to eq nil
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'should set the stop time correctly' do
|
|
16
|
+
timer = Frontman::Toolbox::Timer.start
|
|
17
|
+
timer.stop
|
|
18
|
+
expect(timer.ended_at).to_not eq nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'should calculate the correct difference' do
|
|
22
|
+
timer = Frontman::Toolbox::Timer.new
|
|
23
|
+
start_time = timer.begin
|
|
24
|
+
end_time = timer.stop
|
|
25
|
+
expect(timer.diff).to eq(end_time - start_time)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should show the correct output' do
|
|
29
|
+
timer = Frontman::Toolbox::Timer.new
|
|
30
|
+
start_time = timer.begin
|
|
31
|
+
end_time = timer.stop
|
|
32
|
+
expect(timer.output).to eq "Elapsed time: ~#{((end_time - start_time) * 1000).ceil} milliseconds.\n"
|
|
33
|
+
end
|
|
34
|
+
end
|