Compare commits

..

1 Commits

Author SHA1 Message Date
Thomas Reynolds 8909d9cbbf WIP refactor 2014-04-23 09:25:27 -07:00
999 changed files with 39329 additions and 37664 deletions

View File

@ -1,13 +0,0 @@
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false

6
.gitignore vendored
View File

@ -1,6 +1,3 @@
.byebug_history
npm-debug.log
manifest.yaml
/.bundle /.bundle
.DS_Store .DS_Store
coverage coverage
@ -13,7 +10,6 @@ Gemfile.lock
docs docs
.rbenv-* .rbenv-*
.ruby-version .ruby-version
.ruby-gemset
.*.swp .*.swp
build build
doc doc
@ -24,4 +20,4 @@ Makefile
.idea .idea
*.sublime-workspace *.sublime-workspace
/bin /bin
middleman-core/fixtures/compass-sprites-app/source/images/icon-s0de2218f58.png middleman-core/fixtures/compass-sprites-app/source/images/icon-s0de2218f58.png

View File

@ -1,24 +1,19 @@
AllCops: AllCops:
Include: Includes:
- '**/Rakefile' - Rakefile
- '**/Gemfile' - Gemfile
- '**/config.ru' - config.ru
- '**/gem_rake_helper.rb' - gem_rake_helper.rb
Exclude: Excludes:
- 'script/**/*' - script/**
- 'vendor/**/*' - vendor/**
- '**/tmp/**/*' - bin/**
- '**/bin/**/*' - middleman-core/lib/vendored-middleman-deps/**
- 'middleman-core/lib/middleman-core/step_definitions/**/*' - middleman-core/bin/**
- 'middleman-core/fixtures/**/*' - middleman-core/fixtures/**
- 'middleman-core/features/**/*' - middleman-core/features/**
- 'middleman-core/spec/**/*' - middleman-core/spec/**
- 'middleman-cli/lib/middleman-cli/templates/**/*' - middleman-templates/lib/middleman-templates/**
- 'middleman-cli/fixtures/**/*'
- 'middleman-cli/features/**/*'
- 'middleman-cli/spec/**/*'
DoubleNegation:
Enabled: false
LineLength: LineLength:
Enabled: false Enabled: false
MethodLength: MethodLength:
@ -27,45 +22,7 @@ ClassLength:
Enabled: false Enabled: false
Documentation: Documentation:
Enabled: false Enabled: false
Encoding:
Enabled: false
HashSyntax: HashSyntax:
EnforcedStyle: ruby19 EnforcedStyle: ruby19
SpaceAroundEqualsInParameterDefault:
EnforcedStyle: no_space
PerlBackrefs:
Enabled: false
ClassAndModuleChildren:
Enabled: false
AssignmentInCondition:
Enabled: false
CyclomaticComplexity:
Enabled: false
HandleExceptions:
Enabled: false
EndAlignment:
AlignWith: variable
SignalException:
Enabled: false
RegexpLiteral:
Enabled: false
FormatString:
Enabled: false
CaseIndentation:
IndentWhenRelativeTo: end
TrivialAccessors:
Enabled: false
SingleLineBlockParams:
Enabled: false
Metrics/AbcSize:
Enabled: false
Metrics/PerceivedComplexity:
Enabled: false
Style/ParallelAssignment:
Enabled: false
Style/BlockDelimiters:
Enabled: false
Style/MultilineBlockChain:
Enabled: false
Style/SpecialGlobalVars:
Enabled: false
Style/FrozenStringLiteralComment:
Enabled: false

View File

@ -1,23 +1,30 @@
language: ruby language: ruby
sudo: false
cache: bundler cache: bundler
before_script: env: TEST=true
- bundle update bundler_args: --without development
before_install: git submodule update --init --recursive
rvm: rvm:
- ruby-head - ruby-head
- 2.3.1 - ruby
- 2.2.4 - jruby-head
os: - jruby
- linux - jruby-19mode
# - osx - 2.1.1
- 2.1.0
- 2.0.0
- 1.9.3
- rbx-2
matrix: matrix:
fast_finish: true fast_finish: true
allow_failures: allow_failures:
- rvm: ruby-head - rvm: ruby-head
env: - rvm: ruby
global: - rvm: jruby-head
- TEST=true - rvm: jruby
- CODECLIMATE_REPO_TOKEN=81787f7b1c3bfa937edadcafbc94f807bf5af5c1142c7b793f2d9969a271de1f - rvm: jruby-19mode
- rvm: rbx-2
env: TEST=true
before_install: git submodule update --init --recursive
script: bundle exec rake test script: bundle exec rake test
notifications: notifications:
slack: middleman:JW9OvXmn1m3XrSERe8866nBR slack: middleman:JW9OvXmn1m3XrSERe8866nBR

View File

@ -7,5 +7,4 @@ middleman-*/lib/**/*.rb
--exclude middleman-cli/lib/middleman-cli/templates/shared/ --exclude middleman-cli/lib/middleman-cli/templates/shared/
--exclude middleman-cli/lib/middleman-cli/templates/extension/ --exclude middleman-cli/lib/middleman-cli/templates/extension/
--no-private --no-private
--hide-void-return --hide-void-return
--markup=markdown

View File

@ -1,148 +1,6 @@
master master
=== ===
# 4.1.13
* Change how config options are passed to Thor. Removes new Thor warnings from #2017
# 4.1.12
* Fix broken `ignore { |p| true }` form.
# 4.1.11
* Upgrade to Rack 2.
# 4.1.10
* Fix unicode issues in URL deeplinks.
* Add prefix option to asset_hash (#1949)
# 4.1.9
* Fix `--watcher-*` CLI flags.
* Allow spaces in paths to work with `link_to`. Fixes #1914
* Add support for dotenv
* Fix asset_url with asset_hash (#1919)
* Allow partial lookups without a current_resource (#1912)
# 4.1.8
* Expose `development?` and `production?` helpers to template context.
* require the `try` core extension (#1911)
* Fix contract for Sitemap::Store.register_resource_list_manipulator (#1907)
* Loosen contract on Resource#source_file to Maybe[String] (#1906)
* Let collection loops access ConfigContext for helpers. #1879
* Use https:// to clone templates (#1901)
* Allow numbers to be unique page_ids (#1886)
* Prevent infinite loop when encountering files where base filename is a possible templating engine
# 4.1.7
* Upgrade fastimage to 2.0
* Fix shutdown of external_pipeline commands when config.rb is changed. #1877
* Allow calls to `app.` to work as collections after initial config parse. #1876
# 4.1.5-4.1.6
* Fix file recursion when looking for possible asset dependencies. Major preview server performance improvement.
# 4.1.4
* Unify default extensions for all URL processing extensions. #1855
* Fix URL regex for `content: ` context of CSS. #1853
* Make sure CLI config over-rides `config.rb` order.
* Fix relative assets in some contexts. #1842
# 4.1.3
* Expose all top-level config options to CLI (flags now match config. latency -> watcher_latency, etc).
* Fix directory indexes with `.htm` and `.xhtml` files. #1821
# 4.1.2
* Add `page_id` concept. Using the `id` key in frontmatter, proxy or page will set an ID on a resource which can be referenced by `url_for` and `link_to`.
* Allow looking for `Gemfile` when setting up a project to fail gracefully.
* Send correct exit code when external_pipeline fails during build.
* Fix error when customizing `layouts_dir`. #1028
* Fix collections (commands in loops) not being processed by `page` command. #1226
* Correctly asset_hash sourcemap references.
# 4.1.1
* Fix bad code that made `/__middleman/` break.
# 4.1.0
* Add rewrite_ignore option to asset_hash, asset_host, cache_buster & relative_assets. This proc let's you opt-out of the extension behavior on a per-path basis.
* gzip extension now compresses svgs by default
* Fix the `encoding` option.
* Fix relative paths on `image_tag` helper.
* Correctly exit with error code on failed `init`
* Fixed `asset_hash` when path has query string or #hashes
* Fix new extension template
* Don't parse frontmatter on ignored files.
* Fix displaying frontmatter on `/__middleman/sitemap`
* Add `skip_build_clean` config which when set to a block, will avoid removing non-generated paths from build, like .git #1716
* Minor performance improvements
* DRY-up config.rb-specific commands like `ignore` or `path`.
* Fix automatic images with absolute (or images dir missing) paths in markdown. Fixes #1755
* Fix asset_host in combination with Google Analytics snippet. #1751
* Show an error message when git CLI is not available. #1765
* Correctly show file names of GZIP'ed assets. #1364
* Build file output is now parallel-ized! Use `middleman build --no-parallel` to disable.
* Make template file extensions that get layouts by default configurable via `config[:extensions_with_layout]`
* Remove `=` from inline url matcher. This means paths in HTML attributes MUST be quoted. Fixes #1780
# 4.0.0
* Add `:locales` and `:data` source types to the list of files which trigger a live-reload.
* Rename i18n `lang` and `langs` to `locale` and `locales`.
* Avoid matching URLs across new lines. #1689
* Load Middleman Directory when doing `init` over SSL
* Fix `external_pipeline` first runs running out of sequence.
# 4.0.0.rc.2
* Rather than applying layouts to all files which are not .txt, .css, .js, .json: the new behavior is to only default layouts to active for .html
* Switch from Ruby Sass to SassC.
* `relative_assets` extension overrides local `relative: false` option to stylesheet/javascript tag helpers.
* Add `before_server`-hook to the preview server which is run before the Webrick server is started
* Add `-d` to `middleman server` to make it run as daemon
* Trigger "Possible File Change" events on files which share an output or template type with a changed file. Allows LiveReload to update on partial changes.
* Added `import_file SOURCE, TARGET` and `import_path SOURCE_FOLDER` to copy resources from outside the project in. Does NOT do file change watching. Perfect for `bower_components`.
# 4.0.0.rc.1
* Removed ability to use JSON as frontmatter. Still allowed in data/ folder.
* Added YAML data postscript. Like frontmatter, but reversed. Attach content after the key/value data as a `:postscript` key to the data structure (if Hash).
# 4.0.0.beta.2
* Fixed regression causing exceptions to be silently thrown away outside of `--verbose` mode in the dev server.
* Pull in `--ssl` option from stable.
* Replace `hooks` gem with custom callback solution.
# 4.0.0.beta.1
* Add `resources` class method to extensions to allow simple string-based resource generation.
* rename `app.add_to_instance` to `Extension.expose_to_application` for adding extension-local methods to the shared app instance.
* rename `app.add_to_config_context` to `Extension.expose_to_config` for adding extension-local methods to the sandboxed scope of `config.rb`
* Add `Extension.expose_to_template`, which auto binds copies of extension-local methods into a Template context.
* Remove side-loading of CLI tasks from `tasks/`
* Add the option of naming `config.rb` as `middleman.rb`.
* Builder extracted from Thor. `after_build` hook now passes an instance of a Builder instead of the Thor CLI.
* New FileWatcher API.
* Remove the `partials_dir` setting. Partials should live next to content, or be addressed with absolute paths.
* Partials must be named with a leading underscore. `_my_snippet.html.erb`, not `my_snippet.html.erb`.
* Removed the `proxy` and `ignore` options for the `page` command in `config.rb`. Use the `proxy` and `ignore` commands instead of passing these options to `page`.
* The `page` command in `config.rb` can now be used to add data to the page via the `data` argument. It is accessed the same way as frontmatter data, via `current_resource.data`.
* Add support for `environments` with the `-e` CLI flag. Loads additional config from `environments/envname.rb`. Removed `development?` helper in favor of `environment?(:development)`. Added `server?` helper to differentiate between build and server mode.
* Removed `with_layout`. Use loops of `page` instead.
* Removed Queryable Sitemap API
* Removed `css_compressor` setting, use `activate :minify_css, :compressor =>` instead.
* Removed `js_compressor` setting, use `activate :minify_javascript, :compressor =>` instead.
* Removed ability to server folders of content statically (non-Middleman projects). * Removed ability to server folders of content statically (non-Middleman projects).
* Prevent local templates being loaded when $HOME is not set * Prevent local templates being loaded when $HOME is not set
* Removed "Implied Extension feature" * Removed "Implied Extension feature"
@ -158,4 +16,459 @@ master
* Remove deprecated `request` instance * Remove deprecated `request` instance
* Remove old module-style extension support * Remove old module-style extension support
* Placed all `config.rb` evaluation inside the `ConfigContext` class * Placed all `config.rb` evaluation inside the `ConfigContext` class
* The preview server can now serve over HTTPS using the `--https` flag. It will use an automatic self-signed cert which can be overridden using `--ssl_certificate` and `--ssl_private_key`. These settings can also be set in `config.rb` * Add :format and :keep_original options to :asset_hash
3.3.0-3.3.2
===
* Update Padrino to 0.12.1. Introduces BREAKING CHANGE for Haml. Helpers which take blocks used to require `-` instead of `=` to work correctly. Now, all helpers which output content should use `=`. See: http://www.padrinorb.com/blog/upgrading-padrino-from-0-11-x-to-0-12-0-guide
* Update Haml to 4.x
* Disable Webrick reverse DNS lookup, vastly improving performance when accessing from a VM.
* Ignore `node_modules` in FileWatcher
* Add `tzinfo-data` for Windows users.
* Prefer loading layouts from `layouts_dir`
* Add `before_build` hook.
* Depend on Erubis and remove support for specifying another ERb engine.
* Removed the ability to set the `sass_cache_path`.
* Improved /__middleman/ meta pages. For example, sitemap view now calls out ignored resources, prints data/options better, and shows which special locals are available on a page.
* Bump Uglifier to 2.5.x
3.2.2
===
* Specify the full path to the NEWLINE constant
* Refactor some internals which were dependent on certain order of operations
* Updated i18n dep
* Updated Uglifier dep
3.2.1
===
* Allow path to be passed to page_classes. #1120
* Parallelize gzip extension using four threads. #1116
* Fix locale issue when using gzip extension
* Better handle UTF-8 filenames
* Update Padrino to 0.11.4 and Tilt to 1.4.1
3.2.0
===
* Dropped support for Ruby 1.8
* Dropped empty "middleman-more" gem
* Support the AsciiDoc format
* `page_classes` now prefixes class names starting with numbers with an alpha character. "x" by default.
* AREL-style sitemap query language no longer mutates on filter
* Logging can now be forwarded to a file
* Syntax errors in config.rb no longer hang the server
* Fixed memory leak when adding blocks to resources. #1020
* Support HEAD requests in the server
3.1.6
===
* Magic sitemap-aware links and image references now work when your markdown engine is Kramdown (the default for Middleman).
* Having the build directory be a symlink no longer causes the --clean (default) option to wipe out your build.
* Fix handling paths and URLs with spaces in them. #961
* Loosen up Kramdown dependency to allow for using version 1.2.
* Loosen up Listen dependency so it works with sass betas.
* Look for assets using url_for before falling back to the "images" directory. #1017
* Do not cache generated redirect index file. #1019
* Make an effort to handle spaces in filenames in a way that url_for can handle. #961
* Fix localization via filename extension. #1015
3.1.5
===
* Escape filenames in regexes. Fixes #942.
* Create automated alt tag addition, based on image name.
* Add listener latency option. (Aliased to -l)
* Add support/tests for Redcarpet 3.0.0 features
- :underline
- :highlight
- :disable_indented_code_blocks
* Fix support for
- :link_attributes
- :filter_html
3.1.4
===
* Support kramdown 1.1
* Support redcarpet's :no_links & :no_images. #951
3.1.3
===
* Fixed typo in rack extensions block
* Add support for nojekyll dotfile
3.1.2
===
* Locales regex was broken, selecting .yml files from data folder.
* Fix for implied extensions getting a layout. (Mentioned in #901)git pu
* Added `redirect` command for generating meta refreshes
3.1.1
===
* Check if set is redefining a param at the class level. Fixes #939
* Correctly escape `content_tag` when using a block. Fixes #941
3.1.0 Highlights
===
* Autoload support (moving away from middleman-more)
* New Configuration System
* New v4 Extension API
* `/__middleman' inspector
* Added Ruby 2.0, dropped Ruby 1.9.2
* Fully tested on JRuby 1.9
* Build defaults to --clean
3.1.0.rc.4
===
* Blocks with different templating languages than their layout now work as expected. #860
* Ruby 1.8 users will need to add the following to their Gemfiles:
platforms :mri_18 do
gem "ruby18_source_location"
end
* The `endpoint` method allows the building of Rack-based files or arbitrary content.
3.1.0.rc.2
===
* `layouts_dir` is now configurable
* Custom template classes can now override the file used for creating the project Gemfile.
* Add an "empty" template that produces the minimum necessary structure for a Middleman project.
* Fix ignoring layouts from the sitemap when the source directory has been set to something other than 'source'. #896
* Track test coverage with simplecov
* i18n only autodetects languages in the `locales` root
* Frontmatter cache fixes solve performance regressions found in 3.1.x
* Vendor padrino-* to avoid dep hell
* `middleman-more` gem returns, but it's empty for backwards compat
* Prefer internal files.exists? over ruby's slow File.exists?
3.1.0.rc.1
===
* Move more into core, autoloaded if gems are available.
* DataStore may now be accessed like a hash with #[] and #has_key?. #880
* The i18n extension now supports providing localized templates as separate files, like index.es.html.haml. #816, #823
* The list of regular expressions for which files are ignored by the file watcher are now configurable.
* Revert to Thor 0.15.x
* Revert to padrino-helpers 0.10.x (dependency hell)
* Drop i18n dep to match activesupport at 0.6.1
3.1.0.beta.2
===
* Extension template uses new class-based Extension
* Fix missing children in some sitemap traversal operations. #837
* Add respond_to? to DataStore. #872
* Allow discovery of prerelease gems. #873
* Include middleman-livereload in default Gemfile
* Update Rack dependency to 1.5.x
* Update to Listen 1.0.x
* Update to padrino-helpers 0.11.x
* Update uglifier to 2.0.x
* Convert all of middleman-more to new class-based Extensions
3.1.0.beta.1
===
* Support Slim 2.0 ::Slim::Embedded
* "middleman build" will clean out old files from the build directory by default now, without needing to pass "--clean". Pass "--no-clean" to disable. #862
* Allow frontmatter to be side-loaded from a neighboring file with a .frontmatter extension: #855
* Allow frontmatter "renderer_options" key to overwrite renderer options on a per-file basis. #859
* A custom :partials_dir may be configured, and partials will be looked up from it. #854
* The sprockets environment is now available before config.rb is run, so you can mess with it.
* Added a "t" helper that delegates to I18n.t, just like Rails. #853.
* I18n will fall back to the default locale if a translation in the current locale is not found. You can disable this behavior by passing `:no_fallbacks => true` when activating `:i18n`. More settings documented at https://github.com/svenfuchs/i18n/wiki/Fallbacks . #853
* Switched default Markdown engine to Kramdown. #852
* Overhaul content-type handling, and add a `:content_type` parameter for `page`, `proxy`, and frontmatter that allows for overriding the default content type. #851
* Fixes for upcoming Sass versions.
* Fix markdown filters in Haml 4 so that they don't throw errors when generating links/images and so they use our magic image_tag/link_to methods. #662
* Fix a number of bugs with i18n. Add a `:lang` option that can be used with `page` or `proxy` to set the I18n.locale of a page. #845
* Directory names in the data folder are treated as part of the data key. #836
* Properly reload the server when files change in "lib" or "helpers". #835
* Replace Rainpress CSS minifier with the one built into Sass.
* Changed 'default' and 'html5' templates to use 'current_page.data.title' instead of 'data.page.title'. #825
* Include file extension in template cache. #798
* Support for Ruby 2.0.0.
* "middleman console" will give you a console where you can mess around inside your middleman context. #775
* Add to Compass import paths instead of resetting them. #707
* There are now metadata pages in the preview server at "/__middleman/" that show information about the sitemap and site configuration. #374 and #776
* The sitemap is now queryable with an ARel-like API. #650
* Reorganize SMACSS template. #591
* No longer bundle native file watchers - add an appropriate gem (rb-fsevent for OS X, rb-inotify for Linux, wdm for windows) to your Gemfile.
* `activate :asset_host, :host => hostname` can be used to configure `:asset_host`.
* Path matchers (for things like ignore and page) correctly work with string matchers. #689
* Configuration has been moved to Middleman::Configuration::ConfigurationManager. This is backwards-compatible, but offers a nicer way of getting and setting configuration for extensions, including documenting those settings and their defaults. #620.
3.0.13
===
* Require Tilt 1.3.6 (older versions have errant .csv template type)
* Unregister Tilt HTML handler
* Fix dynamic multi-byte utf-8 files rebuilding. #806
* Force locale to english for number_to_human_size in the gzip extension. #804
* Don't use the logger from a trap context. Ruby 2.0.0 support. #801.
* Serve extensionless files or dotfiles with text/plain MIME type
3.0.12
===
* Update to listen 0.7.x. No longer depend on rb-inotify. *nix users should add to Gemfile.
* Support Haml 4
* :debug_assets can no longer be turned on in the build environment.
* Helpers now work with JS/CSS files with .erb processing.
* Provide an informative exception when link_to is used improperly.
* Force .svgz files to be treated as binary.
* Add a url_for method that performs the link_to magic URL generation without a link. Make form_for use url_for. #739
* Fix issues when combining relative assets and cache buster.
* Support the .yaml extension for data files.
* Handle non-english default languages in i18n. Fixes #584. #771
* Allow frontmatter to be parsed on templates outside the project root
* Improve detection of binary files. #763
* Add before_render and after_render hooks that can be used by extensions to modify templates before they're rendered or modify the rendered output before it's returned. #761 & #774
* Tightened up dependencies
* Print the command for running middleman in verbose mode with quotes so Bundler doesn't swallow the verbose flag. #750
3.0.11
====
* Mitigate major perf regression caused by the Middleman::Util#binary? method
3.0.10
====
* Avoid looking in binary files for frontmatter. #728
* Allow nested i18n files. #725
* Better adapt to Rack interface. #709
* Add --force-polling flag. #730, #644
3.0.9
====
* Lock Rack to 1.4.1 until BodyProxy bug is resolved. #709
* Safely de-register Tilt extensions which are missing gems. #713
3.0.8
====
* Directly send binary files in preview and copy them in build, avoiding reading large binary files into memory for rendering. #643 #699
* Make link_to helper ignore QueryString values when looking up Sitemap resources
* Directly copy binary files during build, and stream them during preview, to avoid reading them into memory
* Make sure all paths in Sitemap are using Pathname
3.0.7
====
* Turn html5 boilerplate into a layout
* Fix errors when templates have empty YAML
* Show the hostname when initializing MM
* Fix issues when using Redcarpet inside Slim
* Make automatic_image_sizes avoid SVGs
3.0.6
====
* Make Sitemap more thread-safe.
* Asset-hash fixes in conjunction with Sprockets.
* Proxy improvements.
* Handle directories with a tilde (~) in their path.
* Print better error message which port is already in use.
* Terminal signal improvements, shutsdown correctly when Terminal closed.
* Bundled Normalize.css updated to 2.0.1
* Fixed Encoding extension activation
* Reload i18n on file changes (#616)
3.0.5
====
* Require newer version of listen.
* Handful of sitemap speed improvements.
* Fix previewing of directories with periods in their name.
* Add CLI ability to skip gemfile and bundler init.
* Fix asset_hash when used in conjunction with Rack middleware.
* Fix LiveReload extension issues.
3.0.3-3.0.4
====
* Add reload_paths to server CLI to add additional paths to reload MM on change.
* Re-organize app reloading code, don't need to restart listen every time.
3.0.2
====
* Logger has no such method .warning. Closes #582
3.0.1
====
* HTML5 Boilerplate version 4.0.0
* Use wdm for Windows
* Fix buggy color renaming in built-in CSS minifier. #576
* Fix Sass/Scss filter in Slim templates
* Added SMACSS template
* Give file metadata (such as frontmatter) precedence over path meta. #552
* Add `sass_assets_paths` option for arbitrary sass partial locations.
* Don't catch CoffeeScript errors when in build mode.
* Extract load_paths so they aren't locked into the binary
* Add middleman/rack for better config.ru support
* Use centralized Logger and add benchmark methods
3.0.0
====
* Improve asset methods and link_to by making them more clever and aware of options such as relative_assets and http_prefix
* Refer to --verbose, instead of --debug in CLI error message (#505)
* Cleanup listener setup and teardown
* Update to Padrino 0.10.7 and Thor 0.15 (#495)
* Build output correctly shows update and identical, instead of create for all.
* automatic_directory_matcher (#491)
3.0.0.rc.2
====
* Doing a build now shows identical files (#475)
* asset_hash, minify_javascript, and minify_css can now accept regexes, globs,
and procs (#489, #480)
* The `link_to` helper can now accept a sitemap Resource as a URL (#474)
* The preview server now correctly listens for changes (#487, #464)
* HTMLs are now served with a 'utf-8' charset instead of 'utf8' (#478)
* UTF-8 is now the new default encoding for data and templates (#486, #483)
* New :encoding setting that allows users to change default encoding
* You may now use the `use` method with a block when adding Rack middleware
* Middleman now depends on Listen 0.4.5+ and ActiveSupport 3.2.6+
* Attempt to avoid issues with RVM's default Bundler (#466)
* Fix issue where Middleman won't start with Compass 0.12.2.rc.1 (#469)
3.0.0.rc.1
====
* Split into 3 gems (middleman-core, middleman-more and middleman which simply includes both)
* Rewritten to work directly with Rack (Sinatra apps can still be mounted)
* Sitemap maintains own state
* New Extension Registration API
* Remove old 1.x mm- binaries and messaging
* New default layout functionality: https://github.com/middleman/middleman/issues/165
* Enable chained templates outside of sprockets (file.html.markdown.erb)
* Sitemap object representing the known world
* FileWatcher proxies file change events
* Unified callback solution
* Removed Slim from base install. Will need to be installed and required by the user (in - config.rb)
* Activate mobile html5boilerplate template
* Update to Redcarpet for Markdown (breaks Haml :markdown filter)
* Return correct exit codes (0 for success, 1 for failure) from CLI
* Yard code docs: http://rubydoc.info/github/middleman/middleman
* config.rb and extensions can add command-line commands
* Nested layouts using `wrap_layout` helper
* Support for placekitten.com
* Added MM_ROOT environmental variable
* activating extensions can now take an options hash
* Don't re-minify files with ".min" in their name
* Serve purely static folders directly (without source/ and config.rb)
* Set ignored files and disable directory_indexes from YAML frontmatter
* Automatically load helper modules in helpers/ directory
* Add pid for cleanup
* Use guard/listen for file watching
* Merge full i18n support
* Implied file extensions (style.scss => style.css)
* Padrino 0.10.6
* `middleman init` generates a `Gemfile` by default.
* Errors stop the build and print a stacktrace rather than silently getting printed into files.
* `with_layout` works with globs or regexes.
* Setting `directory_index` from `page` with a glob or regex now works.
* `:gzip` extension for pre-gzipping files for better compression with no server CPU cost.
* `:asset_hash` extension that generates unique-by-content filenames for assets and rewrites references to use those filenames, so you can set far-future expires on your assets.
* Removed the `--relative` CLI option.
* Properly output Compass-generated sprited images.
* Switch built-in CSS compressor to Rainpress.
* Automatically load helper modules from `helpers/`, like Rails.
* `ignore` and `page` both work with file globs or regexes.
* `layout`, `ignore`, and `directory_index` can be set from front matter.
* JavaScript and CSS are minified no matter where they are in the site, including in inline code blocks.
* Files with just a template extension get output with the correct exension (foo.erb => foo.html)
* `link_to` is smart about source paths, and can produce relative URLs with the `:relative` option or the sitewide `:relative_links` setting.
* Include vendored assets in sprockets path.
* Finally support Compass in Sprockets! Thanks to @xdite and @petebrowne
* Moved Sprockets into an extension
* Support loading Less @imports
2.0.14
====
* Minor fix for i18n
2.0.13.2
====
* Update Windows eventmachine dep
2.0.13.1
====
* build --clean shouldn't remove dotfiles
2.0.13
====
* middleman build --clean keeps the build directory clean of leftover files
* Padrino 0.10.5 and Rack 1.3.5
2.0.12
====
* Sinatra 1.3.1 and Padrino 0.10.4
2.0.11
=====
* Lock Padrino and Sinatra versions (for now)
2.0.9
=====
* Added --glob option to build which only builds matching files
* Allow data/ files to be in JSON format as well
* Enabled Liquid {% include %} tag
* RubyInstaller-specific gem
* Allow access to data/ in config.rb
* Add mobile html5boilerplate template
2.0.8
=====
* Support accessing variables and data objects in ERb Sprockets files (library.js.coffee.erb)
* Make :markdown_engine support simple symbol names (:maruku instead of ::Tilt::MarkukuTemplate)
* Update Padrino deps to 0.10.2
* Include therubyracer on *nix
* Enable frontmatter for Liquid templates
2.0.7
=====
* Updated HTML5 Boilerplate to v2
* Make Rails 3.1 javascript gems available to Sprockets
2.0.6
=====
* Pulled out livereload feature into its own extension, still installed by default.
2.0.5
=====
* Vendored Padrino 0.10.0
2.0.4
=====
* Pulled out undocumented remote data feature into its own extension
2.0.3
=====
* Pulled out undocumented Blog feature into its own extension
2.0.2
=====
* Fixed Sprockets circular error
* Added auto-requiring extensions
2.0.0
=====
* Guard-powered auto-reloading of config.rb
* Guard LiveReload
* Sprockets JS
* Refactored Dynamically Reloadable Core
* Combine views/ and public/ into a single source/ folder.
* Support YAML front-matter
* Added callback to run code after Compass is configured
* Added support for a compass.config file which is passed directly to Compass
* Blog-aware Feature (and project template)
* Thor-based, unified `middleman` binary
* :directory_indexes feature

View File

@ -29,9 +29,6 @@ Ideally, a bug report should include a pull request with failing specs.
[gist]: https://gist.github.com/ [gist]: https://gist.github.com/
## Submitting a Pull Request ## Submitting a Pull Request
**WE DO NOT ACCEPT NEW FEATURES FOR THE V3 BRANCH ANYMORE**
1. [Fork the repository.][fork] 1. [Fork the repository.][fork]
2. Create a topic [branch]. `git checkout -b local_topic_branch` 2. Create a topic [branch]. `git checkout -b local_topic_branch`
3. Add specs for your unimplemented feature or bug fix. 3. Add specs for your unimplemented feature or bug fix.

66
Gemfile
View File

@ -1,52 +1,42 @@
source 'https://rubygems.org' source 'https://rubygems.org'
# Build and doc tools # Build and doc tools
gem 'rake', '~> 10.3', require: false gem 'rake', '~> 10.0.3', require: false
gem 'yard', '~> 0.8', require: false gem 'yard', '~> 0.8.0', require: false
# Test tools # Test tools
gem 'byebug' gem 'cucumber', '~> 1.3.1'
gem 'aruba', '~> 0.7.4', require: false gem 'fivemat', '~> 1.2.1'
gem 'rspec', '~> 3.0', require: false gem 'aruba', '~> 0.5.1'
gem 'cucumber', '~> 2.0', require: false gem 'rspec', '~> 2.12'
gem 'addressable', '~> 2.4.0', require: false gem 'simplecov'
# Pry tools
gem 'pry'
gem 'pry-stack_explorer'
gem 'pry-rescue'
# Optional middleman dependencies, included for tests # Optional middleman dependencies, included for tests
gem 'haml', '>= 4.0.5', require: false gem 'haml', '~> 4.0.0', require: false # Make sure to use Haml 4 for tests
gem 'sassc', '~> 1.8', require: false gem 'sinatra', require: false
gem 'coffee-script', '~> 2.2', require: false gem 'slim', require: false
gem 'kramdown', '~> 1.2', require: false gem 'liquid', require: false
gem 'slim', '>= 2.0', require: false gem 'less', '~> 2.3.0', require: false
gem 'liquid', '>= 2.6', require: false gem 'stylus', require: false
gem 'stylus', '>= 1.0', require: false
gem 'sinatra', '>= 2.0.0.beta2', require: false
gem 'redcarpet', '>= 3.1', require: false
# Dns server to test preview server platforms :ruby do
gem 'rubydns', '~> 1.0.1', require: false gem 'therubyracer'
gem 'redcarpet', '~> 3.1'
gem 'pry', require: false, group: :development
end
# To test javascript platforms :jruby do
gem 'poltergeist', '~> 1.8', require: false gem 'therubyrhino'
gem 'phantomjs', '~> 2.1.1.0', require: false end
# For less, note there is no compatible JS runtime for windows
gem 'therubyrhino', '>= 2.0', platforms: :jruby
gem 'therubyracer', '>= 0.12', platforms: :ruby
# Code Quality # Code Quality
gem 'rubocop', '~> 0.24', require: false gem 'cane', platforms: [:mri_19, :mri_20], require: false
gem 'simplecov', '~> 0.10', require: false gem 'coveralls', require: false
gem 'coveralls', '~> 0.8', require: false gem 'rubocop', require: false, group: :development
gem 'codeclimate-test-reporter', '~> 0.3', require: false, group: :test
# Middleman itself # Middleman itself
gem 'middleman-cli', path: 'middleman-cli'
gem 'middleman-core', path: 'middleman-core' gem 'middleman-core', path: 'middleman-core'
gem 'middleman-cli', path: 'middleman-cli'
# gem 'middleman-compass', github: 'middleman/middleman-compass', require: false gem 'middleman-templates', path: 'middleman-templates'
# gem 'middleman-sprockets', github: 'middleman/middleman-sprockets', require: false gem 'middleman-sprockets', github: 'middleman/middleman-sprockets', require: false
gem 'middleman', path: 'middleman'

View File

@ -1,9 +0,0 @@
## Expected behavior and actual behavior
## Steps to reproduce the problem (from a clean middleman installation)
## Additional information
- Ruby version:
- Middleman version:
- OS version:

View File

@ -1,7 +1,5 @@
# Middleman - Makes developing websites simple # Middleman - Makes developing websites simple
[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/middleman/middleman?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
**Middleman** is a static site generator using all the shortcuts and tools in modern web development. Check out [middlemanapp.com](http://middlemanapp.com/) for detailed tutorials, including a [getting started guide](http://middlemanapp.com/basics/getting-started/). You can also follow [@middlemanapp](https://twitter.com/middlemanapp) for updates. **Middleman** is a static site generator using all the shortcuts and tools in modern web development. Check out [middlemanapp.com](http://middlemanapp.com/) for detailed tutorials, including a [getting started guide](http://middlemanapp.com/basics/getting-started/). You can also follow [@middlemanapp](https://twitter.com/middlemanapp) for updates.
## Why Middleman? ## Why Middleman?
@ -10,7 +8,7 @@ The last few years have seen an explosion in the amount and variety of tools dev
* [Sass](http://sass-lang.com/) for DRY stylesheets * [Sass](http://sass-lang.com/) for DRY stylesheets
* [CoffeeScript](http://coffeescript.org/) for safer and less verbose javascript * [CoffeeScript](http://coffeescript.org/) for safer and less verbose javascript
* Multiple asset management solutions, including [Sprockets](https://github.com/rails/sprockets) * Multiple asset management solutions, including [Sprockets](https://github.com/sstephenson/sprockets)
* [ERb](http://ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html) & [Haml](http://haml.info/) for dynamic pages and simplified HTML syntax * [ERb](http://ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html) & [Haml](http://haml.info/) for dynamic pages and simplified HTML syntax
**Middleman** gives the stand-alone developer access to all these tools and many, many more. Why would you use a stand-alone framework instead of Ruby on Rails? **Middleman** gives the stand-alone developer access to all these tools and many, many more. Why would you use a stand-alone framework instead of Ruby on Rails?
@ -19,7 +17,7 @@ These days, many websites are built with an API in mind. Rather than package the
## Installation ## Installation
Middleman is built on Ruby and uses the RubyGems package manager for installation. These are usually pre-installed on Mac OS X and Linux. Windows users can install both using [RubyInstaller]. For windows [RubyInstaller-Devkit] is also required. Middleman is built on Ruby and uses the RubyGems package manager for installation. These are usually pre-installed on Mac OS X and Linux. Windows users can install both using [RubyInstaller].
``` ```
gem install middleman gem install middleman
@ -64,13 +62,11 @@ Additionally, up-to-date generated code documentation is available on [RubyDoc].
## Build & Dependency Status ## Build & Dependency Status
[![Gem Version](http://img.shields.io/gem/v/middleman.svg?style=flat)][gem] [![Gem Version](http://img.shields.io/gem/v/middleman.svg)][gem]
[![License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)][license] [![Build Status](http://img.shields.io/travis/middleman/middleman.svg)][travis]
[![Dependency Status](http://img.shields.io/gemnasium/middleman/middleman.svg?style=flat)][gemnasium] [![Code Coverage](http://img.shields.io/coveralls/middleman/middleman.svg)][coveralls]
[![Build Status](http://img.shields.io/travis/middleman/middleman.svg?style=flat)][travis] [![Dependency Status](http://img.shields.io/gemnasium/middleman/middleman.svg)][gemnasium]
[![Code Coverage](http://img.shields.io/coveralls/middleman/middleman.svg?style=flat)][coveralls] [![Code Quality](http://img.shields.io/codeclimate/github/middleman/middleman.svg)][codeclimate]
[![Code Quality](http://img.shields.io/codeclimate/github/middleman/middleman.svg?style=flat)][codeclimate]
[![Gittip](http://img.shields.io/gittip/middleman.svg?style=flat)][gittip]
## Community ## Community
@ -91,27 +87,11 @@ The best way to get quick responses to your issues and swift fixes to your bugs
## Donate ## Donate
[Click here to lend your support to Middleman](https://plasso.co/s/4dXbHBorC3) [Click here to lend your support to Middleman](https://spacebox.io/s/4dXbHBorC3)
## Versioning
This library aims to adhere to [Semantic Versioning 2.0.0][semver]. Violations
of this scheme should be reported as bugs. Specifically, if a minor or patch
version is released that breaks backward compatibility, that version should be
immediately yanked and/or a new version should be immediately released that
restores compatibility. Breaking changes to the public API will only be
introduced with new major versions. As a result of this policy, you can (and
should) specify a dependency on this gem using the [Pessimistic Version
Constraint][pvc] with two digits of precision. For example:
spec.add_dependency 'middleman-core', '~> 4.0'
[semver]: http://semver.org/
[pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
## License ## License
Copyright (c) 2010-2015 Thomas Reynolds. MIT Licensed, see [LICENSE] for details. Copyright (c) 2010-2014 Thomas Reynolds. MIT Licensed, see [LICENSE] for details.
[middleman]: http://middlemanapp.com [middleman]: http://middlemanapp.com
[gem]: https://rubygems.org/gems/middleman [gem]: https://rubygems.org/gems/middleman
@ -119,8 +99,6 @@ Copyright (c) 2010-2015 Thomas Reynolds. MIT Licensed, see [LICENSE] for details
[coveralls]: https://coveralls.io/r/middleman/middleman [coveralls]: https://coveralls.io/r/middleman/middleman
[gemnasium]: https://gemnasium.com/middleman/middleman [gemnasium]: https://gemnasium.com/middleman/middleman
[codeclimate]: https://codeclimate.com/github/middleman/middleman [codeclimate]: https://codeclimate.com/github/middleman/middleman
[gittip]: https://www.gittip.com/middleman/
[rubyinstaller]: http://rubyinstaller.org/ [rubyinstaller]: http://rubyinstaller.org/
[RubyInstaller-Devkit]: http://rubyinstaller.org/add-ons/devkit/
[rubydoc]: http://rubydoc.info/github/middleman/middleman [rubydoc]: http://rubydoc.info/github/middleman/middleman
[LICENSE]: https://github.com/middleman/middleman/blob/master/LICENSE.md [LICENSE]: https://github.com/middleman/middleman/blob/master/LICENSE.md

View File

@ -1,66 +1,118 @@
require 'rubygems' unless defined?(Gem)
# require 'fileutils' unless defined?(FileUtils)
require 'rake' require 'rake'
require File.expand_path('../middleman-core/lib/middleman-core/version.rb', __FILE__) require File.expand_path('../middleman-core/lib/middleman-core/version.rb', __FILE__)
ROOT = File.expand_path(File.dirname(__FILE__)) ROOT = File.expand_path(File.dirname(__FILE__))
GEM_NAME = 'middleman'.freeze GEM_NAME = 'middleman'
middleman_gems = %w(middleman-core middleman-cli middleman) middleman_gems = %w(middleman-core middleman-templates middleman-cli middleman)
GEM_PATHS = middleman_gems.freeze GEM_PATHS = middleman_gems.freeze
def sh_rake(command) def sh_rake(command)
sh "#{Gem.ruby} -S rake #{command}", verbose: true sh "#{Gem.ruby} -S rake #{command}", :verbose => true
end
def say(text, color=:magenta)
n = { :bold => 1, :red => 31, :green => 32, :yellow => 33, :blue => 34, :magenta => 35 }.fetch(color, 0)
puts "\e[%dm%s\e[0m" % [n, text]
end
desc "Run 'install' for all projects"
task :install do
GEM_PATHS.each do |dir|
Dir.chdir(dir) { sh_rake(:install) }
end
end
desc 'Clean pkg and other stuff'
task :clean do
GEM_PATHS.each do |g|
%w[tmp pkg coverage].each { |dir| sh 'rm -rf %s' % File.join(g, dir) }
end
end
desc 'Clean pkg and other stuff'
task :uninstall do
sh 'gem search --no-version middleman | grep middleman | xargs gem uninstall -a'
end end
desc 'Displays the current version' desc 'Displays the current version'
task :version do task :version do
puts "Current version: #{Middleman::VERSION}" say "Current version: #{Middleman::VERSION}"
end end
desc 'Bumps the version number based on given version'
task :bump, [:version] do |t, args|
raise 'Please specify version=x.x.x !' unless args.version
version_path = File.dirname(__FILE__) + '/middleman-core/lib/middleman-core/version.rb'
version_text = File.read(version_path).sub(/VERSION = '[\d\.\w]+'/, "VERSION = '#{args.version}'")
say "Updating Middleman to version #{args.version}"
File.open(version_path, 'w') { |f| f.write version_text }
sh 'git commit -a -m "Bumped version to %s"' % args.version
end
desc 'Executes a fresh install removing all middleman version and then reinstall all gems'
task :fresh => [:uninstall, :install, :clean]
desc 'Pushes repository to GitHub' desc 'Pushes repository to GitHub'
task :push do task :push do
puts 'Pushing to github...' say 'Pushing to github...'
sh "git tag v#{Middleman::VERSION}" sh "git tag v#{Middleman::VERSION}"
sh 'git push' sh 'git push origin master'
sh "git push origin v#{Middleman::VERSION}" sh "git push origin v#{Middleman::VERSION}"
end end
desc 'Release all middleman gems' desc 'Release all middleman gems'
task publish: :push do task :publish => :push do
puts 'Pushing to rubygems...' say 'Pushing to rubygems...'
GEM_PATHS.each do |dir| GEM_PATHS.each do |dir|
Dir.chdir(dir) { sh_rake('release') } Dir.chdir(dir) { sh_rake('release') }
end end
Rake::Task['clean'].invoke
end end
desc 'Generate documentation for all middleman gems' desc 'Generate documentation for all middleman gems'
task :doc do task :doc do
GEM_PATHS.each do |g| GEM_PATHS.each do |g|
Dir.chdir(File.join(ROOT, g).to_s) { sh "#{Gem.ruby} -S rake yard" } Dir.chdir("#{File.join(ROOT, g)}") { sh "#{Gem.ruby} -S rake yard" }
end end
end end
desc 'Run tests for all middleman gems' desc 'Run tests for all middleman gems'
task :test do task :test do
Rake::Task['rubocop'].invoke
GEM_PATHS.each do |g| GEM_PATHS.each do |g|
Dir.chdir(File.join(ROOT, g).to_s) { sh "#{Gem.ruby} -S rake test" } Dir.chdir("#{File.join(ROOT, g)}") { sh "#{Gem.ruby} -S rake test" }
end end
end end
desc 'Run specs for all middleman gems' desc 'Run specs for all middleman gems'
task :spec do task :spec do
GEM_PATHS.each do |g| GEM_PATHS.each do |g|
Dir.chdir(File.join(ROOT, g).to_s) { sh "#{Gem.ruby} -S rake spec" } Dir.chdir("#{File.join(ROOT, g)}") { sh "#{Gem.ruby} -S rake spec" }
end end
end end
require 'rubocop/rake_task' begin
desc 'Run RuboCop to check code consistency' require 'cane/rake_task'
RuboCop::RakeTask.new(:rubocop) do |task| desc 'Run cane to check quality metrics'
task.fail_on_error = false Cane::RakeTask.new(:quality) do |cane|
cane.no_style = true
cane.no_doc = true
cane.abc_glob = 'middleman*/lib/middleman*/**/*.rb'
end
rescue LoadError
end
begin
require 'rubocop/rake_task'
desc 'Run RuboCop to check code consistency'
Rubocop::RakeTask.new(:rubocop) do |task|
task.fail_on_error = false
end
rescue LoadError
end end
desc 'Run tests for all middleman gems' desc 'Run tests for all middleman gems'
task default: :test task :default => :test

View File

@ -1,3 +1,4 @@
require 'rubygems' unless defined?(Gem)
require 'rake' require 'rake'
require 'yard' require 'yard'
@ -18,28 +19,27 @@ Cucumber::Rake::Task.new do |t|
exempt_tags = ['--tags ~@wip'] exempt_tags = ['--tags ~@wip']
exempt_tags << '--tags ~@nojava' if RUBY_PLATFORM == 'java' exempt_tags << '--tags ~@nojava' if RUBY_PLATFORM == 'java'
exempt_tags << '--tags ~@encoding' unless Object.const_defined?(:Encoding) exempt_tags << '--tags ~@encoding' unless Object.const_defined?(:Encoding)
exempt_tags << '--tags ~@nowindows' if Gem.win_platform?
exempt_tags << '--tags ~@travishatesme' if ENV['TRAVIS'] == 'true' exempt_tags << '--tags ~@travishatesme' if ENV['TRAVIS'] == 'true'
t.cucumber_opts = "--require features --color #{exempt_tags.join(' ')} --strict" # --format #{ENV['CUCUMBER_FORMAT'] || 'Fivemat'}" t.cucumber_opts = "--color #{exempt_tags.join(" ")} --strict --format #{ENV['CUCUMBER_FORMAT'] || 'Fivemat'}"
end end
Cucumber::Rake::Task.new(:cucumber_wip) do |t| Cucumber::Rake::Task.new(:cucumber_wip) do |t|
exempt_tags = ['--tags @wip'] exempt_tags = ['--tags @wip']
exempt_tags << '--tags ~@nojava' if RUBY_PLATFORM == 'java'
exempt_tags << '--tags ~@encoding' unless Object.const_defined?(:Encoding) exempt_tags << '--tags ~@encoding' unless Object.const_defined?(:Encoding)
exempt_tags << '--tags ~@nowindows' if Gem.win_platform? t.cucumber_opts = "--color #{exempt_tags.join(" ")} --strict --format #{ENV['CUCUMBER_FORMAT'] || 'Fivemat'}"
t.cucumber_opts = "--require features --color #{exempt_tags.join(' ')} --strict" # --format #{ENV['CUCUMBER_FORMAT'] || 'Fivemat'}"
end end
require 'rspec/core/rake_task' require 'rspec/core/rake_task'
desc 'Run RSpec' desc 'Run RSpec'
RSpec::Core::RakeTask.new do |spec| RSpec::Core::RakeTask.new do |spec|
spec.pattern = 'spec/**/*_spec.rb' spec.pattern = 'spec/**/*_spec.rb'
spec.rspec_opts = ['--color', '--format documentation'] spec.rspec_opts = ['--color', '--format nested']
end end
desc 'Run tests, both RSpec and Cucumber' desc 'Run tests, both RSpec and Cucumber'
task test: [:spec, :cucumber] task :test => [:spec, :cucumber]
YARD::Rake::YardocTask.new YARD::Rake::YardocTask.new
task default: :test task :default => :test

View File

@ -5,5 +5,4 @@ lib/**/*.rb
--exclude lib/middleman-cli/templates/shared/ --exclude lib/middleman-cli/templates/shared/
--exclude lib/middleman-cli/templates/extension/ --exclude lib/middleman-cli/templates/extension/
--no-private --no-private
--hide-void-return --hide-void-return
--markup=markdown

View File

@ -1,4 +1,4 @@
# coding:utf-8 # coding:utf-8
RAKE_ROOT = __FILE__.freeze RAKE_ROOT = __FILE__
GEM_NAME = 'middleman-cli'.freeze GEM_NAME = 'middleman-cli'
require File.expand_path(File.dirname(__FILE__) + '/../gem_rake_helper') require File.expand_path(File.dirname(__FILE__) + '/../gem_rake_helper')

View File

@ -4,67 +4,15 @@ require 'middleman-core/profiling'
if ARGV.include? '--profile' if ARGV.include? '--profile'
Middleman::Profiling.profiler = Middleman::Profiling::RubyProfProfiler.new Middleman::Profiling.profiler = Middleman::Profiling::RubyProfProfiler.new
end end
# Middleman::Profiling.start Middleman::Profiling.start
require "middleman-core/load_paths" require "middleman-core/load_paths"
Middleman.setup_load_paths Middleman.setup_load_paths
require 'dotenv'
::Dotenv.load
require 'middleman-core'
require 'middleman-core/logger'
module Middleman::Cli
class << self
attr_accessor :config
end
def self.import_config(base)
::Middleman::Cli.config.all_settings.each do |setting|
if setting.default.is_a?(String) || setting.default.is_a?(NilClass)
base.class_option setting.key,
type: :string,
desc: setting.description
elsif setting.default.is_a?(TrueClass) || setting.default.is_a?(FalseClass)
base.class_option setting.key,
type: :boolean,
desc: setting.description
end
end
end
end
require "middleman-cli" require "middleman-cli"
# Change directory to the root # Change directory to the root
Dir.chdir(ENV["MM_ROOT"]) if ENV["MM_ROOT"] Dir.chdir(ENV["MM_ROOT"]) if ENV["MM_ROOT"]
# Default command is server
if ARGV[0] != 'help' && (ARGV.length < 1 || ARGV.first.include?('-'))
ARGV.unshift('server')
end
::Middleman::Logger.singleton(3)
::Middleman::Cli.config = ::Middleman::Application.new do
#
config[:environment] = (ENV['MM_ENV'] || ENV['RACK_ENV'] || 'development').to_sym
config[:mode] = :config
config[:exit_before_ready] = true
config[:watcher_disable] = true
config[:disable_sitemap] = true
end.config
# Require the Middleman version
require 'middleman-core/version'
# Include the core CLI items
require 'middleman-cli/init'
require 'middleman-cli/extension'
require 'middleman-cli/server'
require 'middleman-cli/build'
require 'middleman-cli/console'
require 'middleman-cli/config'
# Start the CLI # Start the CLI
Middleman::Cli::Base.start(ARGV) Middleman::Cli::Base.start

View File

@ -1,93 +0,0 @@
Feature: Middleman CLI
Scenario: Create a new project
When I run `middleman init MY_PROJECT` interactively
And I type "y"
And I type "y"
And I type "y"
And I type "y"
Then the exit status should be 0
When I cd to "MY_PROJECT"
Then the following files should exist:
| Gemfile |
| .gitignore |
| config.rb |
| source/index.html.erb |
| source/layouts/layout.erb |
| source/javascripts/all.js |
| source/stylesheets/site.css.scss |
| source/stylesheets/_normalize.scss |
Scenario: Create a new project in the current directory
Given a directory named "MY_PROJECT"
When I cd to "MY_PROJECT"
And I run `middleman init` interactively
And I type "y"
And I type "y"
And I type "y"
And I type "y"
Then the exit status should be 0
And the following files should exist:
| Gemfile |
| config.rb |
| source/index.html.erb |
Scenario: Create a new project (alias i)
When I run `middleman i MY_PROJECT` interactively
And I type "y"
And I type "y"
And I type "y"
And I type "y"
Then a directory named "MY_PROJECT" should exist
Scenario: Create a new project (alias new)
When I run `middleman new MY_PROJECT` interactively
And I type "y"
And I type "y"
And I type "y"
And I type "y"
Then a directory named "MY_PROJECT" should exist
Scenario: Create a new project (alias n)
When I run `middleman n MY_PROJECT` interactively
And I type "y"
And I type "y"
And I type "y"
And I type "y"
Then a directory named "MY_PROJECT" should exist
Scenario: Create a new project using Middleman directory
When I run `middleman init MY_PROJECT -T blog`
Then a directory named "MY_PROJECT" should exist
When I cd to "MY_PROJECT"
And the file "Gemfile" should contain "middleman-blog"
And the file ".gitignore" should exist
Scenario: Create an invalid project using Middleman directory
When I run `middleman init MY_PROJECT -T does-not-exist-for-reals`
Then the exit status should be 1
Scenario: Create a new project using github(user/repository)
When I run `middleman init MY_PROJECT -T middleman/middleman-templates-default` interactively
And I type "y"
And I type "y"
And I type "y"
And I type "y"
Then a directory named "MY_PROJECT" should exist
Scenario: Create a new project using github(user/repository#branch)
When I run `middleman init MY_PROJECT -T middleman/middleman-templates-default#master` interactively
And I type "y"
And I type "y"
And I type "y"
And I type "y"
Then a directory named "MY_PROJECT" should exist
And the output should contain "-b master"
Scenario: Create a new project using full path(://)
When I run `middleman init MY_PROJECT -T https://github.com/middleman/middleman-templates-default.git` interactively
And I type "y"
And I type "y"
And I type "y"
And I type "y"
Then a directory named "MY_PROJECT" should exist

View File

@ -1,17 +0,0 @@
Feature: Run preview server before hook
Scenario: When run
Given a fixture app "preview-server-hook-app"
And the default aruba timeout is 30 seconds
When I run `middleman server --server-name localhost --bind-address 127.0.0.1` interactively
And I stop middleman if the output contains:
"""
### END ###
"""
Then the output should contain:
"""
/// 127.0.0.1:4567 ///
/// 4567 ///
/// localhost ///
/// http://localhost:4567 ///
"""

View File

@ -1,536 +0,0 @@
Feature: Run the preview server
As a software developer
I want to start the preview server
In order to view my changes immediately in the browser
Background:
Given a fixture app "preview-server-app"
And the default aruba timeout is 30 seconds
Scenario: Start the server with defaults
When I run `middleman server` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
And the output should contain:
"""
View your site at "http://
"""
And the output should contain:
"""
Inspect your site configuration at "http://
"""
Scenario: Start the server with defaults in verbose mode
When I run `middleman server --verbose` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to ":::4567", "0.0.0.0:4567"
"""
And the output should contain:
"""
View your site at "http://
"""
And the output should contain:
"""
Inspect your site configuration at "http://
"""
@wip
Scenario: Start the server with defaults in verbose mode, when a local mdns server resolves the local hostname
Given I start a mdns server for the local hostname
When I run `middleman server --verbose` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to ":::4567", "0.0.0.0:4567"
"""
And the output should contain:
"""
View your site at "http://
"""
And the output should contain:
"""
Inspect your site configuration at "http://
"""
Scenario: Start the server with bind address 127.0.0.1
Given I have a local hosts file with:
"""
# <ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost
"""
When I run `middleman server --verbose --bind-address 127.0.0.1` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "127.0.0.1:4567"
"""
And the output should contain:
"""
View your site at "http://127.0.0.1:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://127.0.0.1:4567/__middleman"
"""
Scenario: Start the server with bind address 127.0.0.1 configured via config.rb
Given I have a local hosts file with:
"""
# <ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost
"""
And a file named "config.rb" with:
"""
set :bind_address, '127.0.0.1'
"""
When I run `middleman server --verbose` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "127.0.0.1:4567"
"""
And the output should contain:
"""
View your site at "http://127.0.0.1:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://127.0.0.1:4567/__middleman"
"""
@wip
Scenario: Start the server with bind address 127.0.0.5
This will have no hostname attached because the hosts file, the DNS server
and the MDNS-server do not know anything about 127.0.0.5
When I run `middleman server --verbose --bind-address 127.0.0.5` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "127.0.0.5:4567"
"""
And the output should contain:
"""
View your site at "http://127.0.0.5:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://127.0.0.5:4567/__middleman"
"""
Scenario: Start the server with bind address ::1
Given a file named ".hosts" with:
"""
# <ip-address> <hostname.domain.org> <hostname>
::1 localhost.localdomain localhost
"""
When I run `middleman server --verbose --bind-address ::1` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "::1:4567"
"""
And the output should contain:
"""
View your site at "http://[::1]:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://[::1]:4567/__middleman"
"""
Scenario: Start the server with bind address 0.0.0.0
When I run `middleman server --verbose --bind-address 0.0.0.0` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "0.0.0.0:4567"
"""
And the output should contain:
"""
View your site at "http://
"""
And the output should contain:
"""
Inspect your site configuration at "http://
"""
Scenario: Start the server with bind address ::
When I run `middleman server --verbose --bind-address ::` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to ":::4567"
"""
And the output should contain:
"""
View your site at "http://
"""
And the output should contain:
"""
Inspect your site configuration at "http://
"""
Scenario: Start the server with server name "localhost"
Given I have a local hosts file with:
"""
# <ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost
"""
When I run `middleman server --verbose --server-name localhost` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "127.0.0.1:4567"
"""
And the output should contain:
"""
View your site at "http://localhost:4567", "http://127.0.0.1:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://localhost:4567/__middleman", "http://127.0.0.1:4567/__middleman"
"""
Scenario: Start the server with server name "localhost" configured via config.rb
Given I have a local hosts file with:
"""
# <ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost
"""
And a file named "config.rb" with:
"""
set :server_name, 'localhost'
"""
When I run `middleman server --verbose` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "127.0.0.1:4567"
"""
And the output should contain:
"""
View your site at "http://localhost:4567", "http://127.0.0.1:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://localhost:4567/__middleman", "http://127.0.0.1:4567/__middleman"
"""
Scenario: Start the server with server name "localhost" and bind address "127.0.0.1"
Given I have a local hosts file with:
"""
# <ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost
"""
When I run `middleman server --verbose --server-name localhost --bind-address 127.0.0.1` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "127.0.0.1:4567"
"""
And the output should contain:
"""
View your site at "http://localhost:4567", "http://127.0.0.1:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://localhost:4567/__middleman", "http://127.0.0.1:4567/__middleman"
"""
Scenario: Start the server with server name "127.0.0.1"
When I run `middleman server --verbose --server-name 127.0.0.1` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "127.0.0.1:4567"
"""
And the output should contain:
"""
View your site at "http://127.0.0.1:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://127.0.0.1:4567/__middleman"
"""
Scenario: Start the server with server name "::1"
When I run `middleman server --verbose --server-name ::1` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "::1:4567"
"""
And the output should contain:
"""
View your site at "http://[::1]:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://[::1]:4567/__middleman"
"""
Scenario: Start the server with https
When I run `middleman server --verbose --https` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to ":::4567", "0.0.0.0:4567"
"""
And the output should contain:
"""
View your site at "https://
"""
And the output should contain:
"""
Inspect your site configuration at "https://
"""
Scenario: Start the server with port 65432
When I run `middleman server --verbose --port 65432` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to ":::65432", "0.0.0.0:65432"
"""
Scenario: Start the server with port 65432 configured via config.rb
Given a file named "config.rb" with:
"""
set :port, 65432
"""
When I run `middleman server --verbose` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to ":::65432", "0.0.0.0:65432"
"""
@wip
Scenario: Start the server when port is blocked by other middleman instance
Given `middleman server` is running in background
When I run `middleman server --verbose` interactively
And I stop all commands if the output of the last command contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman uses a different port
"""
Scenario: Start the server with bind address 1.1.1.1
This should fail, because "1.1.1.1" is not an interface available on this computer.
Given a file named ".hosts" with:
"""
1.1.1.1 www.example.com www
"""
When I run `middleman server --verbose --bind-address 1.1.1.1` interactively
And I stop middleman if the output contains:
"""
Running Middleman failed:
"""
Then the output should contain:
"""
Bind address "1.1.1.1" is not available on your system
"""
Scenario: Start the server with server name www.example.com and bind address 0.0.0.0
This should fail, because the user can just use `--server-name`. It does
not make sense for `middleman` to only listen on `0.0.0.0` (IPv4 all
interfaces), but not on `::` (IPv6 all interfaces). There are other tools
like `iptables` (Linux-only) or better some `kernel`-configurations to make
this possible.
When I run `middleman server --verbose --server-name www.example.com --bind-address 0.0.0.0` interactively
And I stop middleman if the output contains:
"""
Running Middleman failed:
"""
Then the output should contain:
"""
Undefined combination of options "--server-name" and "--bind-address".
"""
Scenario: Start the server with server name "www.example.com" and bind address "127.0.0.1"
This should fail because the server name does not resolve to the ip address.
Given a file named ".hosts" with:
"""
1.1.1.1 www.example.com www
"""
When I run `middleman server --verbose --server-name www.example.com --bind-address 127.0.0.1` interactively
And I stop middleman if the output contains:
"""
Running Middleman failed:
"""
Then the output should contain:
"""
Server name "www.example.com" does not resolve to bind address "127.0.0.1". Please fix that and try again.
"""
Scenario: Start the server with server name "garbage.example.com"
When I run `middleman server --verbose --server-name garbage.example.com` interactively
And I stop middleman if the output contains:
"""
Running Middleman failed:
"""
Then the output should contain:
"""
Server name "garbage.example.com" does not resolve to an ip address. Please fix that and try again.
"""
Scenario: Start the server with server name "www.example.com" and the network name server is used to resolve the server name
Given I have a local hosts file with:
"""
# empty
"""
And I start a mdns server with:
"""
# empty
"""
And I start a dns server with:
"""
www.example.com: 127.0.0.1
"""
When I run `middleman server --verbose --server-name www.example.com` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "127.0.0.1:4567"
"""
And the output should contain:
"""
View your site at "http://www.example.com:4567", "http://127.0.0.1:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://www.example.com:4567/__middleman", "http://127.0.0.1:4567/__middleman"
"""
@ruby-2.1
@wip
Scenario: Start the server with server name "host.local" and the link local name server is used to resolve the server name
To make the mdns resolver resolve a name, it needs to end with ".local".
Otherwise the resolver returns [].
Given I have a local hosts file with:
"""
# empty
"""
And I start a mdns server with:
"""
host.local: 127.0.0.1
"""
When I run `middleman server --verbose --server-name host.local` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "127.0.0.1:4567"
"""
And the output should contain:
"""
View your site at "http://host.local:4567", "http://127.0.0.1:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://host.local:4567/__middleman", "http://127.0.0.1:4567/__middleman"
"""
@ruby-2.1
@wip
Scenario: Start the server with server name "host" and the link local name server is used to resolve the server name
To make the mdns resolver resolve a name, it needs to end with ".local". If
a plain hostname is given `middleman` appends ".local" automatically.
Given I have a local hosts file with:
"""
# empty
"""
And I start a mdns server with:
"""
host.local: 127.0.0.1
"""
When I run `middleman server --verbose --server-name host` interactively
And I stop middleman if the output contains:
"""
Inspect your site configuration
"""
Then the output should contain:
"""
The Middleman preview server is bound to "127.0.0.1:4567"
"""
And the output should contain:
"""
View your site at "http://host.local:4567", "http://127.0.0.1:4567"
"""
And the output should contain:
"""
Inspect your site configuration at "http://host.local:4567/__middleman", "http://127.0.0.1:4567/__middleman"
"""

View File

@ -1,19 +0,0 @@
ENV["TEST"] = "true"
require 'sassc'
require 'simplecov'
SimpleCov.root(File.expand_path(File.dirname(__FILE__) + '/../..'))
require 'phantomjs/poltergeist'
Capybara.javascript_driver = :poltergeist
require 'coveralls'
Coveralls.wear!
require 'codeclimate-test-reporter'
CodeClimate::TestReporter.start
PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__)))
require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-cli')
require File.join(File.dirname(PROJECT_ROOT_PATH), 'middleman-core', 'lib', 'middleman-core', 'step_definitions')

View File

@ -1,33 +0,0 @@
#!/usr/bin/env ruby
require 'rubydns'
require 'psych'
db_file = ARGV[0]
port = ARGV[1] || 5300
db = if File.file? db_file
$stderr.puts 'Found dns db'
Psych.load_file(db_file)
else
$stderr.puts 'Found no dns db. Use default db.'
{
/www\.example\.org/ => '1.1.1.1'
}
end
interfaces = [
[:udp, "127.0.0.1", port],
[:tcp, "127.0.0.1", port]
]
# Start the RubyDNS server
RubyDNS::run_server(listen: interfaces) do
db.each do |matcher, result|
match(matcher, Resolv::DNS::Resource::IN::A) do |transaction|
transaction.respond!(result)
end
end
end

View File

@ -1 +0,0 @@
<h1>Welcome</h1>

View File

@ -1,9 +0,0 @@
<html>
<head>
<title>My Sample Site</title>
<!-- Comment in layout -->
</head>
<body>
<%= yield %>
</body>
</html>

View File

@ -1,5 +0,0 @@
---
layout: false
---
I am real: <%= @num %>

View File

@ -1 +0,0 @@
<h1>Ignore me!</h1>

View File

@ -1 +0,0 @@
<h1>Ignore me! 2</h1>

View File

@ -1 +0,0 @@
<h1>Ignore me! 3</h1>

View File

@ -1 +0,0 @@
Static, no code!

View File

@ -1,19 +0,0 @@
set :layout, false
class MyFeature < Middleman::Extension
def initialize(app, options_hash = {}, &block)
super
app.before_server do |server_information|
puts "/// #{server_information.listeners.first} ///"
puts "/// #{server_information.port} ///"
puts "/// #{server_information.server_name} ///"
puts "/// #{server_information.site_addresses.first} ///"
puts "/// ### END ### ///"
end
end
end
::Middleman::Extensions.register(:my_feature, MyFeature)
activate :my_feature

View File

@ -1,9 +0,0 @@
<html>
<head>
<meta charset="utf-8">
<title>preview-server-hook-app</title>
</head>
<body>
<h1>preview-server-hook-app</h1>
</body>
</html>

View File

@ -1,23 +1,96 @@
# rubocop:disable FileName
# Setup our load paths # Setup our load paths
libdir = File.expand_path(File.dirname(__FILE__)) libdir = File.expand_path(File.dirname(__FILE__))
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir) $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
# Require Thor since that's what the whole CLI is built around # Require Thor since that's what the whole CLI is built around
require 'thor' require 'thor'
require 'thor/group'
# CLI Module # CLI Module
module Middleman::Cli module Middleman
# The base task from which everything else extends
class Base < ::Thor
desc 'version', 'Show version'
def version
say "Middleman #{Middleman::VERSION}"
end
def self.exit_on_failure? module Cli
true
# The base task from which everything else extends
class Base < Thor
class << self
def start(*args)
# Change flag to a module
ARGV.unshift('help') if ARGV.delete('--help')
# Default command is server
if ARGV[0] != 'help' && (ARGV.length < 1 || ARGV.first.include?('-'))
ARGV.unshift('server')
end
super
end
end
desc 'version', 'Show version'
def version
say "Middleman #{Middleman::VERSION}"
end
# Override the Thor help method to find help for subtasks
# @param [Symbol, String, nil] meth
# @param [Boolean] subcommand
# @return [void]
def help(meth = nil, subcommand = false)
if meth && !self.respond_to?(meth)
klass, task = Thor::Util.find_class_and_task_by_namespace("#{meth}:#{meth}")
klass.start(['-h', task].compact, :shell => self.shell)
else
list = []
Thor::Util.thor_classes_in(Middleman::Cli).each do |thor_class|
list += thor_class.printable_tasks(false)
end
list.sort!{ |a,b| a[0] <=> b[0] }
shell.say 'Tasks:'
shell.print_table(list, :ident => 2, :truncate => true)
shell.say %(\nSee 'middleman help <command>' for more information on specific command.)
shell.say
end
end
# Intercept missing methods and search subtasks for them
# @param [Symbol] meth
def method_missing(meth, *args)
meth = meth.to_s
if self.class.map.has_key?(meth)
meth = self.class.map[meth]
end
klass, task = Thor::Util.find_class_and_task_by_namespace("#{meth}:#{meth}")
if klass.nil?
tasks_dir = File.join(Dir.pwd, 'tasks')
if File.exists?(tasks_dir)
Dir[File.join(tasks_dir, '**/*_task.rb')].each { |f| require f }
klass, task = Thor::Util.find_class_and_task_by_namespace("#{meth}:#{meth}")
end
end
if klass.nil?
raise Thor::Error.new "There's no '#{meth}' command for Middleman. Try 'middleman help' for a list of commands."
else
args.unshift(task) if task
klass.start(args, :shell => self.shell)
end
end
end end
end end
end end
# Require the Middleman version
require 'middleman-core/version'
# Include the core CLI items
require 'middleman-cli/init'
require 'middleman-cli/extension'
require 'middleman-cli/server'
require 'middleman-cli/build'
require 'middleman-cli/console'

View File

@ -1,140 +1,301 @@
require 'middleman-core/application' require 'fileutils'
require 'set'
# CLI Module # CLI Module
module Middleman::Cli module Middleman::Cli
# Alias "b" to "build"
Base.map({ 'b' => 'build' })
# The CLI Build class # The CLI Build class
class Build < Thor::Group class Build < Thor
include Thor::Actions include Thor::Actions
attr_reader :debugging
attr_accessor :had_errors
check_unknown_options! check_unknown_options!
class_option :environment, namespace :build
aliases: '-e',
default: ENV['MM_ENV'] || ENV['RACK_ENV'] || :production
class_option :clean,
type: :boolean,
default: true,
desc: 'Remove orphaned files from build (--no-clean to disable)'
class_option :parallel,
type: :boolean,
default: true,
desc: 'Output files in parallel (--no-parallel to disable)'
class_option :glob,
type: :string,
aliases: '-g',
default: nil,
desc: 'Build a subset of the project'
class_option :verbose,
type: :boolean,
default: false,
desc: 'Print debug messages'
class_option :instrument,
type: :boolean,
default: false,
desc: 'Print instrument messages'
class_option :profile,
type: :boolean,
default: false,
desc: 'Generate profiling report for the build'
Middleman::Cli.import_config(self) desc 'build [options]', 'Builds the static site for deployment'
method_option :clean,
:type => :boolean,
:default => true,
:desc => 'Remove orphaned files from build (--no-clean to disable)'
method_option :glob,
:type => :string,
:aliases => '-g',
:default => nil,
:desc => 'Build a subset of the project'
method_option :verbose,
:type => :boolean,
:default => false,
:desc => 'Print debug messages'
method_option :instrument,
:type => :string,
:default => false,
:desc => 'Print instrument messages'
method_option :profile,
:type => :boolean,
:default => false,
:desc => 'Generate profiling report for the build'
# Core build Thor command # Core build Thor command
# @return [void] # @return [void]
def build def build
unless ENV['MM_ROOT'] if !ENV['MM_ROOT']
raise Thor::Error, 'Error: Could not find a Middleman project config, perhaps you are in the wrong folder?' raise Thor::Error, 'Error: Could not find a Middleman project config, perhaps you are in the wrong folder?'
end end
require 'middleman-core' require 'middleman-core'
require 'middleman-core/logger' require 'middleman-core/logger'
require 'middleman-core/builder'
require 'fileutils'
verbose = options['verbose'] ? 0 : 1 require 'rack'
instrument = options['instrument'] require 'rack/mock'
builder = nil require 'find'
cli_options = options
::Middleman::Logger.singleton(verbose, instrument) @debugging = Middleman::Cli::Base.respond_to?(:debugging) && Middleman::Cli::Base.debugging
self.had_errors = false
::Middleman::Util.instrument 'builder.setup' do self.class.shared_instance(options['verbose'], options['instrument'])
@app = ::Middleman::Application.new do
config[:mode] = :build opts = {}
config[:show_exceptions] = false opts[:glob] = options['glob'] if options.has_key?('glob')
config[:cli_options] = cli_options.each_with_object({}) do |(k, v), sum| opts[:clean] = options['clean']
sum[k] = v
end self.class.shared_instance.run_hook :before_build, self
action BuildAction.new(self, opts)
self.class.shared_instance.run_hook :after_build, self
self.class.shared_instance.config_context.execute_after_build_callbacks(self)
if self.had_errors && !self.debugging
msg = 'There were errors during this build'
unless options['verbose']
msg << ', re-run with `middleman build --verbose` to see the full exception.'
end end
self.shell.say msg, :red
builder = Middleman::Builder.new(@app,
glob: options['glob'],
clean: options['clean'],
parallel: options['parallel'])
builder.thor = self
builder.on_build_event(&method(:on_event))
end end
::Middleman::Util.instrument 'builder.run' do exit(1) if self.had_errors
if builder.run! end
clean_directories! if options['clean']
shell.say 'Project built successfully.'
else
msg = 'There were errors during this build'
unless options['verbose']
msg << ', re-run with `middleman build --verbose` to see the full exception.'
end
shell.say msg, :red
exit(1) # Static methods
class << self
def exit_on_failure?
true
end
# Middleman::Application singleton
#
# @return [Middleman::Application]
def shared_instance(verbose=false, instrument=false)
@_shared_instance ||= ::Middleman::Application.server.inst do
config[:environment] = :build
::Middleman::Logger.singleton(verbose ? 0 : 1, instrument)
end end
end end
end end
end
protected # A Thor Action, modular code, which does the majority of the work.
class BuildAction < ::Thor::Actions::EmptyDirectory
attr_reader :source
attr_reader :logger
# Handles incoming events from the builder. # Setup the action
# @param [Symbol] event_type The type of event. #
# @param [String] contents The event contents. # @param [Middleman::Cli::Build] base
# @param [String] extra The extra information. # @param [Hash] config
def initialize(base, config={})
@app = base.class.shared_instance
@source_dir = Pathname(@app.source_dir)
@build_dir = Pathname(@app.config[:build_dir])
@to_clean = Set.new
@logger = @app.logger
@rack = ::Rack::MockRequest.new(@app.class.to_rack_app)
super(base, @build_dir, config)
end
# Execute the action
# @return [void] # @return [void]
def on_event(event_type, target, extra=nil) def invoke!
case event_type queue_current_paths if should_clean?
when :error execute!
say_status :error, target, :red clean! if should_clean?
shell.say extra, :red if options['verbose'] end
when :deleted
say_status :remove, target, :green protected
when :created
say_status :create, target, :green # Remove files which were not built in this cycle
when :identical # @return [void]
say_status :identical, target, :blue def clean!
when :updated @to_clean.each do |f|
say_status :updated, target, :yellow base.remove_file f, :force => true
else end
say_status event_type, extra, :blue
Dir[@build_dir.join('**', '*')].select {|d| File.directory?(d) }.each do |d|
base.remove_file d, :force => true if directory_empty? d
end end
end end
# Find empty directories in the build folder and remove them. # Whether we should clean the build
# @return [Boolean] # @return [Boolean]
def clean_directories! def should_clean?
all_build_files = File.join(@app.config[:build_dir], '**', '*') @config[:clean]
end
empty_directories = Dir[all_build_files].select do |d| # Whether the given directory is empty
File.directory?(d) # @param [String, Pathname] directory
# @return [Boolean]
def directory_empty?(directory)
Pathname(directory).children.empty?
end
# Get a list of all the file paths in the destination folder and save them
# for comparison against the files we build in this cycle
# @return [void]
def queue_current_paths
return unless File.exist?(@build_dir)
paths = ::Middleman::Util.all_files_under(@build_dir).map(&:realpath).select(&:file?)
@to_clean += paths.select do |path|
path.to_s !~ /\/\./ || path.to_s =~ /\.(htaccess|htpasswd)/
end end
empty_directories.each do |d| if RUBY_PLATFORM =~ /darwin/
remove_file d, force: true if Pathname(d).children.empty? # handle UTF-8-MAC filename on MacOS
@to_clean = @to_clean.map { |path| path.to_s.encode('UTF-8', 'UTF-8-MAC') }
end end
end end
# Add to CLI # Actually build the app
Base.register(self, 'build', 'build [options]', 'Builds the static site for deployment') # @return [void]
def execute!
# Sort order, images, fonts, js/css and finally everything else.
sort_order = %w(.png .jpeg .jpg .gif .bmp .svg .svgz .ico .woff .otf .ttf .eot .js .css)
# Map "b" to "build" # Pre-request CSS to give Compass a chance to build sprites
Base.map('b' => 'build') logger.debug '== Prerendering CSS'
@app.sitemap.resources.select do |resource|
resource.ext == '.css'
end.each(&method(:build_resource))
logger.debug '== Checking for Compass sprites'
# Double-check for compass sprites
@app.files.find_new_files((@source_dir + @app.config[:images_dir]).relative_path_from(@app.root_path))
@app.sitemap.ensure_resource_list_updated!
# Sort paths to be built by the above order. This is primarily so Compass can
# find files in the build folder when it needs to generate sprites for the
# css files
logger.debug '== Building files'
resources = @app.sitemap.resources.sort_by do |r|
sort_order.index(r.ext) || 100
end
if @build_dir.expand_path.relative_path_from(@source_dir).to_s =~ /\A[.\/]+\Z/
raise ":build_dir (#{@build_dir}) cannot be a parent of :source_dir (#{@source_dir})"
end
# Loop over all the paths and build them.
resources.reject do |resource|
resource.ext == '.css'
end.each(&method(:build_resource))
::Middleman::Profiling.report('build')
end
def build_resource(resource)
return if @config[:glob] && !File.fnmatch(@config[:glob], resource.destination_path)
output_path = render_to_file(resource)
if should_clean? && output_path.exist?
if RUBY_PLATFORM =~ /darwin/
# handle UTF-8-MAC filename on MacOS
@to_clean.delete(output_path.realpath.to_s.encode('UTF-8', 'UTF-8-MAC'))
else
@to_clean.delete(output_path.realpath)
end
end
end
# Render a resource to a file.
#
# @param [Middleman::Sitemap::Resource] resource
# @return [Pathname] The full path of the file that was written
def render_to_file(resource)
output_file = @build_dir + resource.destination_path.gsub('%20', ' ')
if resource.binary?
if !output_file.exist?
base.say_status :create, output_file, :green
elsif FileUtils.compare_file(resource.source_file, output_file)
base.say_status :identical, output_file, :blue
return output_file
else
base.say_status :update, output_file, :yellow
end
output_file.dirname.mkpath
FileUtils.cp(resource.source_file, output_file)
else
begin
response = @rack.get(URI.escape(resource.request_path))
if response.status == 200
base.create_file(output_file, binary_encode(response.body))
else
handle_error(output_file, response.body)
end
rescue => e
handle_error(output_file, "#{e}\n#{e.backtrace.join("\n")}", e)
end
end
output_file
end
def handle_error(file_name, response, e=Thor::Error.new(response))
base.had_errors = true
base.say_status :error, file_name, :red
if base.debugging
raise e
exit(1)
elsif base.options['verbose']
base.shell.say response, :red
end
end
def binary_encode(string)
if string.respond_to?(:force_encoding)
string.force_encoding('ascii-8bit')
end
string
end
end
end
# Quiet down create file
class ::Thor::Actions::CreateFile
def on_conflict_behavior(&block)
if identical?
say_status :identical, :blue
else
say_status :update, :yellow
block.call unless pretend?
end
end end
end end

View File

@ -1,41 +0,0 @@
# CLI Module
module Middleman::Cli
# The CLI Config class
class Config < Thor::Group
include Thor::Actions
check_unknown_options!
class_option :environment,
aliases: '-e',
default: ENV['MM_ENV'] || ENV['RACK_ENV'] || 'development',
desc: 'The environment Middleman will run under'
def console
require 'json'
require 'middleman-core'
require 'middleman-core/logger'
opts = {
environment: options['environment']
}
# Don't output info messages
::Middleman::Logger.singleton(2, false)
app = ::Middleman::Application.new do
config[:mode] = :config
config[:disable_sitemap] = true
config[:watcher_disable] = true
config[:exit_before_ready] = true
config[:environment] = opts[:environment].to_sym if opts[:environment]
end
puts JSON.pretty_generate(app.config.to_h)
app.shutdown!
end
# Add to CLI
Base.register(self, 'config', 'config [options]', 'Output a Middleman configuration in JSON format')
end
end

View File

@ -1,51 +1,48 @@
# CLI Module # CLI Module
module Middleman::Cli module Middleman::Cli
# Alias "c" to "console"
Base.map({ 'c' => 'console' })
# The CLI Console class # The CLI Console class
class Console < Thor::Group class Console < Thor
include Thor::Actions include Thor::Actions
check_unknown_options! check_unknown_options!
class_option :environment, namespace :console
aliases: '-e',
default: ENV['MM_ENV'] || ENV['RACK_ENV'] || 'development', desc 'console [options]', 'Start an interactive console in the context of your Middleman application'
desc: 'The environment Middleman will run under' method_option :environment,
class_option :verbose, :aliases => '-e',
type: :boolean, :default => ENV['MM_ENV'] || ENV['RACK_ENV'] || 'development',
default: false, :desc => 'The environment Middleman will run under'
desc: 'Print debug messages' method_option :verbose,
:type => :boolean,
:default => false,
:desc => 'Print debug messages'
def console def console
require 'middleman-core' require 'middleman-core'
require 'irb' require 'irb'
opts = { opts = {
environment: options['environment'], :environment => options['environment'],
debug: options['verbose'] :debug => options['verbose']
} }
@app = ::Middleman::Application.new do @app =::Middleman::Application.server.inst do
config[:environment] = opts[:environment].to_sym if opts[:environment] if opts[:environment]
config[:environment] = opts[:environment].to_sym
end
::Middleman::Logger.singleton(opts[:debug] ? 0 : 1, opts[:instrumenting] || false) ::Middleman::Logger.singleton(opts[:debug] ? 0 : 1, opts[:instrumenting] || false)
end end
self.class.interact_with @app # TODO: get file watcher / reload! working in console
end
# Start an interactive console in the context of the provided object.
# @param [Object] context
# @return [void]
def self.interact_with(context)
IRB.setup nil IRB.setup nil
IRB.conf[:MAIN_CONTEXT] = IRB::Irb.new.context IRB.conf[:MAIN_CONTEXT] = IRB::Irb.new.context
require 'irb/ext/multi-irb' require 'irb/ext/multi-irb'
IRB.irb nil, context IRB.irb nil, @app
end end
# Add to CLI
Base.register(self, 'console', 'console [options]', 'Start an interactive console in the context of your Middleman application')
# Map "c" to "console"
Base.map('c' => 'console')
end end
end end

View File

@ -1,13 +1,16 @@
# CLI Module # CLI Module
module Middleman::Cli module Middleman::Cli
# A thor task for creating new projects # A thor task for creating new projects
class Extension < Thor::Group class Extension < Thor
include Thor::Actions include Thor::Actions
check_unknown_options! check_unknown_options!
namespace :extension
# Required path for the new project to be generated # Required path for the new project to be generated
argument :name, type: :string argument :name, :type => :string
# Template files are relative to this file # Template files are relative to this file
# @return [String] # @return [String]
@ -15,13 +18,11 @@ module Middleman::Cli
File.join(File.dirname(__FILE__), 'templates') File.join(File.dirname(__FILE__), 'templates')
end end
class_option 'skip-git', desc 'extension [options]', 'Create Middleman extension scaffold NAME'
type: :boolean, method_option 'skip-git',
default: false, :type => :boolean,
desc: 'Skip Git ignores and keeps' :default => false,
:desc => 'Skip Git ignores and keeps'
# Output a .gitignore file
class_option :git, type: :boolean, default: true
# The extension task # The extension task
# @param [String] name # @param [String] name
@ -30,13 +31,14 @@ module Middleman::Cli
template 'extension/Rakefile', File.join(name, 'Rakefile') template 'extension/Rakefile', File.join(name, 'Rakefile')
template 'extension/gemspec', File.join(name, "#{name}.gemspec") template 'extension/gemspec', File.join(name, "#{name}.gemspec")
template 'extension/Gemfile', File.join(name, 'Gemfile') template 'extension/Gemfile', File.join(name, 'Gemfile')
template 'extension/lib/middleman_extension.rb', File.join(name, 'lib', 'middleman_extension.rb')
template 'extension/lib/lib.rb', File.join(name, 'lib', "#{name}.rb") template 'extension/lib/lib.rb', File.join(name, 'lib', "#{name}.rb")
template 'extension/lib/lib/extension.rb', File.join(name, 'lib', name, 'extension.rb')
template 'extension/features/support/env.rb', File.join(name, 'features', 'support', 'env.rb') template 'extension/features/support/env.rb', File.join(name, 'features', 'support', 'env.rb')
empty_directory File.join(name, 'fixtures') empty_directory File.join(name, 'fixtures')
end end
# Add to CLI # Output a .gitignore file
Base.register(self, 'extension', 'extension [options]', 'Create a new Middleman extension') class_option :git, :type => :boolean, :default => true
end end
end end

View File

@ -1,129 +1,63 @@
require 'middleman-templates'
# CLI Module # CLI Module
module Middleman::Cli module Middleman::Cli
# A thor task for creating new projects # A thor task for creating new projects
class Init < Thor::Group class Init < Thor
include Thor::Actions
GIT_CMD = 'git'.freeze
check_unknown_options! check_unknown_options!
argument :target, type: :string, default: '.' namespace :init
class_option 'template',
aliases: '-T',
default: 'middleman/middleman-templates-default',
desc: 'Use a project template'
# Do not run bundle install
class_option 'skip-bundle',
type: :boolean,
aliases: '-B',
default: false,
desc: 'Skip bundle install'
desc 'init NAME [options]', 'Create new project NAME'
available_templates = ::Middleman::Templates.registered.keys.join(', ')
method_option 'template',
:aliases => '-T',
:default => 'default',
:desc => "Use a project template: #{available_templates}"
method_option 'css_dir',
# :default => "stylesheets",
:desc => 'The path to the css files'
method_option 'js_dir',
# :default => "javascripts",
:desc => 'The path to the javascript files'
method_option 'images_dir',
# :default => "images",
:desc => 'The path to the image files'
method_option 'rack',
:type => :boolean,
:default => false,
:desc => 'Include a config.ru file'
method_option 'skip-bundle',
:type => :boolean,
:aliases => '-B',
:default => false,
:desc => "Don't run bundle install"
method_option 'skip-git',
:type => :boolean,
:default => false,
:desc => 'Skip Git ignores and keeps'
# The init task # The init task
def init # @param [String] name
require 'fileutils' def init(name = '.')
require 'tmpdir' key = options[:template].to_sym
unless ::Middleman::Templates.registered.has_key?(key)
unless git_present? raise Thor::Error.new "Unknown project template '#{key}'"
msg = 'You need to install the git command line tool to initialize a new project. '
msg << "For help installing git, please refer to GitHub's tutorial at https://help.github.com/articles/set-up-git"
say msg, :red
exit 1
end end
repo_path, repo_branch = if shortname?(options[:template]) thor_group = ::Middleman::Templates.registered[key]
require 'open-uri' thor_group.new([name], options).invoke_all
require 'json'
api = 'https://directory.middlemanapp.com/api'
uri = ::URI.parse("#{api}/#{options[:template]}.json")
begin
data = ::JSON.parse(uri.read)
data['links']['github']
data['links']['github'].split('#')
rescue ::OpenURI::HTTPError
say "Template `#{options[:template]}` not found in Middleman Directory."
say 'Did you mean to use a full `user/repo` path?'
exit 1
end
else
repo_name, repo_branch = options[:template].split('#')
[repository_path(repo_name), repo_branch]
end
dir = Dir.mktmpdir
begin
branch_cmd = repo_branch ? "-b #{repo_branch} " : ''
git_path = "#{branch_cmd}#{repo_path}"
run("#{GIT_CMD} clone --depth 1 #{branch_cmd}#{repo_path} #{dir}")
unless $?.success?
say "Git clone command failed. Make sure git repository exists: #{git_path}", :red
exit 1
end
inside(target) do
thorfile = File.join(dir, 'Thorfile')
if File.exist?(thorfile)
::Thor::Util.load_thorfile(thorfile)
invoke 'middleman:generator'
else
source_paths << dir
directory dir, '.', exclude_pattern: /\.git\/|\.gitignore$/
end
run('bundle install') unless ENV['TEST'] || options[:'skip-bundle']
end
ensure
FileUtils.remove_entry(dir) if File.directory?(dir)
end
end end
protected
# Copied from Bundler
def git_present?
return @git_present if defined?(@git_present)
@git_present = which(GIT_CMD) || which('git.exe')
end
# Copied from Bundler
def which(executable)
if File.file?(executable) && File.executable?(executable)
executable
elsif ENV['PATH']
path = ENV['PATH'].split(File::PATH_SEPARATOR).find do |p|
abs_path = File.join(p, executable)
File.file?(abs_path) && File.executable?(abs_path)
end
path && File.expand_path(executable, path)
end
end
def shortname?(repo)
repo.split('/').length == 1
end
def repository_path(repo)
repo.include?('://') || repo.include?('git@') ? repo : "https://github.com/#{repo}.git"
end
# Add to CLI
Base.register(self, 'init', 'init TARGET [options]', 'Create new project at TARGET')
# Map "i", "new" and "n" to "init"
Base.map(
'i' => 'init',
'new' => 'init',
'n' => 'init'
)
end end
def self.exit_on_failure?
true
end
# Map "i", "new" and "n" to "init"
Base.map({
'i' => 'init',
'new' => 'init',
'n' => 'init'
})
end end

View File

@ -1,62 +1,87 @@
# CLI Module # CLI Module
module Middleman::Cli module Middleman::Cli
# Server thor task # Server thor task
class Server < Thor::Group class Server < Thor
check_unknown_options! check_unknown_options!
class_option :environment, namespace :server
aliases: '-e'
class_option :port,
aliases: '-p'
class_option :server_name,
aliases: '-s'
class_option :bind_address,
aliases: '-b'
class_option :verbose,
type: :boolean,
default: false,
desc: 'Print debug messages'
class_option :instrument,
type: :boolean,
default: false,
desc: 'Print instrument messages'
class_option :profile,
type: :boolean,
default: false,
desc: 'Generate profiling report for server startup'
class_option :daemon,
type: :boolean,
aliases: '-d',
default: false,
desc: 'Daemonize preview server'
Middleman::Cli.import_config(self) desc 'server [options]', 'Start the preview server'
method_option :environment,
:aliases => '-e',
:default => ENV['MM_ENV'] || ENV['RACK_ENV'] || 'development',
:desc => 'The environment Middleman will run under'
method_option :host,
:type => :string,
:aliases => '-h',
:default => '0.0.0.0',
:desc => 'Bind to HOST address'
method_option :port,
:aliases => '-p',
:default => '4567',
:desc => 'The port Middleman will listen on'
method_option :verbose,
:type => :boolean,
:default => false,
:desc => 'Print debug messages'
method_option :instrument,
:type => :string,
:default => false,
:desc => 'Print instrument messages'
method_option :disable_watcher,
:type => :boolean,
:default => false,
:desc => 'Disable the file change and delete watcher process'
method_option :profile,
:type => :boolean,
:default => false,
:desc => 'Generate profiling report for server startup'
method_option :reload_paths,
:type => :string,
:default => false,
:desc => 'Additional paths to auto-reload when files change'
method_option :force_polling,
:type => :boolean,
:default => false,
:desc => 'Force file watcher into polling mode'
method_option :latency,
:type => :numeric,
:aliases => '-l',
:default => 0.25,
:desc => 'Set file watcher latency, in seconds'
# Start the server # Start the server
def server def server
require 'middleman-core' require 'middleman-core'
require 'middleman-core/preview_server' require 'middleman-core/preview_server'
unless ENV['MM_ROOT'] if !ENV['MM_ROOT']
puts '== Could not find a Middleman project config.rb' puts '== Could not find a Middleman project config.rb'
exit exit
end end
params = { params = {
debug: options['verbose'], :port => options['port'],
instrumenting: options['instrument'], :host => options['host'],
reload_paths: options['reload_paths'], :environment => options['environment'],
daemon: options['daemon'] :debug => options['verbose'],
:instrumenting => options['instrument'],
:disable_watcher => options['disable_watcher'],
:reload_paths => options['reload_paths'],
:force_polling => options['force_polling'],
:latency => options['latency']
} }
puts '== The Middleman is loading' puts '== The Middleman is loading'
::Middleman::PreviewServer.start(params, options) ::Middleman::PreviewServer.start(params)
end end
# Add to CLI
Base.register(self, 'server', 'server [options]', 'Start the preview server')
# Map "s" to "server"
Base.map('s' => 'server')
end end
def self.exit_on_failure?
true
end
# Map "s" to "server"
Base.map({ 's' => 'server' })
end end

View File

@ -1,6 +1,6 @@
# If you do not have OpenSSL installed, update # If you have OpenSSL installed, we recommend updating
# the following line to use "http://" instead # the following line to use "https"
source 'https://rubygems.org' source 'http://rubygems.org'
# Specify your gem's dependencies in <%= name %>.gemspec # Specify your gem's dependencies in <%= name %>.gemspec
gemspec gemspec
@ -13,6 +13,7 @@ end
group :test do group :test do
gem 'cucumber' gem 'cucumber'
gem 'fivemat'
gem 'aruba' gem 'aruba'
gem 'rspec' gem 'rspec'
end end

View File

@ -4,11 +4,11 @@ Bundler::GemHelper.install_tasks
require 'cucumber/rake/task' require 'cucumber/rake/task'
Cucumber::Rake::Task.new(:cucumber, 'Run features that should pass') do |t| Cucumber::Rake::Task.new(:cucumber, 'Run features that should pass') do |t|
t.cucumber_opts = '--color --tags ~@wip --strict' t.cucumber_opts = "--color --tags ~@wip --strict --format #{ENV['CUCUMBER_FORMAT'] || 'Fivemat'}"
end end
require 'rake/clean' require 'rake/clean'
task test: ['cucumber'] task :test => ['cucumber']
task default: :test task :default => :test

View File

@ -1,6 +1,39 @@
require "middleman-core" # Require core library
require 'middleman-core'
# Extension namespace
class MyExtension < ::Middleman::Extension
option :my_option, 'default', 'An example option'
def initialize(app, options_hash={}, &block)
# Call super to build options from the options_hash
super
# Require libraries only when activated
# require 'necessary/library'
# set up your extension
# puts options.my_option
end
def after_configuration
# Do something
end
# A Sitemap Manipulator
# def manipulate_resource_list(resources)
# end
# module do
# def a_helper
# end
# end
Middleman::Extensions.register :<%= name %> do
require "my-extension/extension"
MyExtension
end end
# Register extensions which can be activated
# Make sure we have the version of Middleman we expect
# Name param may be omited, it will default to underscored
# version of class name
# MyExtension.register(:my_extension)

View File

@ -1,31 +0,0 @@
# Require core library
require 'middleman-core'
# Extension namespace
class MyExtension < ::Middleman::Extension
option :my_option, 'default', 'An example option'
def initialize(app, options_hash={}, &block)
# Call super to build options from the options_hash
super
# Require libraries only when activated
# require 'necessary/library'
# set up your extension
# puts options.my_option
end
def after_configuration
# Do something
end
# A Sitemap Manipulator
# def manipulate_resource_list(resources)
# end
# helpers do
# def a_helper
# end
# end
end

View File

@ -0,0 +1 @@
require '<%= name %>'

View File

@ -1,2 +0,0 @@
# Backwards compat
require 'middleman-cli'

View File

@ -17,7 +17,7 @@ Gem::Specification.new do |s|
s.test_files = `git ls-files -z -- {fixtures,features}/*`.split("\0") s.test_files = `git ls-files -z -- {fixtures,features}/*`.split("\0")
s.executable = 'middleman' s.executable = 'middleman'
s.require_path = 'lib' s.require_path = 'lib'
s.required_ruby_version = '>= 2.2.0' s.required_ruby_version = '>= 1.9.3'
# CLI # CLI
s.add_dependency('thor', ['>= 0.17.0', '< 2.0']) s.add_dependency('thor', ['>= 0.17.0', '< 2.0'])

View File

@ -1 +0,0 @@
--color

View File

@ -2,5 +2,4 @@ lib/**/*.rb
--exclude lib/vendored-middleman-deps/ --exclude lib/vendored-middleman-deps/
--exclude lib/middleman-core/step_definitions --exclude lib/middleman-core/step_definitions
--no-private --no-private
--hide-void-return --hide-void-return
--markup=markdown

View File

@ -1,4 +1,5 @@
# coding:utf-8 # coding:utf-8
RAKE_ROOT = __FILE__.freeze RAKE_ROOT = __FILE__
GEM_NAME = ENV['NAME'] || 'middleman-core' GEM_NAME = ENV['NAME'] || 'middleman-core'
require 'rubygems'
require File.expand_path(File.dirname(__FILE__) + '/../gem_rake_helper') require File.expand_path(File.dirname(__FILE__) + '/../gem_rake_helper')

View File

@ -1,2 +0,0 @@
default: --require features --tags ~@wip
wip: --require features --tags @wip

View File

@ -0,0 +1,15 @@
Feature: Allow config.rb and extensions to add CLI commands
Scenario: Command autoloaded from tasks/ directory
Given an empty app
And a file named "tasks/hello_task.rb" with:
"""
class Hello < Thor
desc "hello", "Say hello"
def hello
puts "Hello World"
end
end
"""
When I run `middleman hello`
Then the output should contain "Hello World"

View File

@ -1,5 +1,5 @@
Feature: Assets get file hashes appended to them and references to them are updated Feature: Assets get a file hash appended to their and references to them are updated
Scenario: Hashed-asset files are produced, and HTML, CSS, JSON and JavaScript gets rewritten to reference the new files Scenario: Hashed-asset files are produced, and HTML, CSS, and JavaScript gets rewritten to reference the new files
Given a successfully built app at "asset-hash-app" Given a successfully built app at "asset-hash-app"
When I cd to "build" When I cd to "build"
Then the following files should exist: Then the following files should exist:
@ -8,16 +8,12 @@ Feature: Assets get file hashes appended to them and references to them are upda
| favicon.ico | | favicon.ico |
| images/100px-1242c368.png | | images/100px-1242c368.png |
| images/100px-5fd6fb90.jpg | | images/100px-5fd6fb90.jpg |
| images/200px-c11eb203.jpg |
| images/300px-59adce76.jpg |
| images/100px-5fd6fb90.gif | | images/100px-5fd6fb90.gif |
| javascripts/application-1d8d5276.js | | javascripts/application-1d8d5276.js |
| stylesheets/site-8bc55985.css | | stylesheets/site-50eaa978.css |
| index.html | | index.html |
| subdir/index.html | | subdir/index.html |
| other/index.html | | other/index.html |
| api.json |
| subdir/api.json |
And the following files should not exist: And the following files should not exist:
| images/100px.png | | images/100px.png |
| images/100px.jpg | | images/100px.jpg |
@ -26,150 +22,106 @@ Feature: Assets get file hashes appended to them and references to them are upda
| stylesheets/site.css | | stylesheets/site.css |
And the file "javascripts/application-1d8d5276.js" should contain "img.src = '/images/100px-5fd6fb90.jpg'" And the file "javascripts/application-1d8d5276.js" should contain "img.src = '/images/100px-5fd6fb90.jpg'"
And the file "stylesheets/site-8bc55985.css" should contain: And the file "stylesheets/site-50eaa978.css" should contain "background-image: url('../images/100px-5fd6fb90.jpg')"
"""
background-image: url("../images/100px-5fd6fb90.jpg")
"""
And the file "index.html" should contain 'href="apple-touch-icon.png"' And the file "index.html" should contain 'href="apple-touch-icon.png"'
And the file "index.html" should contain 'href="stylesheets/site-8bc55985.css"' And the file "index.html" should contain 'href="stylesheets/site-50eaa978.css"'
And the file "index.html" should contain 'src="javascripts/application-1d8d5276.js"' And the file "index.html" should contain 'src="javascripts/application-1d8d5276.js"'
And the file "index.html" should contain 'src="images/100px-5fd6fb90.jpg"' And the file "index.html" should contain 'src="images/100px-5fd6fb90.jpg"'
And the file "subdir/index.html" should contain 'href="../stylesheets/site-8bc55985.css"' And the file "subdir/index.html" should contain 'href="../stylesheets/site-50eaa978.css"'
And the file "index.html" should contain 'srcset="images/100px-5fd6fb90.jpg 1x, images/200px-c11eb203.jpg 2x, images/300px-59adce76.jpg 3x"'
And the file "index.html" should contain 'src="images/100px-5fd6fb90.gif"'
And the file "index.html" should contain 'src="images/100px-1242c368.png"'
And the file "subdir/index.html" should contain 'src="../javascripts/application-1d8d5276.js"' And the file "subdir/index.html" should contain 'src="../javascripts/application-1d8d5276.js"'
And the file "subdir/index.html" should contain 'src="../images/100px-5fd6fb90.jpg"' And the file "subdir/index.html" should contain 'src="../images/100px-5fd6fb90.jpg"'
And the file "other/index.html" should contain 'href="../stylesheets/site-8bc55985.css"' And the file "other/index.html" should contain 'href="../stylesheets/site-50eaa978.css"'
And the file "other/index.html" should contain 'src="../javascripts/application-1d8d5276.js"' And the file "other/index.html" should contain 'src="../javascripts/application-1d8d5276.js"'
And the file "other/index.html" should contain 'src="../images/100px-5fd6fb90.jpg"' And the file "other/index.html" should contain 'src="../images/100px-5fd6fb90.jpg"'
And the file "api.json" should contain 'images/100px-5fd6fb90.gif'
And the file "api.json" should contain 'images/100px-5fd6fb90.jpg'
And the file "api.json" should contain 'images/100px-1242c368.png'
And the file "subdir/api.json" should contain 'images/100px-5fd6fb90.gif'
And the file "subdir/api.json" should contain 'images/100px-5fd6fb90.jpg'
And the file "subdir/api.json" should contain 'images/100px-1242c368.png'
Scenario: Hashed fonts assets work with woff and woff2 extension Scenario: Keep Originals
Given a successfully built app at "asset-hash-app" Given a fixture app "asset-hash-app"
And a file named "config.rb" with:
"""
activate :asset_hash, :keep_original => true
"""
And a successfully built app at "asset-hash-app"
When I cd to "build" When I cd to "build"
Then the following files should exist: Then the following files should exist:
| fonts/fontawesome-webfont-56ce13e7.woff | | images/100px-1242c368.png |
| fonts/fontawesome-webfont-10752316.woff2 | | images/100px-5fd6fb90.jpg |
And the file "stylesheets/uses_fonts-88aa3e2b.css" should contain "src: url('../fonts/fontawesome-webfont-10752316.woff2')" | images/100px-5fd6fb90.gif |
And the file "stylesheets/uses_fonts-88aa3e2b.css" should contain "url('../fonts/fontawesome-webfont-56ce13e7.woff')" | javascripts/application-1d8d5276.js |
| stylesheets/site-171eb3c0.css |
| images/100px.png |
| images/100px.jpg |
| images/100px.gif |
| javascripts/application.js |
| stylesheets/site.css |
Scenario: Custom format
Given a fixture app "asset-hash-app"
And a file named "config.rb" with:
"""
activate :asset_hash, :format => ':basename-.-:digest.:ext'
activate :directory_indexes
"""
And a successfully built app at "asset-hash-app"
When I cd to "build"
Then the following files should exist:
| images/100px-.-1242c368.png |
| images/100px-.-5fd6fb90.jpg |
| images/100px-.-5fd6fb90.gif |
| javascripts/application-.-1d8d5276.js |
| stylesheets/site-.-171eb3c0.css |
And the following files should not exist:
| images/100px.png |
| images/100px.jpg |
| images/100px.gif |
| javascripts/application.js |
| stylesheets/site.css |
And the file "javascripts/application-.-1d8d5276.js" should contain "img.src = '/images/100px-.-5fd6fb90.jpg'"
And the file "stylesheets/site-.-171eb3c0.css" should contain "background-image: url('/images/100px-.-5fd6fb90.jpg')"
And the file "index.html" should contain 'href="/stylesheets/site-.-171eb3c0.css"'
And the file "index.html" should contain 'src="/javascripts/application-.-1d8d5276.js"'
And the file "index.html" should contain 'src="/images/100px-.-5fd6fb90.jpg"'
And the file "subdir/index.html" should contain 'href="/stylesheets/site-.-171eb3c0.css"'
And the file "subdir/index.html" should contain 'src="/javascripts/application-.-1d8d5276.js"'
And the file "subdir/index.html" should contain 'src="/images/100px-.-5fd6fb90.jpg"'
And the file "other/index.html" should contain 'href="/stylesheets/site-.-171eb3c0.css"'
And the file "other/index.html" should contain 'src="/javascripts/application-.-1d8d5276.js"'
And the file "other/index.html" should contain 'src="/images/100px-.-5fd6fb90.jpg"'
Scenario: Hashed assets work in preview server Scenario: Hashed assets work in preview server
Given the Server is running at "asset-hash-app" Given the Server is running at "asset-hash-app"
When I go to "/" When I go to "/"
Then I should see 'href="apple-touch-icon.png"' Then I should see 'href="apple-touch-icon.png"'
And I should see 'href="stylesheets/site-d1a750ca.css"' And I should see 'href="stylesheets/site-50eaa978.css"'
And I should see 'href="stylesheets/fragment-99b76247.css"'
And I should see 'src="javascripts/application-1d8d5276.js"' And I should see 'src="javascripts/application-1d8d5276.js"'
And I should see 'src="images/100px-5fd6fb90.jpg"' And I should see 'src="images/100px-5fd6fb90.jpg"'
And I should see 'srcset="images/100px-5fd6fb90.jpg 1x, images/200px-c11eb203.jpg 2x, images/300px-59adce76.jpg 3x"'
And I should see 'src="images/100px-5fd6fb90.jpg?test"'
And I should see 'src="images/100px-5fd6fb90.jpg?#test"'
And I should see 'src="images/100px-5fd6fb90.jpg#test"'
When I go to "/subdir/" When I go to "/subdir/"
Then I should see 'href="../stylesheets/site-d1a750ca.css"' Then I should see 'href="../stylesheets/site-50eaa978.css"'
And I should see 'src="../javascripts/application-1d8d5276.js"' And I should see 'src="../javascripts/application-1d8d5276.js"'
And I should see 'src="../images/100px-5fd6fb90.jpg"' And I should see 'src="../images/100px-5fd6fb90.jpg"'
When I go to "/other/" When I go to "/other/"
Then I should see 'href="../stylesheets/site-d1a750ca.css"' Then I should see 'href="../stylesheets/site-50eaa978.css"'
And I should see 'src="../javascripts/application-1d8d5276.js"' And I should see 'src="../javascripts/application-1d8d5276.js"'
And I should see 'src="../images/100px-5fd6fb90.jpg"' And I should see 'src="../images/100px-5fd6fb90.jpg"'
And I should see 'src="../images/100px-5fd6fb90.jpg?test"'
And I should see 'src="../images/100px-5fd6fb90.jpg?#test"'
And I should see 'src="../images/100px-5fd6fb90.jpg#test"'
When I go to "/javascripts/application-1d8d5276.js" When I go to "/javascripts/application-1d8d5276.js"
Then I should see "img.src = '/images/100px-5fd6fb90.jpg'" Then I should see "img.src = '/images/100px-5fd6fb90.jpg'"
When I go to "/stylesheets/site-d1a750ca.css" When I go to "/stylesheets/site-50eaa978.css"
Then I should see 'background-image: url("../images/100px-5fd6fb90.jpg");' Then I should see "background-image: url('../images/100px-5fd6fb90.jpg')"
When I go to "/api.json"
Then I should see 'images/100px-5fd6fb90.gif'
And I should see 'images/100px-5fd6fb90.jpg'
And I should see 'images/100px-1242c368.png'
When I go to "/subdir/api.json"
Then I should see 'images/100px-5fd6fb90.gif'
And I should see 'images/100px-5fd6fb90.jpg'
And I should see 'images/100px-1242c368.png'
When I go to "/stylesheets/fragment-99b76247.css"
And I should see 'url("../images/100px-5fd6fb90.jpg");'
And I should see 'url("../images/100px-5fd6fb90.jpg?test");'
And I should see 'url("../images/100px-5fd6fb90.jpg?#test");'
And I should see 'url("../images/100px-5fd6fb90.jpg#test");'
Scenario: Hashed assets work with Slim Scenario: Enabling an asset host still produces hashed files and references
Given the Server is running at "asset-hash-app"
When I go to "/slim.html"
And I should see 'src="images/300px-59adce76.jpg"'
And I should see 'src="images/100px-5fd6fb90.jpg"'
And I should see 'srcset="images/100px-5fd6fb90.jpg 1x, images/200px-c11eb203.jpg 2x, images/300px-59adce76.jpg 3x"'
Scenario: Enabling an asset host still produces hashed files and references (hash first)
Given a fixture app "asset-hash-host-app"
And a file named "config.rb" with:
"""
set :sass_source_maps, false
activate :asset_hash
activate :directory_indexes
activate :asset_host, host: 'http://middlemanapp.com'
"""
Given the Server is running at "asset-hash-host-app" Given the Server is running at "asset-hash-host-app"
When I go to "/" When I go to "/"
Then I should see 'href="http://middlemanapp.com/stylesheets/site-7474cadd.css"' Then I should see 'href="http://middlemanapp.com/stylesheets/site-54baaf3a.css"'
Then I should see 'href="http://middlemanapp.com/stylesheets/fragment-2902933e.css"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"' And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?test"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg#test"'
When I go to "/subdir/" When I go to "/subdir/"
Then I should see 'href="http://middlemanapp.com/stylesheets/site-7474cadd.css"' Then I should see 'href="http://middlemanapp.com/stylesheets/site-54baaf3a.css"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"' And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
When I go to "/other/" When I go to "/other/"
Then I should see 'href="http://middlemanapp.com/stylesheets/site-7474cadd.css"' Then I should see 'href="http://middlemanapp.com/stylesheets/site-54baaf3a.css"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"' And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?test"' # Asset helpers don't appear to work from Compass right now
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test"' # When I go to "/stylesheets/site-e5a31a3e.css"
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg#test"' # Then I should see "background-image: url('http://middlemanapp.com/images/100px-5fd6fb90.jpg')"
When I go to "/stylesheets/fragment-2902933e.css"
And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg");'
And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg?test");'
And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test");'
And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg#test");'
Scenario: Enabling an asset host still produces hashed files and references (host first)
Given a fixture app "asset-hash-host-app"
And a file named "config.rb" with:
"""
set :sass_source_maps, false
activate :asset_host, host: 'http://middlemanapp.com'
activate :directory_indexes
activate :asset_hash
"""
Given the Server is running at "asset-hash-host-app"
When I go to "/"
Then I should see 'href="http://middlemanapp.com/stylesheets/site-7474cadd.css"'
Then I should see 'href="http://middlemanapp.com/stylesheets/fragment-2902933e.css"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?test"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg#test"'
When I go to "/subdir/"
Then I should see 'href="http://middlemanapp.com/stylesheets/site-7474cadd.css"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
When I go to "/other/"
Then I should see 'href="http://middlemanapp.com/stylesheets/site-7474cadd.css"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?test"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test"'
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg#test"'
When I go to "/stylesheets/fragment-2902933e.css"
And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg")'
And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg?test")'
And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test")'
And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg#test")'
Scenario: The asset hash should change when a SASS partial changes Scenario: The asset hash should change when a SASS partial changes
Given the Server is running at "asset-hash-app" Given the Server is running at "asset-hash-app"
@ -179,14 +131,14 @@ Feature: Assets get file hashes appended to them and references to them are upda
font-size: 14px font-size: 14px
""" """
When I go to "/partials/" When I go to "/partials/"
Then I should see 'href="../stylesheets/uses_partials-4d4e34e6.css' Then I should see 'href="../stylesheets/uses_partials-423a00f7.css'
And the file "source/stylesheets/_partial.sass" has the contents And the file "source/stylesheets/_partial.sass" has the contents
""" """
body body
font-size: 18px !important font-size: 18px !important
""" """
When I go to "/partials/" When I go to "/partials/"
Then I should see 'href="../stylesheets/uses_partials-ec347271.css' Then I should see 'href="../stylesheets/uses_partials-e8c3d4eb.css'
Scenario: The asset hash should change when a Rack-based filter changes Scenario: The asset hash should change when a Rack-based filter changes
Given a fixture app "asset-hash-app" Given a fixture app "asset-hash-app"
@ -196,25 +148,22 @@ Feature: Assets get file hashes appended to them and references to them are upda
activate :relative_assets activate :relative_assets
activate :directory_indexes activate :directory_indexes
require 'lib/middleware.rb' require 'lib/middleware.rb'
use ::Middleware use Middleware
""" """
Given the Server is running at "asset-hash-app" Given the Server is running at "asset-hash-app"
When I go to "/" When I go to "/"
Then I should see 'href="stylesheets/site-5ad7def0.css' Then I should see 'href="stylesheets/site-5770af52.css'
When I go to "stylesheets/site-5ad7def0.css" When I go to "stylesheets/site-5770af52.css"
Then I should see 'background-image: url("../images/100px-5fd6fb90.jpg")' Then I should see 'background-image'
Then I should see 'Added by Rack filter' Then I should see 'Added by Rack filter'
When I go to "stylesheets/site-50eaa978.css"
Then I should see 'Not Found'
Scenario: Hashed-asset files are not produced for ignored paths Scenario: Hashed-asset files are not produced for ignored paths
Given a fixture app "asset-hash-app" Given a fixture app "asset-hash-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
is_stylesheet = proc { |path| path.start_with? 'stylesheets' } activate :asset_hash, :ignore => [%r(javascripts/*), 'images/*']
activate :asset_hash, ignore: [
%r(javascripts/*),
'images/*',
is_stylesheet
]
activate :relative_assets activate :relative_assets
activate :directory_indexes activate :directory_indexes
""" """
@ -228,97 +177,27 @@ Feature: Assets get file hashes appended to them and references to them are upda
| images/100px.jpg | | images/100px.jpg |
| images/100px.gif | | images/100px.gif |
| javascripts/application.js | | javascripts/application.js |
| stylesheets/site.css | | stylesheets/site-50eaa978.css |
| index.html | | index.html |
| subdir/index.html | | subdir/index.html |
| other/index.html | | other/index.html |
| api.json |
| subdir/api.json |
And the following files should not exist: And the following files should not exist:
| images/100px-1242c368.png | | images/100px-1242c368.png |
| images/100px-5fd6fb90.jpg | | images/100px-5fd6fb90.jpg |
| images/100px-5fd6fb90.gif | | images/100px-5fd6fb90.gif |
| javascripts/application-1d8d5276.js | | javascripts/application-1d8d5276.js |
| stylesheets/site-7474cadd.css |
Scenario: Hashed-asset files are not replaced for rewrite ignored paths
Given a fixture app "asset-hash-app"
And a file named "config.rb" with:
"""
is_stylesheet = proc { |path| path.start_with? '/stylesheets' }
activate :asset_hash, rewrite_ignore: [
%r(javascripts/*),
'/subdir/*',
is_stylesheet
]
activate :relative_assets
activate :directory_indexes
"""
And a successfully built app at "asset-hash-app"
When I cd to "build"
Then the following files should exist:
| index.html |
| subdir/index.html |
| images/100px-5fd6fb90.jpg |
| javascripts/application-1d8d5276.js |
| stylesheets/site-8bc55985.css |
And the following files should not exist:
| images/100px.jpg |
| javascripts/application.js |
| stylesheets/site.css | | stylesheets/site.css |
And the file "javascripts/application-1d8d5276.js" should contain "img.src = '/images/100px.jpg'"
And the file "stylesheets/site-8bc55985.css" should contain:
"""
background-image: url("../images/100px.jpg")
"""
And the file "index.html" should contain 'href="stylesheets/site-8bc55985.css"'
And the file "index.html" should contain 'src="javascripts/application-1d8d5276.js"'
And the file "index.html" should contain 'src="images/100px-5fd6fb90.jpg"'
And the file "subdir/index.html" should contain:
"""
<h2>Image url3:</h2>
<p><img src="../images/100px.jpg"></p>
"""
Scenario: Already minified files should still be hashed # @wip Currently broken, we should move all asset-host functionality out of Compass and into something more similar to asset_hash with Rack-based rewrites
Given a successfully built app at "asset-hash-minified-app" # Scenario: Enabling an asset host and referencing assets in CSS with URL fragments are rewritten correctly
When I cd to "build" # Given a successfully built app at "asset-hash-host-app"
Then the following files should exist: # When I cd to "build"
| javascripts/jquery.min-276c87ff.js |
| stylesheets/test-7de2ad06.css |
And the following files should not exist:
| javascripts/jquery.min.js |
And the file "stylesheets/test-7de2ad06.css" should contain:
"""
.no-bug{background-image:url(/images/100px-5fd6fb90.jpg)}
.bug{content:"";background-image:url(/images/100px-5fd6fb90.jpg)}
.no-bug{content:""; background-image:url(/images/100px-5fd6fb90.jpg)}
"""
Scenario: Source map paths include the hash # Then the following files should exist:
Given a successfully built app at "asset-hash-source-map" # | images/100px-5fd6fb90.jpg |
When I cd to "build" # | stylesheets/fragment-c058ecb2.css |
Then the following files should exist: # And the following files should not exist:
| index.html | # | images/100px.jpg |
| javascripts/application-4553338c.js |
| javascripts/application.js-22cc2b5f.map |
| index.html |
And the following files should not exist:
| javascripts/application.js |
| javascripts/application.js.map |
And the file "javascripts/application-4553338c.js" should contain "//# sourceMappingURL=application.js-22cc2b5f.map" # And the file "stylesheets/fragment-c058ecb2.css" should contain "http://middlemanapp.com/images/100px-5fd6fb90.jpg#test"
# And the file "stylesheets/fragment-c058ecb2.css" should not contain "http://middlemanapp.com/images/100px.jpg#test"
Scenario: Hashes can contain a prefix
Given a successfully built app at "asset-hash-prefix"
When I cd to "build"
Then the following files should exist:
| index.html |
| javascripts/application-myprefix-4553338c.js |
| javascripts/application.js-myprefix-22cc2b5f.map |
| index.html |
And the following files should not exist:
| javascripts/application.js |
| javascripts/application.js.map |
And the file "javascripts/application-myprefix-4553338c.js" should contain "//# sourceMappingURL=application.js-myprefix-22cc2b5f.map"

View File

@ -1,55 +1,56 @@
Feature: Alternate between multiple asset hosts Feature: Alternate between multiple asset hosts
In order to speed up page loading
Scenario: Set single host globally
Given a fixture app "asset-host-app"
And a file named "config.rb" with:
"""
activate :asset_host
set :asset_host, "http://assets1.example.com"
"""
And the Server is running
When I go to "/asset_host.html"
Then I should see "http://assets1"
When I go to "/stylesheets/asset_host.css"
Then I should see "http://assets1"
Scenario: Set proc host globally
Given a fixture app "asset-host-app"
And a file named "config.rb" with:
"""
activate :asset_host
set :asset_host do |asset|
"http://assets%d.example.com" % (asset.hash % 4)
end
"""
And the Server is running
When I go to "/asset_host.html"
Then I should see "http://assets"
When I go to "/stylesheets/asset_host.css"
Then I should see "http://assets"
Scenario: Set single host with inline-option Scenario: Set single host with inline-option
Given a fixture app "asset-host-app" Given a fixture app "asset-host-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :asset_host, host: "http://assets1.example.com" activate :asset_host, :host => "http://assets1.example.com"
""" """
And the Server is running And the Server is running
When I go to "/asset_host.html" When I go to "/asset_host.html"
Then I should see "'.google-analytics.com/ga.js'" Then I should see "http://assets1"
Then I should see 'src="https://code.jquery.com/jquery-2.1.3.min.js"'
Then I should see content matching %r{http://assets1.example.com/}
Then I should not see content matching %r{http://assets1.example.com//}
Then I should see content matching %r{<a href="https://github.com/angular/angular.js">Angular.js</a>}
Then I should see content matching %r{'//www.example.com/script.js'}
When I go to "/stylesheets/asset_host.css" When I go to "/stylesheets/asset_host.css"
Then I should see content matching %r{http://assets1.example.com/} Then I should see "http://assets1"
Then I should not see content matching %r{http://assets1.example.com//}
When I go to "/javascripts/asset_host.js"
Then I should not see content matching %r{http://assets1.example.com/}
Scenario: Set proc host with inline-option Scenario: Set proc host with inline-option
Given a fixture app "asset-host-app" Given a fixture app "asset-host-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :asset_host, host: Proc.new { |asset| activate :asset_host, :host => Proc.new { |asset|
hash = Digest::MD5.digest(asset).bytes.map!(&:ord).reduce(&:+) "http://assets%d.example.com" % (asset.hash % 4)
"http://assets%d.example.com" % (hash % 4)
} }
""" """
And the Server is running And the Server is running
When I go to "/asset_host.html" When I go to "/asset_host.html"
Then I should see 'src="https://code.jquery.com/jquery-2.1.3.min.js"' Then I should see "http://assets"
Then I should see content matching %r{http://assets1.example.com/}
Then I should not see content matching %r{http://assets1.example.com//}
Then I should see content matching %r{<a href="https://github.com/angular/angular.js">Angular.js</a>}
Then I should see content matching %r{'//www.example.com/script.js'}
When I go to "/stylesheets/asset_host.css" When I go to "/stylesheets/asset_host.css"
Then I should see content matching %r{http://assets1.example.com/} Then I should see "http://assets"
Then I should not see content matching %r{http://assets1.example.com//}
Scenario: Hosts are not rewritten for rewrite ignored paths
Given a fixture app "asset-host-app"
And a file named "config.rb" with:
"""
activate :asset_host, host: "http://assets1.example.com", rewrite_ignore: [
'/stylesheets/asset_host.css',
]
"""
And the Server is running
When I go to "/asset_host.html"
Then I should see content matching %r{http://assets1.example.com/}
When I go to "/stylesheets/asset_host.css"
Then I should not see content matching %r{http://assets1.example.com/}

View File

@ -1,8 +0,0 @@
Feature: Automatically detect and insert image dimensions into tags
In order to speed up development and appease YSlow
Scenario: Rendering an image with the feature enabled
Given "automatic_alt_tags" feature is "enabled"
And the Server is running at "automatic-alt-tags-app"
When I go to "/auto-image-sizes.html"
Then I should see 'alt="Blank"'

View File

@ -2,28 +2,15 @@ Feature: Automatically detect and insert image dimensions into tags
In order to speed up development and appease YSlow In order to speed up development and appease YSlow
Scenario: Rendering an image with the feature disabled Scenario: Rendering an image with the feature disabled
Given a fixture app "automatic-image-size-app" Given "automatic_image_sizes" feature is "disabled"
And a file named "config.rb" with:
"""
"""
And the Server is running at "automatic-image-size-app" And the Server is running at "automatic-image-size-app"
When I go to "/auto-image-sizes.html" When I go to "/auto-image-sizes.html"
Then I should not see "width=" Then I should not see "width="
And I should not see "height=" And I should not see "height="
When I go to "/markdown-sizes.html"
Then I should not see "width="
And I should not see "height="
Scenario: Rendering an image with the feature enabled Scenario: Rendering an image with the feature enabled
Given a fixture app "automatic-image-size-app" Given "automatic_image_sizes" feature is "enabled"
And a file named "config.rb" with:
"""
activate :automatic_image_sizes
"""
And the Server is running at "automatic-image-size-app" And the Server is running at "automatic-image-size-app"
When I go to "/auto-image-sizes.html" When I go to "/auto-image-sizes.html"
Then I should see 'width="1"' Then I should see "width="
And I should see 'height="1"' And I should see "height="
When I go to "/markdown-sizes.html"
Then I should see 'width="1"'
And I should see 'height="1"'

View File

@ -9,6 +9,7 @@ Feature: Builder
| static.html | | static.html |
| services/index.html | | services/index.html |
| stylesheets/static.css | | stylesheets/static.css |
| spaces in file.html |
| images/blank.gif | | images/blank.gif |
| images/Read me (example).txt | | images/Read me (example).txt |
| images/Child folder/regular_file(example).txt | | images/Child folder/regular_file(example).txt |
@ -20,13 +21,14 @@ Feature: Builder
| layout | | layout |
| layouts/custom | | layouts/custom |
| layouts/content_for | | layouts/content_for |
And the file "index.html" should contain "Comment in layout" And the file "index.html" should contain "Comment in layout"
And the file "index.html" should contain "<h1>Welcome</h1>" And the file "index.html" should contain "<h1>Welcome</h1>"
And the file "static.html" should contain "Static, no code!" And the file "static.html" should contain "Static, no code!"
And the file "services/index.html" should contain "Services" And the file "services/index.html" should contain "Services"
And the file "stylesheets/static.css" should contain "body" And the file "stylesheets/static.css" should contain "body"
And the file "spaces in file.html" should contain "spaces"
Scenario: Build glob Scenario: Build glob
Given a successfully built app at "glob-app" with flags "--glob '*.css'" Given a successfully built app at "glob-app" with flags "--glob '*.css'"
When I cd to "build" When I cd to "build"
@ -34,28 +36,16 @@ Feature: Builder
| index.html | | index.html |
Then the following files should exist: Then the following files should exist:
| stylesheets/site.css | | stylesheets/site.css |
Scenario: Build with errors Scenario: Build with errors
Given a built app at "build-with-errors-app" Given a built app at "build-with-errors-app"
Then the exit status should be 1 Then the exit status should be 1
Scenario: Build empty errors Scenario: Build empty errors
Given a built app at "empty-app" Given a built app at "empty-app"
Then the exit status should be 1 Then the exit status should be 1
Scenario: Build external_pipeline errors
Given a built app at "external-pipeline-error"
Then the exit status should be 1
Scenario: Build alias (b) Scenario: Build alias (b)
Given a fixture app "large-build-app" Given a fixture app "large-build-app"
When I run `middleman b` When I run `middleman b`
Then was successfully built Then was successfully built
Scenario: Builded text file(ex: html, css, xml, txt)'s permission is 0644
Given a successfully built app at "large-build-app"
When I cd to "build"
Then the mode of filesystem object "index.html" should match "0644"
And the mode of filesystem object "stylesheets/static.css" should match "0644"
And the mode of filesystem object "feed.xml" should match "0644"
And the mode of filesystem object ".htaccess" should match "0644"

View File

@ -5,7 +5,7 @@ Feature: Generate mtime-based query string for busting browser caches
Given "cache_buster" feature is "disabled" Given "cache_buster" feature is "disabled"
And the Server is running at "cache-buster-app" And the Server is running at "cache-buster-app"
When I go to "/stylesheets/relative_assets.css" When I go to "/stylesheets/relative_assets.css"
Then I should see 'blank.gif"' Then I should see "blank.gif'"
Scenario: Rendering html with the feature disabled Scenario: Rendering html with the feature disabled
Given "cache_buster" feature is "disabled" Given "cache_buster" feature is "disabled"
@ -39,18 +39,4 @@ Feature: Generate mtime-based query string for busting browser caches
And the Server is running at "cache-buster-app" And the Server is running at "cache-buster-app"
When I go to "/cache-buster.html" When I go to "/cache-buster.html"
Then I should see "site.css?" Then I should see "site.css?"
Then I should see "blank.gif?" Then I should see "blank.gif?"
Scenario: URLs are not rewritten for rewrite ignored paths
Given a fixture app "cache-buster-app"
And a file named "config.rb" with:
"""
activate :cache_buster, rewrite_ignore: [
'/cache-buster.html',
]
"""
And the Server is running at "cache-buster-app"
When I go to "/cache-buster.html"
Then I should see 'site.css"'
Then I should see 'empty-with-include.js"'
Then I should see 'blank.gif"'

View File

@ -7,103 +7,13 @@ Feature: Templates should be chainable
Then I should see "Title</h1>" Then I should see "Title</h1>"
And I should see "Subtitle</h2>" And I should see "Subtitle</h2>"
And I should see "Sup</h3>" And I should see "Sup</h3>"
Scenario: Build chained template Scenario: Build chained template
Given a successfully built app at "chained-app" Given a successfully built app at "chained-app"
When I cd to "build" When I cd to "build"
Then the following files should exist: Then the following files should exist:
| index.html | | index.html |
| test.erb.combobreaker |
And the file "index.html" should contain "Title</h1>" And the file "index.html" should contain "Title</h1>"
And the file "index.html" should contain "Subtitle</h2>" And the file "index.html" should contain "Subtitle</h2>"
And the file "index.html" should contain "Sup</h3>" And the file "index.html" should contain "Sup</h3>"
And the file "test.erb.combobreaker" should contain "Title</h1>"
And the file "test.erb.combobreaker" should contain "Subtitle</h2>"
And the file "test.erb.combobreaker" should contain "Sup</h3>"
Scenario: Partials are parsed by multiple template engines: Outer template has .erb and inner .md.erb
Given a fixture app "partial-chained_templates-app"
And a template named "my_template.html.erb" with:
"""
<h1>My Template</h1>
<%= partial 'my_partial' %>
"""
And a template named "my_partial.html.md.erb" with:
"""
## My Partial
<%= 'hello world' %>
"""
And the Server is running
When I go to "/my_template.html"
Then I should see:
"""
<h1>My Template</h1>
"""
Then I should see:
"""
<h2 id="my-partial">My Partial</h2>
"""
Then I should see:
"""
<p>hello world</p>
"""
Scenario: Partials are parsed by multiple template engines: Outer template has .md.erb and inner .md.erb
Given a fixture app "partial-chained_templates-app"
And a template named "my_template.html.md.erb" with:
"""
# My Template
<%= partial 'my_partial' %>
"""
And a template named "my_partial.html.md.erb" with:
"""
## My Partial
<%= 'hello world' %>
"""
And the Server is running
When I go to "/my_template.html"
Then I should see:
"""
<h1 id="my-template">My Template</h1>
"""
Then I should see:
"""
<h2 id="my-partial">My Partial</h2>
"""
Then I should see:
"""
<p>hello world</p>
"""
Scenario: Partials are parsed by multiple template engines: Outer template has .md.erb, and inner .erb
Given a fixture app "partial-chained_templates-app"
And a template named "my_template.html.md.erb" with:
"""
# My Template
<%= partial 'my_partial' %>
"""
And a template named "my_partial.html.erb" with:
"""
<h2>My Partial</h2>
<%= 'hello world' %>
"""
And the Server is running
When I go to "/my_template.html"
Then I should see:
"""
<h1 id="my-template">My Template</h1>
"""
Then I should see:
"""
<h2>My Partial</h2>
"""
Then I should see:
"""
<p>hello world</p>
"""

View File

@ -16,22 +16,6 @@ Feature: Build Clean
| build/should_be_ignored3.html | | build/should_be_ignored3.html |
And the file "build/index.html" should contain "Comment in layout" And the file "build/index.html" should contain "Comment in layout"
Scenario: Clean build has a whitelist
Given a fixture app "clean-app"
When a file named "build/.test" with:
"""
Hello
"""
When a file named "config.rb" with:
"""
set :skip_build_clean do |path|
path =~ /\.test/
end
"""
Given a built app at "clean-app"
Then the following files should exist:
| build/.test |
Scenario: Clean build an app with newly ignored files and a nested output directory Scenario: Clean build an app with newly ignored files and a nested output directory
Given a fixture app "clean-nested-app" Given a fixture app "clean-nested-app"
When a file named "config.rb" with: When a file named "config.rb" with:
@ -58,21 +42,3 @@ Feature: Build Clean
Then the following files should not exist: Then the following files should not exist:
| sub/dir/about.html | | sub/dir/about.html |
| sub/dir/nested/nested.html | | sub/dir/nested/nested.html |
Scenario: Build and clean an app under a hidden directory
Given a fixture app "clean-app"
And app "clean-app" is using config "hidden-dir-before"
And a built app at "clean-app"
Then the following files should exist:
| .build/index.html |
| .build/should_be_ignored.html |
| .build/should_be_ignored2.html |
| .build/should_be_ignored3.html |
Given app "clean-app" is using config "hidden-dir-after"
And a built app at "clean-app"
Then the following files should exist:
| .build/index.html |
And the following files should not exist:
| .build/should_be_ignored.html |
| .build/should_be_ignored2.html |
| .build/should_be_ignored3.html |

View File

@ -9,6 +9,6 @@ Feature: Middleman New Extension CLI
| Rakefile | | Rakefile |
| my-extension-library.gemspec | | my-extension-library.gemspec |
| features/support/env.rb | | features/support/env.rb |
| lib/my-extension-library/extension.rb | | lib/middleman_extension.rb |
| lib/my-extension-library.rb | | lib/my-extension-library.rb |
| .gitignore | | .gitignore |

View File

@ -0,0 +1,100 @@
Feature: Middleman CLI
Scenario: Create a new project
Given I run `middleman init MY_PROJECT`
Then the exit status should be 0
When I cd to "MY_PROJECT"
Then the following files should exist:
| Gemfile |
| .gitignore |
| config.rb |
| source/index.html.erb |
| source/images/background.png |
| source/images/middleman.png |
| source/layouts/layout.erb |
| source/javascripts/all.js |
| source/stylesheets/all.css |
| source/stylesheets/normalize.css |
Scenario: Create a new project in the current directory
Given a directory named "MY_PROJECT"
When I cd to "MY_PROJECT"
And I run `middleman init`
Then the exit status should be 0
And the following files should exist:
| Gemfile |
| config.rb |
| source/index.html.erb |
Scenario: Create a new project (alias i)
When I run `middleman i MY_PROJECT`
Then a directory named "MY_PROJECT" should exist
Scenario: Create a new project (alias new)
When I run `middleman new MY_PROJECT`
Then a directory named "MY_PROJECT" should exist
Scenario: Create a new project (alias n)
When I run `middleman n MY_PROJECT`
Then a directory named "MY_PROJECT" should exist
Scenario: Create a new project with Rack
When I run `middleman init MY_PROJECT --rack`
Then a directory named "MY_PROJECT" should exist
When I cd to "MY_PROJECT"
Then the following files should exist:
| config.rb |
| config.ru |
| Gemfile |
Scenario: Create a new HTML5 project
When I run `middleman init MY_PROJECT --template=html5`
Then a directory named "MY_PROJECT" should exist
When I cd to "MY_PROJECT"
Then the following files should exist:
| config.rb |
| Gemfile |
Then the following files should not exist:
| config.ru |
And the file "config.rb" should contain "set :js_dir, 'js'"
Then a directory named "source" should exist
When I cd to "source"
Then the following files should exist:
| index.html.erb |
| layouts/layout.erb |
| humans.txt |
| js/main.js |
Scenario: Create a new HTML5 project with Rack
When I run `middleman init MY_PROJECT --rack --template=html5`
Then a directory named "MY_PROJECT" should exist
When I cd to "MY_PROJECT"
Then the following files should exist:
| config.rb |
| config.ru |
| Gemfile |
Scenario: Create a new Mobile HTML5 project
When I run `middleman init MY_PROJECT --template=mobile`
Then a directory named "MY_PROJECT" should exist
When I cd to "MY_PROJECT"
Then the following files should exist:
| config.rb |
| Gemfile |
Then the following files should not exist:
| config.ru |
Then a directory named "source" should exist
When I cd to "source"
Then the following files should exist:
| index.html |
| humans.txt |
| js/libs/respond.min.js |
Scenario: Create a new Mobile HTML5 project with Rack
When I run `middleman init MY_PROJECT --rack --template=mobile`
Then a directory named "MY_PROJECT" should exist
When I cd to "MY_PROJECT"
Then the following files should exist:
| config.rb |
| config.ru |
| Gemfile |

View File

@ -1,265 +0,0 @@
Feature: Collections
Scenario: Lazy query
Given a fixture app "collections-app"
And a file named "config.rb" with:
"""
articles1 = collection :articles1, resources.select { |r|
matcher = ::Middleman::Util::UriTemplates.uri_template('blog1/{year}-{month}-{day}-{title}.html')
::Middleman::Util::UriTemplates.extract_params(matcher, ::Middleman::Util.normalize_path(r.url))
}
everything = resources.select do |r|
true
end
def get_tags(resource)
if resource.data.tags.is_a? String
resource.data.tags.split(',').map(&:strip)
else
resource.data.tags
end
end
def group_lookup(resource, sum)
results = Array(get_tags(resource)).map(&:to_s).map(&:to_sym)
results.each do |k|
sum[k] ||= []
sum[k] << resource
end
end
tags = everything
.select { |resource| resource.data.tags }
.each_with_object({}, &method(:group_lookup))
class Wrapper
attr_reader :stuff
def initialize
@stuff = Set.new
end
def <<((k, v))
@stuff << k
self
end
end
collection :wrapped, tags.reduce(Wrapper.new, :<<)
set :tags, tags # Expose to templates
collection :first_tag, tags.keys.sort.first
"""
And a file named "source/index.html.erb" with:
"""
<% collection(:articles1).each do |article| %>
Article1: <%= article.data.title %>
<% end %>
Tag Count: <%= collection(:wrapped).stuff.length %>
<% config[:tags].value.each do |k, items| %>
Tag: <%= k %> (<%= items.length %>)
<% items.each do |article| %>
Article (<%= k %>): <%= article.data.title %>
<% end %>
<% end %>
First Tag: <%= collection(:first_tag) %>
"""
Given the Server is running at "collections-app"
When I go to "index.html"
Then I should see 'Article1: Blog1 Newer Article'
And I should see 'Article1: Blog1 Another Article'
And I should see 'Tag: foo (4)'
And I should see 'Article (foo): Blog1 Newer Article'
And I should see 'Article (foo): Blog1 Another Article'
And I should see 'Article (foo): Blog2 Newer Article'
And I should see 'Article (foo): Blog2 Another Article'
And I should see 'Tag: bar (2)'
And I should see 'Article (bar): Blog1 Newer Article'
And I should see 'Article (bar): Blog2 Newer Article'
And I should see 'Tag: 120 (1)'
And I should see 'Article (120): Blog1 Another Article'
And I should see 'First Tag: 120'
And I should see 'Tag Count: 3'
Scenario: Collected resources update with file changes
Given a fixture app "collections-app"
And a file named "config.rb" with:
"""
collection :articles, resources.select { |r|
matcher = ::Middleman::Util::UriTemplates.uri_template('blog2/{year}-{month}-{day}-{title}.html')
::Middleman::Util::UriTemplates.extract_params(matcher, ::Middleman::Util.normalize_path(r.url))
}
"""
And a file named "source/index.html.erb" with:
"""
<% collection(:articles).each do |article| %>
Article: <%= article.data.title || article.file_descriptor[:relative_path] %>
<% end %>
"""
Given the Server is running at "collections-app"
When I go to "index.html"
Then I should not see "Article: index.html.erb"
Then I should see 'Article: Blog2 Newer Article'
And I should see 'Article: Blog2 Another Article'
And the file "source/blog2/2011-01-02-another-article.html.markdown" has the contents
"""
---
title: "Blog3 Another Article"
date: 2011-01-02
tags:
- foo
---
Another Article Content
"""
When I go to "index.html"
Then I should see "Article: Blog2 Newer Article"
And I should not see "Article: Blog2 Another Article"
And I should see 'Article: Blog3 Another Article'
And the file "source/blog2/2011-01-01-new-article.html.markdown" is removed
When I go to "index.html"
Then I should not see "Article: Blog2 Newer Article"
And I should see 'Article: Blog3 Another Article'
And the file "source/blog2/2014-01-02-yet-another-article.html.markdown" has the contents
"""
---
title: "Blog2 Yet Another Article"
date: 2011-01-02
tags:
- foo
---
Yet Another Article Content
"""
When I go to "index.html"
And I should see 'Article: Blog3 Another Article'
And I should see 'Article: Blog2 Yet Another Article'
Scenario: Work with local helpers
Given a fixture app "collections-app"
And a file named "config.rb" with:
"""
module TestHelper
def help_me
"ok"
end
end
include TestHelper
data.articles.each_with_index do |a, i|
proxy "/#{i}-#{help_me}.html", a
end
"""
And a file named "data/articles.yaml" with:
"""
---
- "/blog1/2011-01-01-new-article.html"
- "/blog2/2011-01-02-another-article.html"
"""
Given the Server is running at "collections-app"
When I go to "0-ok.html"
Then I should see 'Newer Article Content'
When I go to "1-ok.html"
Then I should see 'Another Article Content'
Scenario: Collected data update with file changes
Given a fixture app "collections-app"
And a file named "config.rb" with:
"""
data.articles.each_with_index do |a, i|
proxy "/#{i}.html", a
end
"""
And a file named "data/articles.yaml" with:
"""
---
- "/blog1/2011-01-01-new-article.html"
- "/blog2/2011-01-02-another-article.html"
"""
Given the Server is running at "collections-app"
When I go to "0.html"
Then I should see 'Newer Article Content'
When I go to "1.html"
Then I should see 'Another Article Content'
When I go to "2.html"
Then I should see 'Not Found'
When the file "data/articles.yaml" has the contents
"""
---
- "/blog1/2011-01-01-new-article.html"
"""
When I go to "0.html"
Then I should see 'Newer Article Content'
When I go to "1.html"
Then I should see 'Not Found'
When I go to "2.html"
Then I should see 'Not Found'
When the file "data/articles.yaml" has the contents
"""
---
- "/blog2/2011-01-02-another-article.html"
- "/blog1/2011-01-01-new-article.html"
- "/blog2/2011-01-01-new-article.html"
"""
When I go to "0.html"
Then I should see 'Another Article Content'
When I go to "1.html"
Then I should see 'Newer Article Content'
When I go to "2.html"
Then I should see 'Again'
Scenario: Arbitrary live datasets
Given a fixture app "collections-app"
And a file named "config.rb" with:
"""
ignore "/description_template.html"
live {
Dir[File.join(root, "descriptions/*.txt")]
}.each do |description_name|
base = File.basename(description_name, '.txt')
proxy "#{base}.html", "/description_template.html", locals: {
contents: File.read(description_name)
}
end
"""
And a file named "source/description_template.html.erb" with:
"""
<%= contents %>
"""
And a file named "descriptions/test1.txt" with:
"""
Test1
"""
Given the Server is running at "collections-app"
When I go to "test1.html"
Then I should see 'Test1'
When I go to "test2.html"
Then I should see 'Not Found'
When the file "descriptions/test2.txt" has the contents
"""
Test2
"""
When I go to "test1.html"
Then I should see 'Test1'
When I go to "test2.html"
Then I should see 'Test2'
When the file "descriptions/test1.txt" is removed
When I go to "test1.html"
Then I should see 'Not Found'
When I go to "test2.html"
Then I should see 'Test2'

View File

@ -0,0 +1,6 @@
Feature: Compass sprites should be generated on build and copied
Scenario: Building a clean site with sprites
Given a successfully built app at "compass-sprites-app"
When I cd to "build"
Then the following files should exist:
| images/icon-s0de2218f58.png |

View File

@ -1,11 +0,0 @@
Feature: Console
Scenario: Enter and exit the console
Given a fixture app "large-build-app"
When I run `middleman console` interactively
And I type "puts 'Hello from the console.'"
And I type "exit"
Then it should pass with:
"""
Hello from the console.
"""

View File

@ -12,15 +12,13 @@ Feature: Setting the right content type for files
Then the content type should be "text/css" Then the content type should be "text/css"
When I go to "/README" When I go to "/README"
Then the content type should be "text/plain" Then the content type should be "text/plain"
When I go to "/index.php"
Then the content type should be "text/php"
Scenario: Content type can be set explicitly via page or proxy or frontmatter Scenario: Content type can be set explicitly via page or proxy or frontmatter
Given a fixture app "content-type-app" Given a fixture app "content-type-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
page "README", content_type: 'text/awesome' page "README", :content_type => 'text/awesome'
proxy "bar", "index.html", content_type: 'text/custom' proxy "bar", "index.html", :content_type => 'text/custom'
proxy "foo", "README" # auto-delegate to target content type proxy "foo", "README" # auto-delegate to target content type
""" """
And the Server is running at "content-type-app" And the Server is running at "content-type-app"
@ -33,7 +31,6 @@ Feature: Setting the right content type for files
When I go to "/override.html" When I go to "/override.html"
Then the content type should be "text/neato" Then the content type should be "text/neato"
@preserve_mime_types
Scenario: Content types can be overridden with mime_type Scenario: Content types can be overridden with mime_type
Given a fixture app "content-type-app" Given a fixture app "content-type-app"
And a file named "config.rb" with: And a file named "config.rb" with:

View File

@ -1,38 +1,26 @@
Feature: Custom layouts Feature: Custom layouts
In order easily switch between relative and absolute paths In order easily switch between relative and absolute paths
Scenario: Using custom :layout attribute Scenario: Using custom :layout attribute
Given a fixture app "custom-layout-app2" Given page "/custom-layout.html" has layout "custom"
And a file named "config.rb" with: And the Server is running at "custom-layout-app2"
""" When I go to "/custom-layout.html"
page '/custom-layout.html', layout: :custom Then I should see "Custom Layout"
"""
Scenario: Using with_layout block
Given "/custom-layout.html" with_layout block has layout "custom"
And the Server is running at "custom-layout-app2" And the Server is running at "custom-layout-app2"
When I go to "/custom-layout.html" When I go to "/custom-layout.html"
Then I should see "Custom Layout" Then I should see "Custom Layout"
Scenario: Using custom :layout attribute with proxy Scenario: Using with_layout block with globs
Given a fixture app "custom-layout-app2" Given "/custom-*" with_layout block has layout "custom"
And a file named "config.rb" with:
"""
page '/test/*', layout: :custom
proxy "/test/me.html", "/custom-layout.html"
live { %w(you) }.each do |who|
proxy "/test/#{who}.html", "/custom-layout.html"
end
"""
And the Server is running at "custom-layout-app2" And the Server is running at "custom-layout-app2"
When I go to "/test/me.html" When I go to "/custom-layout.html"
Then I should see "Custom Layout" Then I should see "Custom Layout"
When I go to "/test/you.html"
Then I should see "Custom Layout"
Scenario: Using custom :layout attribute with folders Scenario: Using custom :layout attribute with folders
Given a fixture app "custom-layout-app2" Given page "/custom-layout-dir/" has layout "custom"
And a file named "config.rb" with:
"""
page '/custom-layout-dir/', layout: :custom
"""
And the Server is running at "custom-layout-app2" And the Server is running at "custom-layout-app2"
When I go to "/custom-layout-dir" When I go to "/custom-layout-dir"
Then I should see "Custom Layout" Then I should see "Custom Layout"
@ -40,13 +28,9 @@ Feature: Custom layouts
Then I should see "Custom Layout" Then I should see "Custom Layout"
When I go to "/custom-layout-dir/index.html" When I go to "/custom-layout-dir/index.html"
Then I should see "Custom Layout" Then I should see "Custom Layout"
Scenario: Using custom :layout attribute with folders Scenario: Using custom :layout attribute with folders
Given a fixture app "custom-layout-app2" Given page "/custom-layout-dir" has layout "custom"
And a file named "config.rb" with:
"""
page '/custom-layout-dir', layout: :custom
"""
And the Server is running at "custom-layout-app2" And the Server is running at "custom-layout-app2"
When I go to "/custom-layout-dir" When I go to "/custom-layout-dir"
Then I should see "Custom Layout" Then I should see "Custom Layout"
@ -54,13 +38,9 @@ Feature: Custom layouts
Then I should see "Custom Layout" Then I should see "Custom Layout"
When I go to "/custom-layout-dir/index.html" When I go to "/custom-layout-dir/index.html"
Then I should see "Custom Layout" Then I should see "Custom Layout"
Scenario: Using custom :layout attribute with folders Scenario: Using custom :layout attribute with folders
Given a fixture app "custom-layout-app2" Given page "/custom-layout-dir/index.html" has layout "custom"
And a file named "config.rb" with:
"""
page '/custom-layout-dir/index.html', layout: :custom
"""
And the Server is running at "custom-layout-app2" And the Server is running at "custom-layout-app2"
When I go to "/custom-layout-dir" When I go to "/custom-layout-dir"
Then I should see "Custom Layout" Then I should see "Custom Layout"
@ -68,7 +48,7 @@ Feature: Custom layouts
Then I should see "Custom Layout" Then I should see "Custom Layout"
When I go to "/custom-layout-dir/index.html" When I go to "/custom-layout-dir/index.html"
Then I should see "Custom Layout" Then I should see "Custom Layout"
Scenario: Setting layout inside a matching page block Scenario: Setting layout inside a matching page block
Given the Server is running at "page-helper-layout-block-app" Given the Server is running at "page-helper-layout-block-app"
When I go to "/index.html" When I go to "/index.html"
@ -81,4 +61,4 @@ Feature: Custom layouts
When I go to "/path/index.html" When I go to "/path/index.html"
Then I should see "Alt" Then I should see "Alt"
And I should see "Monde" And I should see "Monde"
And I should not see "Hello" And I should not see "Hello"

View File

@ -51,10 +51,3 @@ Feature: Local Data API
Then I should see "title1:Hello" Then I should see "title1:Hello"
Then I should see "title2:More" Then I should see "title2:More"
Then I should see "title3:Stuff" Then I should see "title3:Stuff"
Scenario: Using data postscript
Given the Server is running at "nested-data-app"
When I go to "/extracontent.html"
Then I should see "<h1>With Content</h1>"
Then I should see '<h2 id="header-2">Header 2</h2>'
Then I should see "<p>Paragraph 1</p>"

View File

@ -1,90 +0,0 @@
Feature: Describe which files get layouts
Background:
Given an empty app
And a file named "config.rb" with:
"""
page "/about.html", layout: :layout2
"""
And a file named "source/layouts/layout.erb" with:
"""
In Layout
<%= yield %>
"""
And a file named "source/layouts/layout2.erb" with:
"""
<root>
<title>Second Layout</title>
<%= yield %>
</root>
"""
And a file named "source/index.html.erb" with:
"""
In Index
"""
And a file named "source/about.html.erb" with:
"""
In About
"""
And a file named "source/style.css.scss" with:
"""
html { border: 1; }
"""
And a file named "source/style2.scss" with:
"""
html { border: 2; }
"""
And a file named "source/data.json" with:
"""
{ "hello": "world" }
"""
And a file named "source/script.js" with:
"""
helloWorld();
"""
And a file named "source/test.xml.erb" with:
"""
---
layout: layout2
---
<test>Hi</test>
"""
And the Server is running at "empty_app"
Scenario: Normal Template
When I go to "/index.html"
Then I should see "In Index"
And I should see "In Layout"
Scenario: Normal Template with override
When I go to "/about.html"
Then I should see "In About"
And I should see "Second Layout"
And I should not see "In Layout"
Scenario: Sass
When I go to "/style.css"
Then I should see "border: 1"
And I should not see "In Layout"
Scenario: Sass with extension
When I go to "/style2"
Then I should see "border: 2"
And I should not see "In Layout"
Scenario: JSON
When I go to "/data.json"
Then I should see "hello"
And I should not see "In Layout"
Scenario: JS
When I go to "/script.js"
Then I should see "helloWorld()"
And I should not see "In Layout"
Scenario: XML
When I go to "/test.xml"
Then I should see "<test>Hi</test>"
And I should see "<title>Second Layout</title>"

View File

@ -9,7 +9,6 @@ Feature: Directory Index
| a_folder/needs_index/index.html | | a_folder/needs_index/index.html |
| leave_me_alone.html | | leave_me_alone.html |
| wildcard_leave_me_alone.html | | wildcard_leave_me_alone.html |
| regex_leave_me_alone2.html |
| evil spaces/index.html | | evil spaces/index.html |
| regular/index.html | | regular/index.html |
| .htaccess | | .htaccess |
@ -22,28 +21,28 @@ Feature: Directory Index
| a_folder/needs_index.html | | a_folder/needs_index.html |
| leave_me_alone/index.html | | leave_me_alone/index.html |
| wildcard_leave_me_alone/index.html | | wildcard_leave_me_alone/index.html |
| regex_leave_me_alone2/index.html |
And the file "needs_index/index.html" should contain "Indexable" And the file "needs_index/index.html" should contain "Indexable"
And the file "a_folder/needs_index/index.html" should contain "Indexable" And the file "a_folder/needs_index/index.html" should contain "Indexable"
And the file "leave_me_alone.html" should contain "Stay away" And the file "leave_me_alone.html" should contain "Stay away"
And the file "regular/index.html" should contain "Regular" And the file "regular/index.html" should contain "Regular"
And the file "evil spaces/index.html" should contain "Filled with Evil Spaces" And the file "evil spaces/index.html" should contain "Spaces"
Scenario: Preview normal file Scenario: Preview normal file
Given the Server is running at "indexable-app" Given the Server is running at "indexable-app"
When I go to "/needs_index/" When I go to "/needs_index/"
Then I should see "Indexable" Then I should see "Indexable"
Scenario: Preview normal file with spaces in filename Scenario: Preview normal file with spaces in filename
Given the Server is running at "indexable-app" Given the Server is running at "indexable-app"
When I go to "/evil spaces/" When I go to "/evil%20spaces/"
Then I should see "Filled with Evil Spaces" Then I should see "Spaces"
Scenario: Preview normal file subdirectory Scenario: Preview normal file subdirectory
Given the Server is running at "indexable-app" Given the Server is running at "indexable-app"
When I go to "/a_folder/needs_index/" When I go to "/a_folder/needs_index/"
Then I should see "Indexable" Then I should see "Indexable"
Scenario: Preview ignored file Scenario: Preview ignored file
Given the Server is running at "indexable-app" Given the Server is running at "indexable-app"
When I go to "/leave_me_alone/" When I go to "/leave_me_alone/"
@ -70,13 +69,14 @@ Feature: Directory Index
And the Server is running at "indexable-app" And the Server is running at "indexable-app"
When I go to "/link_to/" When I go to "/link_to/"
Then I should see 'link_to: <a href="/needs_index/">Needs Index</a>' Then I should see 'link_to: <a href="/needs_index/">Needs Index</a>'
Then I should see 'explicit_link_to: <a href="/needs_index/">Explicit</a>' Then I should see 'explicit_link_to: <a href="/needs_index/index.html">Explicit</a>'
Then I should see 'unknown_link_to: <a href="/unknown.html">Unknown</a>' Then I should see 'unknown_link_to: <a href="/unknown.html">Unknown</a>'
Then I should see 'relative_link_to: <a href="/needs_index/">Relative</a>' Then I should see 'relative_link_to: <a href="/needs_index/">Relative</a>'
Then I should see 'link_to_with_spaces: <a href="/evil%20spaces/">Spaces</a>' Then I should see 'link_to_with_spaces: <a href="/evil%20spaces/">Spaces</a>'
When I go to "/link_to/sub/" When I go to "/link_to/sub/"
Then I should see 'link_to: <a href="/needs_index/">Needs Index</a>' Then I should see 'link_to: <a href="/needs_index/">Needs Index</a>'
Then I should see 'explicit_link_to: <a href="/needs_index/">Explicit</a>' Then I should see 'explicit_link_to: <a href="/needs_index/index.html">Explicit</a>'
Then I should see 'unknown_link_to: <a href="/unknown.html">Unknown</a>' Then I should see 'unknown_link_to: <a href="/unknown.html">Unknown</a>'
Then I should see 'relative_link_to: <a href="/needs_index/">Relative</a>' Then I should see 'relative_link_to: <a href="/needs_index/">Relative</a>'
Then I should see 'link_to_with_spaces: <a href="/evil%20spaces/">Spaces</a>' Then I should see 'link_to_with_spaces: <a href="/evil%20spaces/">Spaces</a>'

View File

@ -31,8 +31,7 @@ Feature: Dynamic Pages
| should_be_ignored6.html | | should_be_ignored6.html |
| should_be_ignored7.html | | should_be_ignored7.html |
| should_be_ignored8.html | | should_be_ignored8.html |
| should_be_ignored9.html |
Scenario: Preview basic proxy Scenario: Preview basic proxy
Given the Server is running at "dynamic-pages-app" Given the Server is running at "dynamic-pages-app"
When I go to "/fake.html" When I go to "/fake.html"
@ -43,46 +42,46 @@ Feature: Dynamic Pages
Then I should see "I am real" Then I should see "I am real"
When I go to "/fake4.html" When I go to "/fake4.html"
Then I should see "I am real" Then I should see "I am real"
Scenario: Preview proxy with variable one Scenario: Preview proxy with variable one
Given the Server is running at "dynamic-pages-app" Given the Server is running at "dynamic-pages-app"
When I go to "/fake/one.html" When I go to "/fake/one.html"
Then I should see "I am real: one" Then I should see "I am real: one"
Then I should see "Global: I am one glob" Then I should see "Global: I am one glob"
Then I should see "All: I am all glob" Then I should see "All: I am all glob"
When I go to "/fake2/one.html" When I go to "/fake2/one.html"
Then I should see "I am real: one" Then I should see "I am real: one"
Then I should see "Global: I am two glob" Then I should see "Global: I am two glob"
Then I should see "All: I am all glob" Then I should see "All: I am all glob"
When I go to "/fake3/one.html" When I go to "/fake3/one.html"
Then I should see "I am real: one" Then I should see "I am real: one"
Then I should see "Global: I am three glob" Then I should see "Global: I am three glob"
Then I should see "All: I am all glob" Then I should see "All: I am all glob"
When I go to "/fake4/one.html" When I go to "/fake4/one.html"
Then I should see "I am real: one" Then I should see "I am real: one"
Then I should see "Global: I am four glob" Then I should see "Global: I am four glob"
Then I should see "All: I am all glob" Then I should see "All: I am all glob"
Scenario: Preview proxy with variable two Scenario: Preview proxy with variable two
Given the Server is running at "dynamic-pages-app" Given the Server is running at "dynamic-pages-app"
When I go to "/fake/two.html" When I go to "/fake/two.html"
Then I should see "I am real: two" Then I should see "I am real: two"
Then I should see "Global: I am one glob" Then I should see "Global: I am one glob"
Then I should see "All: I am all glob" Then I should see "All: I am all glob"
When I go to "/fake2/two.html" When I go to "/fake2/two.html"
Then I should see "I am real: two" Then I should see "I am real: two"
Then I should see "Global: I am two glob" Then I should see "Global: I am two glob"
Then I should see "All: I am all glob" Then I should see "All: I am all glob"
When I go to "/fake3/two.html" When I go to "/fake3/two.html"
Then I should see "I am real: two" Then I should see "I am real: two"
Then I should see "Global: I am three glob" Then I should see "Global: I am three glob"
Then I should see "All: I am all glob" Then I should see "All: I am all glob"
When I go to "/fake4/two.html" When I go to "/fake4/two.html"
Then I should see "I am real: two" Then I should see "I am real: two"
Then I should see "Global: I am four glob" Then I should see "Global: I am four glob"
@ -102,7 +101,7 @@ Feature: Dynamic Pages
Then the file "fake3/one.html" should contain "I am real: one" Then the file "fake3/one.html" should contain "I am real: one"
Then the file "fake3/one.html" should contain "Global: I am three glob" Then the file "fake3/one.html" should contain "Global: I am three glob"
Then the file "fake3/one.html" should contain "All: I am all glob" Then the file "fake3/one.html" should contain "All: I am all glob"
Scenario: Target ignore Scenario: Target ignore
Given the Server is running at "dynamic-pages-app" Given the Server is running at "dynamic-pages-app"
When I go to "/target_ignore.html" When I go to "/target_ignore.html"
@ -113,7 +112,7 @@ Feature: Dynamic Pages
Then I should see "Ignore me! 7" Then I should see "Ignore me! 7"
When I go to "/target_ignore4.html" When I go to "/target_ignore4.html"
Then I should see "Ignore me! 8" Then I should see "Ignore me! 8"
Scenario: Preview ignored paths Scenario: Preview ignored paths
Given the Server is running at "dynamic-pages-app" Given the Server is running at "dynamic-pages-app"
When I go to "/should_be_ignored.html" When I go to "/should_be_ignored.html"
@ -131,6 +130,4 @@ Feature: Dynamic Pages
When I go to "/should_be_ignored7.html" When I go to "/should_be_ignored7.html"
Then I should see "File Not Found" Then I should see "File Not Found"
When I go to "/should_be_ignored8.html" When I go to "/should_be_ignored8.html"
Then I should see "File Not Found" Then I should see "File Not Found"
When I go to "/should_be_ignored9.html"
Then I should see "File Not Found"

View File

@ -1,28 +0,0 @@
# encoding: iso-8859-1
Feature: encoding option
Scenario: No encoding set
Given a fixture app "clean-app"
Given the Server is running at "clean-app"
When I go to "/index.html"
Then the "Content-Type" header should contain "text/html"
Then the "Content-Type" header should contain "charset=utf-8"
@wip
Scenario: Custom encoding set
Given a fixture app "i-8859-1-app"
And a file named "config.rb" with:
"""
set :encoding, "ISO-8859-1"
::Rack::Mime::MIME_TYPES['.html'] = 'text/html; charset=iso-8859-1'
::Rack::Mime::MIME_TYPES['.htm'] = 'text/html; charset=iso-8859-1'
::Rack::Mime::MIME_TYPES['.map'] = 'application/json; charset=iso-8859-1'
"""
Given the Server is running at "i-8859-1-app"
When I go to "/index.html"
Then the "Content-Type" header should contain "text/html"
Then the "Content-Type" header should contain "charset=iso-8859-1"
Then I should see "äöü"

View File

@ -1,10 +0,0 @@
Feature: Extension author could use some hooks
Scenario: When build
Given a fixture app "extension-api-deprecations-app"
When I run `middleman build`
Then the exit status should be 0
And the output should contain "`set :layout` is deprecated"
And the file "build/index.html" should contain "In Index"
And the file "build/index.html" should not contain "In Layout"

View File

@ -1,13 +0,0 @@
Feature: Extension author could use some hooks
Scenario: When build
Given a fixture app "extension-hooks-app"
When I run `middleman build`
Then the exit status should be 0
And the output should contain "/// after_configuration ///"
And the output should contain "/// ready ///"
And the output should contain "/// before_build ///"
And the output should contain "/// before ///"
And the output should contain "/// before_render ///"
And the output should contain "/// after_render ///"
And the output should contain "/// after_build ///"

View File

@ -0,0 +1,15 @@
Feature: Web Fonts
Scenario: Checking built folder for content
Given a successfully built app at "fonts-app"
When I cd to "build"
Then the following files should exist:
| stylesheets/fonts.css |
And the file "stylesheets/fonts.css" should contain "/fonts/StMarie-Thin.otf"
And the file "stylesheets/fonts.css" should contain "/fonts/blank/blank.otf"
Scenario: Rendering scss
Given the Server is running at "fonts-app"
When I go to "/stylesheets/fonts.css"
Then I should see "/fonts/StMarie-Thin.otf"
And I should see "/fonts/blank/blank.otf"

View File

@ -22,7 +22,7 @@ Feature: Neighboring YAML Front Matter
Then I should not see "---" Then I should not see "---"
When I go to "/raw-front-matter.php.frontmatter" When I go to "/raw-front-matter.php.frontmatter"
Then I should see "File Not Found" Then I should see "File Not Found"
Scenario: YAML not on first line, with encoding Scenario: YAML not on first line, with encoding
Given the Server is running at "frontmatter-neighbor-app" Given the Server is running at "frontmatter-neighbor-app"
When I go to "/front-matter-encoding.html" When I go to "/front-matter-encoding.html"
@ -30,12 +30,23 @@ Feature: Neighboring YAML Front Matter
Then I should not see "---" Then I should not see "---"
When I go to "/front-matter-encoding.html.erb.frontmatter" When I go to "/front-matter-encoding.html.erb.frontmatter"
Then I should see "File Not Found" Then I should see "File Not Found"
Scenario: Rendering html (json)
Given the Server is running at "frontmatter-neighbor-app"
When I go to "/json-front-matter.html.erb.frontmatter"
Then I should see "File Not Found"
When I go to "/json-front-matter-2.php"
Then I should see "<h1>This is the title</h1>"
Then I should see "<?php"
Then I should not see ";;;"
When I go to "/json-front-matter-2.php.erb.frontmatter"
Then I should see "File Not Found"
Scenario: A template changes frontmatter during preview Scenario: A template changes frontmatter during preview
Given the Server is running at "frontmatter-neighbor-app" Given the Server is running at "frontmatter-neighbor-app"
And the file "source/front-matter-change.html.erb" has the contents And the file "source/front-matter-change.html.erb" has the contents
""" """
FileA <%= current_page.data.title %> <%= current_page.data.title %>
""" """
And the file "source/front-matter-change.html.erb.frontmatter" has the contents And the file "source/front-matter-change.html.erb.frontmatter" has the contents
""" """
@ -43,8 +54,6 @@ Feature: Neighboring YAML Front Matter
title: Hello World title: Hello World
layout: false layout: false
--- ---
FileB
""" """
When I go to "/front-matter-change.html" When I go to "/front-matter-change.html"
Then I should see "Hello World" Then I should see "Hello World"
@ -54,8 +63,6 @@ Feature: Neighboring YAML Front Matter
title: Hola Mundo title: Hola Mundo
layout: false layout: false
--- ---
FileC
""" """
When I go to "/front-matter-change.html" When I go to "/front-matter-change.html"
Then I should see "Hola Mundo" Then I should see "Hola Mundo"
@ -129,23 +136,3 @@ Feature: Neighboring YAML Front Matter
Then I should see "Layout in use: Override" Then I should see "Layout in use: Override"
When I go to "/page_mentioned.html.erb.frontmatter" When I go to "/page_mentioned.html.erb.frontmatter"
Then I should see "File Not Found" Then I should see "File Not Found"
# Scenario: Neighbor frontmatter for destination of proxy resources
# Given the Server is running at "frontmatter-settings-neighbor-app"
# And the file "source/proxied_with_frontmatter.html.frontmatter" has the contents
# """
# ---
# title: Proxied title
# ---
# """
# And the file "source/ignored.html.erb" has the contents
# """
# ---
# ignored: true
# ---
# <%= current_resource.data.inspect %>
# <%= current_resource.data.title %>
# """
# When I go to "/proxied_with_frontmatter.html"
# Then I should see "Proxied title"

View File

@ -18,33 +18,39 @@ Feature: YAML Front Matter
Then I should see "<?php" Then I should see "<?php"
Then I should not see "---" Then I should not see "---"
Scenario: Rendering markdown (template-less) (yaml)
Given the Server is running at "frontmatter-app"
When I go to "/front-matter-pandoc.html"
Then I should see ">This is a document</h1>"
Then I should see "<p>To be or not to be</p>"
Then I should see "The meaning of life is 42"
Then I should not see "..."
Then I should not see "layout: false"
Then I should not see "title: Pandoc likes trailing dots..."
Scenario: Rendering Haml (yaml)
Given the Server is running at "frontmatter-app"
When I go to "/front-matter-haml.html"
Then I should see "<h1>This is the title</h1>"
Then I should not see "---"
Scenario: YAML not on first line, no encoding Scenario: YAML not on first line, no encoding
Given the Server is running at "frontmatter-app" Given the Server is running at "frontmatter-app"
When I go to "/front-matter-line-2.html" When I go to "/front-matter-line-2.html"
Then I should see "<h1></h1>" Then I should see "<h1></h1>"
Then I should see "---" Then I should see "---"
Scenario: YAML not on first line, with encoding Scenario: YAML not on first line, with encoding
Given the Server is running at "frontmatter-app" Given the Server is running at "frontmatter-app"
When I go to "/front-matter-encoding.html" When I go to "/front-matter-encoding.html"
Then I should see "<h1>This is the title</h1>" Then I should see "<h1>This is the title</h1>"
Then I should not see "---" Then I should not see "---"
Scenario: Rendering html (json)
Given the Server is running at "frontmatter-app"
When I go to "/json-front-matter.html"
Then I should see "<h1>This is the title</h1>"
Then I should not see ";;;"
When I go to "/json-front-matter-2.php"
Then I should see "<h1>This is the title</h1>"
Then I should see "<?php"
Then I should not see ";;;"
Scenario: JSON not on first line, no encoding
Given the Server is running at "frontmatter-app"
When I go to "/json-front-matter-line-2.html"
Then I should see "<h1></h1>"
Then I should see ";;;"
Scenario: JSON not on first line, with encoding
Given the Server is running at "frontmatter-app"
When I go to "/json-front-matter-encoding.html"
Then I should see "<h1>This is the title</h1>"
Then I should not see ";;;"
Scenario: A template changes frontmatter during preview Scenario: A template changes frontmatter during preview
Given the Server is running at "frontmatter-app" Given the Server is running at "frontmatter-app"

View File

@ -3,13 +3,14 @@ Feature: GZIP assets during build
Scenario: Built assets should be gzipped Scenario: Built assets should be gzipped
Given a successfully built app at "gzip-app" Given a successfully built app at "gzip-app"
Then the following files should exist: Then the following files should exist:
| build/index.html | | build/javascripts/test.js.gz |
| build/stylesheets/test.css.gz |
| build/index.html.gz | | build/index.html.gz |
| build/javascripts/test.js | | build/javascripts/test.js |
| build/javascripts/test.js.gz |
| build/stylesheets/test.css | | build/stylesheets/test.css |
| build/stylesheets/test.css.gz | | build/index.html |
And the file "build/javascripts/test.js.gz" should be gzipped When I run `file build/javascripts/test.js.gz`
Then the output should contain "gzip"
Scenario: Preview server doesn't change Scenario: Preview server doesn't change
Given the Server is running at "gzip-app" Given the Server is running at "gzip-app"
@ -17,35 +18,4 @@ Feature: GZIP assets during build
Then I should see "test_function" Then I should see "test_function"
When I go to "/stylesheets/test.css" When I go to "/stylesheets/test.css"
Then I should see "test_selector" Then I should see "test_selector"
Scenario: Only specified extensions should be gzipped
Given a fixture app "gzip-app"
And a file named "config.rb" with:
"""
activate :gzip, exts: %w(.htm .html .js .xhtml)
"""
And a successfully built app at "gzip-app"
Then the following files should exist:
| build/index.html |
| build/index.html.gz |
| build/javascripts/test.js |
| build/javascripts/test.js.gz |
| build/stylesheets/test.css |
And the following files should not exist:
| build/stylesheets/test.css.gz |
Scenario: Gzipped files are not produced for ignored paths
Given a fixture app "gzip-app"
And a file named "config.rb" with:
"""
activate :gzip, ignore: ['index.html', %r(javascripts/.*)]
"""
And a successfully built app at "gzip-app"
Then the following files should exist:
| build/index.html |
| build/javascripts/test.js |
| build/stylesheets/test.css |
| build/stylesheets/test.css.gz |
And the following files should not exist:
| build/index.html.gz |
| build/javascripts/test.js.gz |

View File

@ -6,11 +6,6 @@ Feature: Built-in auto_javascript_include_tag view helper
When I go to "/auto-js.html" When I go to "/auto-js.html"
Then I should see "javascripts/auto-js.js" Then I should see "javascripts/auto-js.js"
Scenario: Viewing the root path (directory index)
Given the Server is running at "auto-js-directory-index-app"
When I go to "/auto-js/index.html"
Then I should see "javascripts/auto-js.js"
Scenario: Viewing the root path (build mode) Scenario: Viewing the root path (build mode)
Given a successfully built app at "auto-js-app" Given a successfully built app at "auto-js-app"
When I cd to "build" When I cd to "build"

View File

@ -5,8 +5,8 @@ Feature: content_tag helper
And an empty file named "config.rb" And an empty file named "config.rb"
And a file named "source/index.html.erb" with: And a file named "source/index.html.erb" with:
""" """
<%= content_tag :div, "<hello>world</hello>", class: 'one' %> <%= content_tag :div, "<hello>world</hello>", :class => 'one' %>
<% content_tag :where, class: 'the hell is' do %> <% content_tag :where, :class => 'the hell is' do %>
<my>damn croissant</my> <my>damn croissant</my>
<% end %> <% end %>
""" """

View File

@ -5,16 +5,16 @@ Feature: form_tag helper
And an empty file named "config.rb" And an empty file named "config.rb"
And a file named "source/form_tag.html.erb" with: And a file named "source/form_tag.html.erb" with:
""" """
absolute: <% form_tag "/needs_index.html#absolute", relative: true do %> absolute: <% form_tag "/needs_index.html#absolute", :relative => true do %>
<% end %> <% end %>
relative: <% form_tag "needs_index.html#relative", relative: true do %> relative: <% form_tag "needs_index.html#relative", :relative => true do %>
<% end %> <% end %>
""" """
And a file named "source/form_tag/sub.html.erb" with: And a file named "source/form_tag/sub.html.erb" with:
""" """
absolute: <% form_tag "/needs_index.html#absolute", relative: true do %> absolute: <% form_tag "/needs_index.html#absolute", :relative => true do %>
<% end %> <% end %>
relative: <% form_tag "../needs_index.html#relative", relative: true do %> relative: <% form_tag "../needs_index.html#relative", :relative => true do %>
<% end %> <% end %>
""" """
And the Server is running at "indexable-app" And the Server is running at "indexable-app"

View File

@ -5,24 +5,6 @@ Feature: link_to helper
When I go to "/link_to_erb.html" When I go to "/link_to_erb.html"
Then I should see "erb <s>with html tags</s>" Then I should see "erb <s>with html tags</s>"
Scenario: link_to works with absolute URLs (where the relative part matches a local path)
Given a fixture app "link-to-app"
And a file named "config.rb" with:
"""
set :relative_links, true
"""
And a file named "source/test.html.erb" with:
"""
Hello
"""
And a file named "source/link_to_absolute.html.erb" with:
"""
<%= link_to "test", "http://google.com/test.html" %>
"""
And the Server is running at "link-to-app"
When I go to "/link_to_absolute.html"
Then I should see '<a href="http://google.com/test.html">test</a>'
Scenario: link_to works with blocks (slim) Scenario: link_to works with blocks (slim)
Given the Server is running at "link-to-app" Given the Server is running at "link-to-app"
When I go to "/link_to_slim.html" When I go to "/link_to_slim.html"
@ -38,31 +20,21 @@ Feature: link_to helper
And an empty file named "config.rb" And an empty file named "config.rb"
And a file named "source/link_to.html.erb" with: And a file named "source/link_to.html.erb" with:
""" """
absolute: <%= link_to "Needs Index", "/needs_index.html", relative: true %> absolute: <%= link_to "Needs Index", "/needs_index.html", :relative => true %>
relative: <%= link_to "Relative", "needs_index.html", relative: true %> relative: <%= link_to "Relative", "needs_index.html", :relative => true %>
absolute spaces: <%= link_to "Spaces Index", "/evil spaces.html", relative: true %>
relative spaces: <%= link_to "Spaces Relative", "evil spaces.html", relative: true %>
""" """
And a file named "source/link_to/sub.html.erb" with: And a file named "source/link_to/sub.html.erb" with:
""" """
absolute: <%= link_to "Needs Index", "/needs_index.html", relative: true %> absolute: <%= link_to "Needs Index", "/needs_index.html", :relative => true %>
relative: <%= link_to "Relative", "../needs_index.html", relative: true %> relative: <%= link_to "Relative", "../needs_index.html", :relative => true %>
absolute spaces: <%= link_to "Spaces Index", "/evil spaces.html", relative: true %>
relative spaces: <%= link_to "Spaces Relative", "../evil spaces.html", relative: true %>
""" """
And the Server is running at "indexable-app" And the Server is running at "indexable-app"
When I go to "/link_to.html" When I go to "/link_to.html"
Then I should see 'absolute: <a href="needs_index.html">Needs Index</a>' Then I should see 'absolute: <a href="needs_index.html">Needs Index</a>'
Then I should see 'relative: <a href="needs_index.html">Relative</a>' Then I should see 'relative: <a href="needs_index.html">Relative</a>'
Then I should see 'absolute spaces: <a href="evil%20spaces.html">Spaces Index</a>'
Then I should see 'relative spaces: <a href="evil%20spaces.html">Spaces Relative</a>'
When I go to "/link_to/sub.html" When I go to "/link_to/sub.html"
Then I should see 'absolute: <a href="../needs_index.html">Needs Index</a>' Then I should see 'absolute: <a href="../needs_index.html">Needs Index</a>'
Then I should see 'relative: <a href="../needs_index.html">Relative</a>' Then I should see 'relative: <a href="../needs_index.html">Relative</a>'
Then I should see 'absolute spaces: <a href="../evil%20spaces.html">Spaces Index</a>'
Then I should see 'relative spaces: <a href="../evil%20spaces.html">Spaces Relative</a>'
Scenario: link_to relative works with strip_index_file Scenario: link_to relative works with strip_index_file
Given a fixture app "indexable-app" Given a fixture app "indexable-app"
@ -107,7 +79,7 @@ Feature: link_to helper
And a file named "source/link_to.html.erb" with: And a file named "source/link_to.html.erb" with:
""" """
absolute: <%= link_to "Needs Index", "/needs_index.html" %> absolute: <%= link_to "Needs Index", "/needs_index.html" %>
relative: <%= link_to "Relative", "needs_index.html", relative: false %> relative: <%= link_to "Relative", "needs_index.html", :relative => false %>
unknown: <%= link_to "Unknown", "foo.html" %> unknown: <%= link_to "Unknown", "foo.html" %>
""" """
And a file named "source/link_to/sub.html.erb" with: And a file named "source/link_to/sub.html.erb" with:
@ -123,18 +95,18 @@ Feature: link_to helper
When I go to "/link_to/sub.html" When I go to "/link_to/sub.html"
Then I should see 'absolute: <a href="../needs_index.html">Needs Index</a>' Then I should see 'absolute: <a href="../needs_index.html">Needs Index</a>'
Then I should see 'relative: <a href="../needs_index.html">Relative</a>' Then I should see 'relative: <a href="../needs_index.html">Relative</a>'
Scenario: link_to knows about directory indexes Scenario: link_to knows about directory indexes
Given a fixture app "indexable-app" Given a fixture app "indexable-app"
And a file named "source/link_to.html.erb" with: And a file named "source/link_to.html.erb" with:
""" """
absolute: <%= link_to "Needs Index", "/needs_index.html", relative: true %> absolute: <%= link_to "Needs Index", "/needs_index.html", :relative => true %>
relative: <%= link_to "Relative", "needs_index.html", relative: true %> relative: <%= link_to "Relative", "needs_index.html", :relative => true %>
""" """
And a file named "source/link_to/sub.html.erb" with: And a file named "source/link_to/sub.html.erb" with:
""" """
absolute: <%= link_to "Needs Index", "/needs_index.html", relative: true %> absolute: <%= link_to "Needs Index", "/needs_index.html", :relative => true %>
relative: <%= link_to "Relative", "../needs_index.html", relative: true %> relative: <%= link_to "Relative", "../needs_index.html", :relative => true %>
""" """
And the Server is running at "indexable-app" And the Server is running at "indexable-app"
When I go to "/link_to/" When I go to "/link_to/"
@ -186,8 +158,8 @@ Feature: link_to helper
Given a fixture app "indexable-app" Given a fixture app "indexable-app"
And a file named "source/link_to.html.erb" with: And a file named "source/link_to.html.erb" with:
""" """
<%= link_to "Needs Index String", "/needs_index.html", query: "foo" %> <%= link_to "Needs Index String", "/needs_index.html", :query => "foo" %>
<%= link_to "Needs Index Hash", "/needs_index.html", query: { foo: :bar } %> <%= link_to "Needs Index Hash", "/needs_index.html", :query => { :foo => :bar } %>
""" """
And the Server is running at "indexable-app" And the Server is running at "indexable-app"
When I go to "/link_to/" When I go to "/link_to/"

View File

@ -9,9 +9,11 @@ Feature: select_tag helper
""" """
And the Server is running at "indexable-app" And the Server is running at "indexable-app"
When I go to "/select_tag.html" When I go to "/select_tag.html"
Then I should see '<select name="colors"' Then I should see:
Then I should see '<option value="">Choose a color</option>' """
Then I should see '<option value="red">red</option>' <select name="colors" include_blank="Choose a color"><option value="">Choose a color</option>
Then I should see '<option value="blue">blue</option>' <option value="red">red</option>
Then I should see '<option value="blorange">blorange</option>' <option value="blue">blue</option>
Then I should see '</select>' <option value="blorange">blorange</option>
</select>
"""

View File

@ -5,13 +5,13 @@ Feature: url_for helper
And an empty file named "config.rb" And an empty file named "config.rb"
And a file named "source/url_for.html.erb" with: And a file named "source/url_for.html.erb" with:
""" """
absolute: <%= url_for "/needs_index.html", relative: true %> absolute: <%= url_for "/needs_index.html", :relative => true %>
relative: <%= url_for "needs_index.html", relative: true %> relative: <%= url_for "needs_index.html", :relative => true %>
""" """
And a file named "source/url_for/sub.html.erb" with: And a file named "source/url_for/sub.html.erb" with:
""" """
absolute: <%= url_for "/needs_index.html", relative: true %> absolute: <%= url_for "/needs_index.html", :relative => true %>
relative: <%= url_for "../needs_index.html", relative: true %> relative: <%= url_for "../needs_index.html", :relative => true %>
""" """
And the Server is running at "indexable-app" And the Server is running at "indexable-app"
When I go to "/url_for.html" When I go to "/url_for.html"
@ -64,7 +64,7 @@ Feature: url_for helper
And a file named "source/url_for.html.erb" with: And a file named "source/url_for.html.erb" with:
""" """
absolute: <%= url_for "/needs_index.html" %> absolute: <%= url_for "/needs_index.html" %>
relative: <%= url_for "needs_index.html", relative: false %> relative: <%= url_for "needs_index.html", :relative => false %>
unknown: <%= url_for "foo.html" %> unknown: <%= url_for "foo.html" %>
""" """
And a file named "source/url_for/sub.html.erb" with: And a file named "source/url_for/sub.html.erb" with:
@ -85,13 +85,13 @@ Feature: url_for helper
Given a fixture app "indexable-app" Given a fixture app "indexable-app"
And a file named "source/url_for.html.erb" with: And a file named "source/url_for.html.erb" with:
""" """
absolute: <%= url_for "/needs_index.html", relative: true %> absolute: <%= url_for "/needs_index.html", :relative => true %>
relative: <%= url_for "needs_index.html", relative: true %> relative: <%= url_for "needs_index.html", :relative => true %>
""" """
And a file named "source/url_for/sub.html.erb" with: And a file named "source/url_for/sub.html.erb" with:
""" """
absolute: <%= url_for "/needs_index.html", relative: true %> absolute: <%= url_for "/needs_index.html", :relative => true %>
relative: <%= url_for "../needs_index.html", relative: true %> relative: <%= url_for "../needs_index.html", :relative => true %>
""" """
And the Server is running at "indexable-app" And the Server is running at "indexable-app"
When I go to "/url_for/" When I go to "/url_for/"
@ -143,8 +143,8 @@ Feature: url_for helper
Given a fixture app "indexable-app" Given a fixture app "indexable-app"
And a file named "source/url_for.html.erb" with: And a file named "source/url_for.html.erb" with:
""" """
Needs Index String <%= url_for "/needs_index.html", query: "foo" %> Needs Index String <%= url_for "/needs_index.html", :query => "foo" %>
Needs Index Hash <%= url_for "/needs_index.html", query: { foo: :bar } %> Needs Index Hash <%= url_for "/needs_index.html", :query => { :foo => :bar } %>
""" """
And the Server is running at "indexable-app" And the Server is running at "indexable-app"
When I go to "/url_for/" When I go to "/url_for/"

View File

@ -1,209 +0,0 @@
Feature: i18n Paths
Scenario: link_to is i18n aware
Given a fixture app "empty-app"
And a file named "data/pages.yml" with:
"""
- hello.html
"""
And a file named "locales/en.yml" with:
"""
---
en:
msg: Hello
home: Home
"""
And a file named "locales/es.yml" with:
"""
---
es:
paths:
hello: "hola"
msg: Hola
home: Casa
"""
And a file named "source/localizable/index.html.erb" with:
"""
Page: <%= t(:hom) %>
"""
And a file named "source/localizable/hello.html.erb" with:
"""
Page: <%= t(:msg) %>
<%= link_to "Current Home", "/index.html", class: 'current' %>
<%= link_to "Other Home", "/index.html", title: "Other Home", locale: ::I18n.locale == :en ? :es : :en %>
<% link_to "/index.html", class: 'current' do %><span>Home: Current Block</span><% end %>
<% link_to "/index.html", title: "Other Home", locale: ::I18n.locale == :en ? :es : :en do %><span>Home: Other Block</span><% end %>
<% data.pages.each_with_index do |p, i| %>
<%= link_to "Current #{p}", "/#{p}", class: 'current' %>
<%= link_to "Other #{p}", "/#{p}", title: "Other #{p}", locale: ::I18n.locale == :en ? :es : :en %>
<% link_to "/#{p}", class: 'current' do %><span>Current Block</span><% end %>
<% link_to "/#{p}", title: "Other #{p}", locale: ::I18n.locale == :en ? :es : :en do %><span>Other Block</span><% end %>
<% end %>
"""
And a file named "config.rb" with:
"""
set :strip_index_file, false
activate :i18n, mount_at_root: :en
"""
Given the Server is running at "empty-app"
When I go to "/hello.html"
Then I should see "Page: Hello"
Then I should see '<a href="/index.html" class="current">Current Home</a>'
Then I should see '<a href="/es/index.html" title="Other Home">Other Home</a>'
Then I should see '<a href="/index.html" class="current"><span>Home: Current Block</span></a>'
Then I should see '<a href="/es/index.html" title="Other Home"><span>Home: Other Block</span></a>'
Then I should see '<a href="/hello.html" class="current">Current hello.html</a>'
Then I should see '<a href="/es/hola.html" title="Other hello.html">Other hello.html</a>'
Then I should see '<a href="/hello.html" class="current"><span>Current Block</span></a>'
Then I should see '<a href="/es/hola.html" title="Other hello.html"><span>Other Block</span></a>'
When I go to "/es/hola.html"
Then I should see "Page: Hola"
Then I should see '<a href="/es/index.html" class="current">Current Home</a>'
Then I should see '<a href="/index.html" title="Other Home">Other Home</a>'
Then I should see '<a href="/es/index.html" class="current"><span>Home: Current Block</span></a>'
Then I should see '<a href="/index.html" title="Other Home"><span>Home: Other Block</span></a>'
Then I should see '<a href="/es/hola.html" class="current">Current hello.html</a>'
Then I should see '<a href="/hello.html" title="Other hello.html">Other hello.html</a>'
Then I should see '<a href="/es/hola.html" class="current"><span>Current Block</span></a>'
Then I should see '<a href="/hello.html" title="Other hello.html"><span>Other Block</span></a>'
Scenario: link_to is i18n aware and supports relative_links
Given a fixture app "empty-app"
And a file named "locales/en.yml" with:
"""
---
en:
msg: Hello
home: Home
"""
And a file named "locales/es.yml" with:
"""
---
es:
paths:
hello: "hola"
msg: Hola
home: Casa
"""
And a file named "source/assets/css/main.css.scss" with:
"""
$color: red;
body { background: $color; }
"""
And a file named "source/localizable/index.html.erb" with:
"""
Page: <%= t(:home) %>
<%= stylesheet_link_tag :main %>
"""
And a file named "source/localizable/hello.html.erb" with:
"""
Page: <%= t(:msg) %>
<%= link_to "Current Home", "/index.html", class: 'current' %>
<%= link_to "Other Home", "/index.html", title: "Other Home", locale: ::I18n.locale == :en ? :es : :en %>
<% link_to "/index.html", class: 'current' do %><span>Home: Current Block</span><% end %>
<% link_to "/index.html", title: "Other Home", locale: ::I18n.locale == :en ? :es : :en do %><span>Home: Other Block</span><% end %>
<%= link_to "Current hello.html", "/hello.html", class: 'current' %>
<%= link_to "Other hello.html", "/hello.html", title: "Other hello.html", locale: ::I18n.locale == :en ? :es : :en %>
<% link_to "/hello.html", class: 'current' do %><span>Current Block</span><% end %>
<% link_to "/hello.html", title: "Other hello.html", locale: ::I18n.locale == :en ? :es : :en do %><span>Other Block</span><% end %>
"""
And a file named "config.rb" with:
"""
set :css_dir, 'assets/css'
set :relative_links, true
set :strip_index_file, false
activate :i18n, mount_at_root: :en
activate :relative_assets
"""
Given the Server is running at "empty-app"
When I go to "/index.html"
Then I should see "assets/css/main.css"
When I go to "/hello.html"
Then I should see "Page: Hello"
Then I should see '<a href="index.html" class="current">Current Home</a>'
Then I should see '<a href="es/index.html" title="Other Home">Other Home</a>'
Then I should see '<a href="index.html" class="current"><span>Home: Current Block</span></a>'
Then I should see '<a href="es/index.html" title="Other Home"><span>Home: Other Block</span></a>'
Then I should see '<a href="hello.html" class="current">Current hello.html</a>'
Then I should see '<a href="es/hola.html" title="Other hello.html">Other hello.html</a>'
Then I should see '<a href="hello.html" class="current"><span>Current Block</span></a>'
Then I should see '<a href="es/hola.html" title="Other hello.html"><span>Other Block</span></a>'
When I go to "/es/hola.html"
Then I should see "Page: Hola"
Then I should see '<a href="index.html" class="current">Current Home</a>'
Then I should see '<a href="../index.html" title="Other Home">Other Home</a>'
Then I should see '<a href="index.html" class="current"><span>Home: Current Block</span></a>'
Then I should see '<a href="../index.html" title="Other Home"><span>Home: Other Block</span></a>'
Then I should see '<a href="hola.html" class="current">Current hello.html</a>'
Then I should see '<a href="../hello.html" title="Other hello.html">Other hello.html</a>'
Then I should see '<a href="hola.html" class="current"><span>Current Block</span></a>'
Then I should see '<a href="../hello.html" title="Other hello.html"><span>Other Block</span></a>'
Scenario: url_for is i18n aware
Given a fixture app "empty-app"
And a file named "data/pages.yml" with:
"""
- hello.html
- article.html
"""
And a file named "locales/en.yml" with:
"""
---
en:
msg: Hello
"""
And a file named "locales/es.yml" with:
"""
---
es:
paths:
hello: "hola"
msg: Hola
"""
And a file named "source/localizable/hello.html.erb" with:
"""
Page: <%= t(:msg) %>
<% data.pages.each_with_index do |p, i| %>
Current: <%= url_for "/#{p}" %>
Other: <%= url_for "/#{p}", locale: ::I18n.locale == :en ? :es : :en %>
<% end %>
"""
And a file named "source/localizable/article.html.erb" with:
"""
Page Lang: Default
Current: <%= url_for "/article.html" %>
Other: <%= url_for "/article.html", locale: ::I18n.locale == :en ? :es : :en %>
"""
And a file named "source/localizable/article.es.html.erb" with:
"""
Page Lang: Spanish
Current: <%= url_for "/article.html" %>
Other: <%= url_for "/article.html", locale: :en %>
"""
And a file named "config.rb" with:
"""
activate :i18n, mount_at_root: :en
"""
Given the Server is running at "empty-app"
When I go to "/hello.html"
Then I should see "Page: Hello"
Then I should see 'Current: /hello.html'
Then I should see 'Other: /es/hola.html'
When I go to "/es/hola.html"
Then I should see "Page: Hola"
Then I should see 'Current: /es/hola.html'
Then I should see 'Other: /hello.html'
When I go to "/article.html"
Then I should see "Page Lang: Default"
Then I should see 'Current: /article.html'
Then I should see 'Other: /es/article.html'
When I go to "/es/article.html"
Then I should see "Page Lang: Spanish"
Then I should see 'Current: /es/article.html'
Then I should see 'Other: /article.html'

View File

@ -1,39 +0,0 @@
Feature: i18n merging path trees
Scenario: Mixing localized and non-localized sources and merging the path trees (see issue #1709)
Given a fixture app "i18n-test-app"
And a file named "config.rb" with:
"""
activate :i18n, mount_at_root: :en, langs: [:en, :es]
"""
Given the Server is running at "i18n-mixed-sources"
When I go to "/"
Then I should see "Current locale: en"
Then I should see "path: is-localized Home"
When I go to "/es"
Then I should see "Current locale: es"
Then I should see "path: is-localized Home"
When I go to "/a/"
Then I should see "Current locale: en"
Then I should see "path: is-localized Home # a/index.html.erb"
When I go to "/es/a/"
Then I should see "Current locale: es"
Then I should see "path: is-localized Home # a/index.html.erb"
When I go to "/b/"
Then I should see "Current locale: en"
Then I should see "path: is-localized Home # b/index.html.erb"
When I go to "/a/sub.html"
Then I should see "Current locale: en"
Then I should see "path: is-localized Home # a/index.html.erb # a/sub.html.erb"
When I go to "/b/sub.html"
Then I should see "Current locale: en"
Then I should see "path: is-localized Home # b/index.html.erb # b/sub.html.erb"
When I go to "/es/b/sub.html"
Then I should see "Current locale: es"
Then I should see "path: is-localized Home # b/index.html.erb # b/sub.html.erb"

View File

@ -1,23 +0,0 @@
Feature: i18n Partials
Scenario: Running localize with the default config
Given a fixture app "i18n-test-app"
And a file named "config.rb" with:
"""
activate :i18n
"""
Given the Server is running at "i18n-test-app"
When I go to "/partials/index.html"
Then I should see "Country: USA"
Then I should see "State: District of Columbia"
Then I should see "Greeting: Hello"
Then I should see "Site: Locale Site"
Then I should see "Flag: stars"
Then I should see "President: obama"
When I go to "/es/partials/index.html"
Then I should see "Country: Mexico"
Then I should see "State: Distrito Federal"
Then I should see "Greeting: Hola"
Then I should see "Site: Locale Site"
Then I should see "Flag: bars"
Then I should see "President: nieto"

View File

@ -1,13 +1,13 @@
Feature: i18n Builder Feature: i18n v3 Builder
In order to preview localized html In order to preview localized html
Scenario: Running localize with the default config Scenario: Running localize with the default config
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n activate :i18n_v3
""" """
Given a successfully built app at "i18n-test-app" Given a successfully built app at "i18n-v3-test-app"
When I cd to "build" When I cd to "build"
Then the following files should exist: Then the following files should exist:
| index.html | | index.html |
@ -46,12 +46,12 @@ Feature: i18n Builder
And the file "password.txt" should contain "hunter2" And the file "password.txt" should contain "hunter2"
Scenario: Running localize with the alt path config Scenario: Running localize with the alt path config
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, path: "/lang_:locale/" activate :i18n_v3, :path => "/lang_:locale/"
""" """
Given a successfully built app at "i18n-test-app" Given a successfully built app at "i18n-v3-test-app"
When I cd to "build" When I cd to "build"
Then the following files should exist: Then the following files should exist:
| index.html | | index.html |
@ -66,12 +66,12 @@ Feature: i18n Builder
And the file "lang_es/hola.html" should contain "Hola World" And the file "lang_es/hola.html" should contain "Hola World"
Scenario: Running localize with the alt root config Scenario: Running localize with the alt root config
Given a fixture app "i18n-alt-root-app" Given a fixture app "i18n-v3-alt-root-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, templates_dir: "lang_data" activate :i18n_v3, :templates_dir => "lang_data"
""" """
Given a successfully built app at "i18n-alt-root-app" Given a successfully built app at "i18n-v3-alt-root-app"
When I cd to "build" When I cd to "build"
Then the following files should exist: Then the following files should exist:
| index.html | | index.html |
@ -86,12 +86,12 @@ Feature: i18n Builder
And the file "es/hola.html" should contain "Hola World" And the file "es/hola.html" should contain "Hola World"
Scenario: Running localize with the lang map config Scenario: Running localize with the lang map config
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, lang_map: { en: :english, es: :spanish } activate :i18n_v3, :lang_map => { :en => :english, :es => :spanish }
""" """
Given a successfully built app at "i18n-test-app" Given a successfully built app at "i18n-v3-test-app"
When I cd to "build" When I cd to "build"
Then the following files should exist: Then the following files should exist:
| index.html | | index.html |
@ -106,12 +106,12 @@ Feature: i18n Builder
And the file "spanish/hola.html" should contain "Hola World" And the file "spanish/hola.html" should contain "Hola World"
Scenario: Running localize with the no mount config Scenario: Running localize with the no mount config
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, mount_at_root: false activate :i18n_v3, :mount_at_root => false
""" """
Given a successfully built app at "i18n-test-app" Given a successfully built app at "i18n-v3-test-app"
When I cd to "build" When I cd to "build"
Then the following files should exist: Then the following files should exist:
| en/index.html | | en/index.html |
@ -127,12 +127,12 @@ Feature: i18n Builder
And the file "es/hola.html" should contain "Hola World" And the file "es/hola.html" should contain "Hola World"
Scenario: Running localize with the subset config Scenario: Running localize with the subset config
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, langs: [:en] activate :i18n_v3, :langs => [:en]
""" """
Given a successfully built app at "i18n-test-app" Given a successfully built app at "i18n-v3-test-app"
When I cd to "build" When I cd to "build"
Then the following files should exist: Then the following files should exist:
| index.html | | index.html |
@ -145,13 +145,13 @@ Feature: i18n Builder
And the file "hello.html" should contain "Hello World" And the file "hello.html" should contain "Hello World"
Scenario: Running localize with relative_assets Scenario: Running localize with relative_assets
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n activate :i18n_v3
activate :relative_assets activate :relative_assets
""" """
Given a successfully built app at "i18n-test-app" Given a successfully built app at "i18n-v3-test-app"
When I cd to "build" When I cd to "build"
Then the following files should exist: Then the following files should exist:
| index.html | | index.html |

View File

@ -1,7 +1,7 @@
Feature: i18n manually setting locale Feature: i18n v3 manually setting locale
Scenario: Setting I18n.locale in a block (see issue #809) or with the :lang option Scenario: Setting I18n.locale in a block (see issue #809) or with the :lang option
Given the Server is running at "i18n-force-locale" Given the Server is running at "i18n-v3-force-locale"
When I go to "/en/index.html" When I go to "/en/index.html"
Then I should see "Hello" Then I should see "Hello"
Then I should see "I18n.locale: en" Then I should see "I18n.locale: en"

View File

@ -0,0 +1,252 @@
Feature: i18n v3 Preview
In order to preview localized html
Scenario: Running localize with the default config
Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with:
"""
activate :i18n_v3
"""
Given the Server is running at "i18n-v3-test-app"
When I go to "/"
Then I should see "Howdy"
When I go to "/hello.html"
Then I should see "Hello World"
When I go to "/morning.html"
Then I should see "Good morning"
When I go to "/one.html"
Then I should see "Only one"
When I go to "/defaults_en/index.html"
Then I should see "File Not Found"
When I go to "/en/index.html"
Then I should see "File Not Found"
When I go to "/en/morning.html"
Then I should see "File Not Found"
When I go to "/defaults_es/index.html"
Then I should see "File Not Found"
When I go to "/es/index.html"
Then I should see "Como Esta?"
When I go to "/es/hola.html"
Then I should see "Hola World"
When I go to "/es/manana.html"
Then I should see "Buenos días"
When I go to "/es/una.html"
Then I should see "Solamente una"
Scenario: A template changes i18n during preview
Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with:
"""
activate :i18n_v3
"""
Given the Server is running at "i18n-v3-test-app"
And the file "locales/en.yml" has the contents
"""
---
en:
greetings: "Howdy"
hi: "Hello"
"""
When I go to "/"
Then I should see "Howdy"
When I go to "/hello.html"
Then I should see "Hello World"
When the file "locales/en.yml" has the contents
"""
---
en:
greetings: "How You Doin"
hi: "Sup"
"""
When I go to "/"
Then I should see "How You Doin"
When I go to "/hello.html"
Then I should see "Sup World"
Scenario: Running localize with the alt path config
Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with:
"""
activate :i18n_v3, :path => "/lang_:locale/"
"""
Given the Server is running at "i18n-v3-test-app"
When I go to "/"
Then I should see "Howdy"
When I go to "/hello.html"
Then I should see "Hello World"
When I go to "/lang_en/index.html"
Then I should see "File Not Found"
When I go to "/lang_es/index.html"
Then I should see "Como Esta?"
When I go to "/lang_es/hola.html"
Then I should see "Hola World"
Scenario: Running localize with the alt root config
Given a fixture app "i18n-v3-alt-root-app"
And a file named "config.rb" with:
"""
activate :i18n_v3, :templates_dir => "lang_data"
"""
Given the Server is running at "i18n-v3-alt-root-app"
When I go to "/"
Then I should see "Howdy"
When I go to "/hello.html"
Then I should see "Hello World"
When I go to "/en/index.html"
Then I should see "File Not Found"
When I go to "/es/index.html"
Then I should see "Como Esta?"
When I go to "/es/hola.html"
Then I should see "Hola World"
Scenario: Running localize with the lang map config
Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with:
"""
activate :i18n_v3, :lang_map => { :en => :english, :es => :spanish }
"""
Given the Server is running at "i18n-v3-test-app"
When I go to "/"
Then I should see "Howdy"
When I go to "/hello.html"
Then I should see "Hello World"
When I go to "/english/index.html"
Then I should see "File Not Found"
When I go to "/spanish/index.html"
Then I should see "Como Esta?"
When I go to "/spanish/hola.html"
Then I should see "Hola World"
Scenario: Running localize with a non-English mount config
Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with:
"""
activate :i18n_v3, :mount_at_root => :es
"""
Given the Server is running at "i18n-v3-test-app"
When I go to "/en/index.html"
Then I should see "Howdy"
When I go to "/en/hello.html"
Then I should see "Hello World"
When I go to "/"
Then I should see "Como Esta?"
When I go to "/hola.html"
Then I should see "Hola World"
When I go to "/manana.html"
Then I should see "Buenos días"
When I go to "/hello.html"
Then I should see "File Not Found"
When I go to "/en/morning.html"
Then I should see "Good morning"
When I go to "/es/manana.html"
Then I should see "File Not Found"
When I go to "/es/index.html"
Then I should see "File Not Found"
When I go to "/es/hola.html"
Then I should see "File Not Found"
Scenario: Running localize with a non-English lang subset
Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with:
"""
activate :i18n_v3, :langs => :es
"""
Given the Server is running at "i18n-v3-test-app"
When I go to "/en/index.html"
Then I should see "File Not Found"
When I go to "/en/hello.html"
Then I should see "File Not Found"
When I go to "/"
Then I should see "Como Esta?"
When I go to "/hola.html"
Then I should see "Hola World"
When I go to "/hello.html"
Then I should see "File Not Found"
When I go to "/es/index.html"
Then I should see "File Not Found"
When I go to "/es/hola.html"
Then I should see "File Not Found"
Scenario: Running localize with the no mount config
Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with:
"""
activate :i18n_v3, :mount_at_root => false
"""
Given the Server is running at "i18n-v3-test-app"
When I go to "/en/index.html"
Then I should see "Howdy"
When I go to "/en/hello.html"
Then I should see "Hello World"
When I go to "/"
Then I should see "File Not Found"
When I go to "/hello.html"
Then I should see "File Not Found"
When I go to "/es/index.html"
Then I should see "Como Esta?"
When I go to "/es/hola.html"
Then I should see "Hola World"
Scenario: Running localize with the subset config
Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with:
"""
activate :i18n_v3, :langs => [:en]
"""
Given the Server is running at "i18n-v3-test-app"
When I go to "/"
Then I should see "Howdy"
When I go to "/hello.html"
Then I should see "Hello World"
When I go to "/en/index.html"
Then I should see "File Not Found"
When I go to "/es/index.html"
Then I should see "File Not Found"
When I go to "/es/hola.html"
Then I should see "File Not Found"
Scenario: Running localize with relative_assets
Given a fixture app "i18n-v3-test-app"
And a file named "config.rb" with:
"""
activate :i18n_v3
activate :relative_assets
"""
Given the Server is running at "i18n-v3-test-app"
When I go to "/"
Then I should see '"stylesheets/site.css"'
When I go to "/hello.html"
Then I should see '"stylesheets/site.css"'
When I go to "/es/index.html"
Then I should see '"../stylesheets/site.css"'
When I go to "/es/hola.html"
Then I should see '"../stylesheets/site.css"'
Scenario: Missing translations fall back to the default locale
Given a fixture app "i18n-v3-default-app"
And a file named "config.rb" with:
"""
activate :i18n_v3, :mount_at_root => :es
"""
Given the Server is running at "i18n-v3-default-app"
When I go to "/en/"
Then I should see "Default locale: es"
Then I should see "Current locale: en"
Then I should see "Buenos días"
Then I should see "Howdy"
Scenario: Nested i18n yaml
Given a fixture app "i18n-v3-nested-app"
And a file named "config.rb" with:
"""
activate :i18n_v3
"""
Given the Server is running at "i18n-v3-nested-app"
When I go to "/"
Then I should see "Howdy"
Then I should see "More"
When I go to "/es/"
Then I should see "Como Esta?"
Then I should see "Mucho"

View File

@ -1,13 +1,14 @@
Feature: i18n Preview @wip
Feature: i18n v4 Preview
In order to preview localized html In order to preview localized html
Scenario: Running localize with the default config Scenario: Running localize with the default config
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v4-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n activate :i18n
""" """
Given the Server is running at "i18n-test-app" Given the Server is running at "i18n-v4-test-app"
When I go to "/" When I go to "/"
Then I should see "Howdy" Then I should see "Howdy"
When I go to "/hello.html" When I go to "/hello.html"
@ -34,12 +35,12 @@ Feature: i18n Preview
Then I should see "Solamente una" Then I should see "Solamente una"
Scenario: A template changes i18n during preview Scenario: A template changes i18n during preview
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v4-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n activate :i18n
""" """
Given the Server is running at "i18n-test-app" Given the Server is running at "i18n-v4-test-app"
And the file "locales/en.yml" has the contents And the file "locales/en.yml" has the contents
""" """
--- ---
@ -64,12 +65,12 @@ Feature: i18n Preview
Then I should see "Sup World" Then I should see "Sup World"
Scenario: Running localize with the alt path config Scenario: Running localize with the alt path config
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v4-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, path: "/lang_:locale/" activate :i18n, :path => "/lang_:locale/"
""" """
Given the Server is running at "i18n-test-app" Given the Server is running at "i18n-v4-test-app"
When I go to "/" When I go to "/"
Then I should see "Howdy" Then I should see "Howdy"
When I go to "/hello.html" When I go to "/hello.html"
@ -83,12 +84,12 @@ Feature: i18n Preview
Scenario: Running localize with the alt root config Scenario: Running localize with the alt root config
Given a fixture app "i18n-alt-root-app" Given a fixture app "i18n-v4-alt-root-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, templates_dir: "lang_data" activate :i18n, :templates_dir => "lang_data"
""" """
Given the Server is running at "i18n-alt-root-app" Given the Server is running at "i18n-v4-alt-root-app"
When I go to "/" When I go to "/"
Then I should see "Howdy" Then I should see "Howdy"
When I go to "/hello.html" When I go to "/hello.html"
@ -101,12 +102,12 @@ Feature: i18n Preview
Then I should see "Hola World" Then I should see "Hola World"
Scenario: Running localize with the lang map config Scenario: Running localize with the lang map config
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v4-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, lang_map: { en: :english, es: :spanish } activate :i18n, :lang_map => { :en => :english, :es => :spanish }
""" """
Given the Server is running at "i18n-test-app" Given the Server is running at "i18n-v4-test-app"
When I go to "/" When I go to "/"
Then I should see "Howdy" Then I should see "Howdy"
When I go to "/hello.html" When I go to "/hello.html"
@ -119,12 +120,12 @@ Feature: i18n Preview
Then I should see "Hola World" Then I should see "Hola World"
Scenario: Running localize with a non-English mount config Scenario: Running localize with a non-English mount config
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v4-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, mount_at_root: :es activate :i18n, :mount_at_root => :es
""" """
Given the Server is running at "i18n-test-app" Given the Server is running at "i18n-v4-test-app"
When I go to "/en/index.html" When I go to "/en/index.html"
Then I should see "Howdy" Then I should see "Howdy"
When I go to "/en/hello.html" When I go to "/en/hello.html"
@ -147,12 +148,12 @@ Feature: i18n Preview
Then I should see "File Not Found" Then I should see "File Not Found"
Scenario: Running localize with a non-English lang subset Scenario: Running localize with a non-English lang subset
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v4-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, langs: :es activate :i18n, :langs => :es
""" """
Given the Server is running at "i18n-test-app" Given the Server is running at "i18n-v4-test-app"
When I go to "/en/index.html" When I go to "/en/index.html"
Then I should see "File Not Found" Then I should see "File Not Found"
When I go to "/en/hello.html" When I go to "/en/hello.html"
@ -170,12 +171,12 @@ Feature: i18n Preview
Scenario: Running localize with the no mount config Scenario: Running localize with the no mount config
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v4-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, mount_at_root: false activate :i18n, :mount_at_root => false
""" """
Given the Server is running at "i18n-test-app" Given the Server is running at "i18n-v4-test-app"
When I go to "/en/index.html" When I go to "/en/index.html"
Then I should see "Howdy" Then I should see "Howdy"
When I go to "/en/hello.html" When I go to "/en/hello.html"
@ -190,12 +191,12 @@ Feature: i18n Preview
Then I should see "Hola World" Then I should see "Hola World"
Scenario: Running localize with the subset config Scenario: Running localize with the subset config
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v4-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, langs: [:en] activate :i18n, :langs => [:en]
""" """
Given the Server is running at "i18n-test-app" Given the Server is running at "i18n-v4-test-app"
When I go to "/" When I go to "/"
Then I should see "Howdy" Then I should see "Howdy"
When I go to "/hello.html" When I go to "/hello.html"
@ -208,13 +209,13 @@ Feature: i18n Preview
Then I should see "File Not Found" Then I should see "File Not Found"
Scenario: Running localize with relative_assets Scenario: Running localize with relative_assets
Given a fixture app "i18n-test-app" Given a fixture app "i18n-v4-test-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n activate :i18n
activate :relative_assets activate :relative_assets
""" """
Given the Server is running at "i18n-test-app" Given the Server is running at "i18n-v4-test-app"
When I go to "/" When I go to "/"
Then I should see '"stylesheets/site.css"' Then I should see '"stylesheets/site.css"'
When I go to "/hello.html" When I go to "/hello.html"
@ -225,12 +226,12 @@ Feature: i18n Preview
Then I should see '"../stylesheets/site.css"' Then I should see '"../stylesheets/site.css"'
Scenario: Missing translations fall back to the default locale Scenario: Missing translations fall back to the default locale
Given a fixture app "i18n-default-app" Given a fixture app "i18n-v4-default-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n, mount_at_root: :es activate :i18n, :mount_at_root => :es
""" """
Given the Server is running at "i18n-default-app" Given the Server is running at "i18n-v4-default-app"
When I go to "/en/" When I go to "/en/"
Then I should see "Default locale: es" Then I should see "Default locale: es"
Then I should see "Current locale: en" Then I should see "Current locale: en"
@ -238,12 +239,12 @@ Feature: i18n Preview
Then I should see "Howdy" Then I should see "Howdy"
Scenario: Nested i18n yaml Scenario: Nested i18n yaml
Given a fixture app "i18n-nested-app" Given a fixture app "i18n-v4-nested-app"
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
activate :i18n activate :i18n
""" """
Given the Server is running at "i18n-nested-app" Given the Server is running at "i18n-v4-nested-app"
When I go to "/" When I go to "/"
Then I should see "Howdy" Then I should see "Howdy"
Then I should see "More" Then I should see "More"

View File

@ -12,7 +12,7 @@ Feature: Ignoring paths
And the following files should not exist: And the following files should not exist:
| build/plain.html | | build/plain.html |
| build/about.html | | build/about.html |
Scenario: Ignore a single path (server) Scenario: Ignore a single path (server)
Given a fixture app "ignore-app" Given a fixture app "ignore-app"
And a file named "config.rb" with: And a file named "config.rb" with:
@ -28,35 +28,6 @@ Feature: Ignoring paths
When I go to "/about.html" When I go to "/about.html"
Then I should see "File Not Found" Then I should see "File Not Found"
Scenario: Ignoring collected values
Given a fixture app "ignore-app"
And a file named "data/ignores.yaml" with:
"""
---
- "plain"
"""
And a file named "config.rb" with:
"""
data.ignores.each do |name|
ignore "#{name}.html"
end
"""
And the Server is running
When I go to "/plain.html"
Then I should see "File Not Found"
When I go to "/about.html"
Then I should not see "File Not Found"
When the file "data/ignores.yaml" has the contents
"""
---
- "about"
"""
When I go to "/plain.html"
Then I should not see "File Not Found"
When I go to "/about.html"
Then I should see "File Not Found"
Scenario: Ignore a globbed path (build) Scenario: Ignore a globbed path (build)
Given a fixture app "ignore-app" Given a fixture app "ignore-app"
And a file named "config.rb" with: And a file named "config.rb" with:
@ -76,7 +47,7 @@ Feature: Ignoring paths
| build/reports/index.html | | build/reports/index.html |
| build/reports/another.html | | build/reports/another.html |
| build/images/icons/messages.png | | build/images/icons/messages.png |
Scenario: Ignore a globbed path (server) Scenario: Ignore a globbed path (server)
Given a fixture app "ignore-app" Given a fixture app "ignore-app"
And a file named "config.rb" with: And a file named "config.rb" with:
@ -122,7 +93,7 @@ Feature: Ignoring paths
| build/reports/index.html | | build/reports/index.html |
| build/reports/another.html | | build/reports/another.html |
| build/images/icons/messages.png | | build/images/icons/messages.png |
Scenario: Ignore a regex (server) Scenario: Ignore a regex (server)
Given a fixture app "ignore-app" Given a fixture app "ignore-app"
And a file named "config.rb" with: And a file named "config.rb" with:
@ -147,4 +118,4 @@ Feature: Ignoring paths
When I go to "/reports/another.html" When I go to "/reports/another.html"
Then I should see "File Not Found" Then I should see "File Not Found"
When I go to "/images/icons/messages.png" When I go to "/images/icons/messages.png"
Then I should see "File Not Found" Then I should see "File Not Found"

View File

@ -1,7 +0,0 @@
Feature: Support srcset property as params for image_tag helper
This lets you specify responsive image sizes
Scenario: Rendering an image with the feature enabled
Given the Server is running at "image-srcset-paths-app"
When I go to "/image-srcset-paths.html"
Then I should see '//example.com/remote-image.jpg 2x, /images/blank_3x.jpg 3x'

View File

@ -1,15 +0,0 @@
Feature: Import files
Scenario: Move one path to another
Given the Server is running at "import-app"
When I go to "/static.html"
Then I should see 'Not Found'
When I go to "/static2.html"
Then I should see 'Static, no code!'
Scenario: Import all of bower
Given the Server is running at "import-app"
When I go to "/bower_components/jquery/dist/jquery.js"
Then I should see 'jQuery'
When I go to "/bower_components2/jquery/dist/jquery.js"
Then I should see 'jQuery'

View File

@ -1,18 +0,0 @@
Feature: Test a site with javascript included
As a software developer
I want to develop a site using javascript
I would like to have a server step rendering javascript correctly in order to test it
@javascript
Scenario: Existing app with javascript
Given the Server is running at "javascript-app"
When I go to "/index.html"
Then I should see:
"""
Local Hour
"""
And I should see:
"""
Local Minutes
"""

View File

@ -6,7 +6,7 @@ Feature: Markdown (Kramdown) support
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
set :markdown_engine, :kramdown set :markdown_engine, :kramdown
set :markdown, smartypants: true set :markdown, :smartypants => true
""" """
Given the Server is running at "markdown-app" Given the Server is running at "markdown-app"
When I go to "/smarty_pants.html" When I go to "/smarty_pants.html"

View File

@ -33,10 +33,9 @@ Feature: Markdown support in Haml (Kramdown)
:markdown :markdown
[A link](/link_target.html) [A link](/link_target.html)
![image](blank.gif){: srcset="image_2x.jpg 2x"} ![image](blank.gif)
""" """
Given the Server is running at "markdown-in-haml-app" Given the Server is running at "markdown-in-haml-app"
When I go to "/link_and_image/" When I go to "/link_and_image/"
Then I should see "/link_target/" Then I should see "/link_target/"
Then I should see "/images/image_2x.jpg 2x"
Then I should see 'src="/images/blank.gif"' Then I should see 'src="/images/blank.gif"'

View File

@ -1,42 +0,0 @@
Feature: Markdown support in Slim (Kramdown)
In order to test support of the Slim markdown filter
Scenario: Markdown filter in Slim works (with Kramdown)
Given a fixture app "markdown-in-slim-app"
And a file named "config.rb" with:
"""
set :markdown_engine, :kramdown
activate :directory_indexes
"""
And a file named "source/markdown_filter.html.slim" with:
"""
markdown:
# H1
paragraph
"""
Given the Server is running at "markdown-in-slim-app"
When I go to "/markdown_filter/"
Then I should see ">H1</h1>"
Then I should see "<p>paragraph</p>"
Scenario: Markdown filter in Slim uses our link_to and image_tag helpers (with Kramdown)
Given a fixture app "markdown-in-slim-app"
And a file named "config.rb" with:
"""
set :markdown_engine, :kramdown
activate :directory_indexes
"""
And a file named "source/link_and_image.html.slim" with:
"""
markdown:
[A link](/link_target.html)
![image](blank.gif){: srcset="image_2x.jpg 2x"}
"""
Given the Server is running at "markdown-in-slim-app"
When I go to "/link_and_image/"
Then I should see "/link_target/"
Then I should see "/images/image_2x.jpg 2x"
Then I should see 'src="/images/blank.gif"'

View File

@ -1,3 +1,4 @@
@nojava
Feature: Markdown (Redcarpet) support Feature: Markdown (Redcarpet) support
In order to test included Redcarpet support In order to test included Redcarpet support
@ -6,14 +7,14 @@ Feature: Markdown (Redcarpet) support
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
set :markdown_engine, :redcarpet set :markdown_engine, :redcarpet
set :markdown, no_intra_emphasis: true, set :markdown, :no_intra_emphasis => true,
tables: true, :tables => true,
fenced_code_blocks: true, :fenced_code_blocks => true,
autolink: true, :autolink => true,
strikethrough: true, :strikethrough => true,
space_after_headers: true, :space_after_headers => true,
superscript: true, :superscript => true,
lax_spacing: true :lax_spacing => true
""" """
Given the Server is running at "markdown-app" Given the Server is running at "markdown-app"
@ -41,9 +42,9 @@ Feature: Markdown (Redcarpet) support
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
set :markdown_engine, :redcarpet set :markdown_engine, :redcarpet
set :markdown, underline: true, set :markdown, :underline => true,
highlight: true, :highlight => true,
disable_indented_code_blocks: true :disable_indented_code_blocks => true
""" """
Given the Server is running at "markdown-app" Given the Server is running at "markdown-app"
When I go to "/underline.html" When I go to "/underline.html"
@ -58,7 +59,7 @@ Feature: Markdown (Redcarpet) support
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
set :markdown_engine, :redcarpet set :markdown_engine, :redcarpet
set :markdown, smartypants: true set :markdown, :smartypants => true
""" """
Given the Server is running at "markdown-app" Given the Server is running at "markdown-app"
When I go to "/smarty_pants.html" When I go to "/smarty_pants.html"
@ -69,13 +70,13 @@ Feature: Markdown (Redcarpet) support
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
set :markdown_engine, :redcarpet set :markdown_engine, :redcarpet
set :markdown, filter_html: true, set :markdown, :filter_html => true,
no_images: true, :no_images => true,
no_links: true, :no_links => true,
with_toc_data: true, :with_toc_data => true,
hard_wrap: true, :hard_wrap => true,
safe_links_only: true, :safe_links_only => true,
prettify: true :prettify => true
""" """
Given the Server is running at "markdown-app" Given the Server is running at "markdown-app"
@ -102,7 +103,7 @@ Feature: Markdown (Redcarpet) support
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
set :markdown_engine, :redcarpet set :markdown_engine, :redcarpet
set :markdown, link_attributes: { target: "_blank" } set :markdown, :link_attributes => { :target => "_blank" }
""" """
And a file named "source/link.html.markdown" with: And a file named "source/link.html.markdown" with:
""" """
@ -117,8 +118,8 @@ Feature: Markdown (Redcarpet) support
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
set :markdown_engine, :redcarpet set :markdown_engine, :redcarpet
set :markdown, xhtml: true, set :markdown, :xhtml => true,
hard_wrap: true :hard_wrap => true
""" """
Given the Server is running at "markdown-app" Given the Server is running at "markdown-app"
When I go to "/hard_wrap.html" When I go to "/hard_wrap.html"
@ -129,7 +130,7 @@ Feature: Markdown (Redcarpet) support
And a file named "config.rb" with: And a file named "config.rb" with:
""" """
set :markdown_engine, :redcarpet set :markdown_engine, :redcarpet
set :markdown, smartypants: true set :markdown, :smartypants => true
""" """
Given the Server is running at "markdown-frontmatter-options-app" Given the Server is running at "markdown-frontmatter-options-app"
When I go to "/smarty_pants-default.html" When I go to "/smarty_pants-default.html"

View File

@ -1,3 +1,4 @@
@nojava
Feature: Markdown support in Haml Feature: Markdown support in Haml
In order to test support of the Haml markdown filter In order to test support of the Haml markdown filter

Some files were not shown because too many files have changed in this diff Show More