Compare commits

...

72 Commits

Author SHA1 Message Date
Karl Freeman 243ab38b08 tidy up changelog [ci skip] 2015-08-16 19:27:24 +01:00
Karl Freeman 32d7897b66 2.0.0-alpha
closes #93
2015-08-16 19:09:26 +01:00
Karl Freeman 9cd8988a66 not needed 2015-08-16 19:08:07 +01:00
Karl Freeman 86f76b2a53 tidy up 2015-08-16 19:06:10 +01:00
Karl Freeman 751c11f6eb Merge pull request #87 from emilioforrer/development
Fixing compatibility issues with middleman v4.0.0.beta.1
2015-08-16 18:56:58 +01:00
Emilio Forrer c590d005cf Fixing cucumber failed test 2015-02-22 22:09:54 -06:00
Emilio Forrer 1806c9263b Fixing dependency error while activating asset_hash and validated middleman version 2015-02-22 21:56:53 -06:00
Emilio Forrer a8c6fdafef Fixing dependency error while activating asset_hash 2015-02-22 21:18:59 -06:00
Emilio Forrer 9eece01aef Fixing compatibility issues with middleman v4.0.0.beta.1 2015-02-22 15:52:52 -06:00
Karl Freeman 000cabda96 Merge pull request #84 from Aupajo/fix/git-email-in-force-push
Fix Git user.email change in force push strategy
2015-01-18 10:22:37 +00:00
Pete Nicholls 4b79845d53 Fix Git user.email change in force push strategy 2015-01-18 14:51:25 +13:00
Karl Freeman 21d04f253a latest travis 2014-11-21 18:25:10 +00:00
Karl Freeman 7360fcadc4 1.0 2014-11-21 17:26:59 +00:00
Karl Freeman bd5e214614 Merge pull request #70 from Gee-Bee/git-user-details
Respect user details of git repo.
2014-11-21 17:08:03 +00:00
Karl Freeman 217af0d33c Merge pull request #77 from mconnell/master
Prevent bad commits deploying. (git)
2014-11-21 17:07:11 +00:00
Karl Freeman 8a0bfaec2b RuboCop 2014-11-21 17:00:23 +00:00
Mark Connell 79d86af7be Prevent bad commits deploying.
In the event of a fatal error occuring when trying to add content to
git for commit, you end up pushing a blank commit to the git respository.
This is a change which halts the push to a git repository so you don't
accidentally take down your website.
2014-09-04 11:25:57 +01:00
Karl Freeman b84f69f54a Merge pull request #74 from philippbosch/patch-1
Fix version number in installation instructions
2014-08-19 15:50:33 +01:00
Philipp Bosch c466746266 Fix version number in installation instructions 2014-08-19 16:12:24 +02:00
Karl Freeman 546542032f changelog 2014-08-14 11:38:48 +01:00
Karl Freeman 5486033a11 Merge branch 'master' of github.com:karlfreeman/middleman-deploy 2014-08-14 11:36:13 +01:00
Karl Freeman 70863dc312 bump 2014-08-14 11:34:48 +01:00
Karl Freeman 6e7ce4d72d Merge branch 'cleanup/major'
Conflicts:
	README.md
2014-08-14 11:32:14 +01:00
Karl Freeman e14f90fe1d cleanup 2014-08-14 11:18:58 +01:00
Karl Freeman 359f7d7431 Merge pull request #71 from statonjr/patch-1
Fix ArgumentError in SFTP
2014-08-08 09:09:05 +01:00
Larry Staton Jr. 2aba441a30 Update sftp.rb
Fix ArgumentError on exception. Line 55 had 2 arguments, but the `handle_exception` method in line 30 only required 1 argument.
2014-07-20 18:11:30 -04:00
Gee-Bee bfe6473000 Fix comment. 2014-07-18 09:35:27 +02:00
Gee-Bee 4f9d4879d7 Respect user details of git repo.
Branch with compiled pages respects repo's user details settings.
2014-07-16 10:56:58 +02:00
Karl Freeman 84b3cb0121 no longer needed 👍 2014-05-28 11:11:59 +01:00
Tom Vaughan 71c4e6339b Bump. 2014-05-25 02:07:26 -04:00
Tom Vaughan b8069d3144 Help! I still need somebody! 2014-05-24 15:22:05 -04:00
Tom Vaughan fa339eba4f Help! I need somebody! 2014-05-24 15:19:25 -04:00
Tom Vaughan 84e86e2530 Merge pull request #65 from NARKOZ/custom-commit-message
add ability to set custom commit message for git deploys
2014-05-24 14:55:38 -04:00
Nihad Abbasov efd66e7fca add ability to set custom commit message for git deploys
issue #64
2014-05-24 23:35:14 +05:00
Tom Vaughan 08e392fc6b Merge pull request #60 from jackcasey/master
Tiny change to README to suggest using 'system' over 'exec'
2014-03-20 10:23:58 -05:00
Jack Casey 4fe4526807 Tiny change to README to suggest using 'system' over 'exec'
Reason being, 'exec' will run the shell command and then exit the ruby
process. While 'system will run the shell command and then continue
execution.

I feel this is a better example as the first thing I did was write a
rake task that chains multiple tasks together and the way 'exec' was
ending the process cost me a bit of time trouble shooting why.
2014-03-20 23:10:03 +08:00
Tom Vaughan 6c426c0ef3 bump 2014-02-26 08:39:50 -03:00
Tom Vaughan c381b6448f Merge pull request #59 from andlum/replacing-run-with-exec-in-rsync
No method 'run' in rsync.rb
2014-02-26 08:38:34 -03:00
Andrew Lum da58498102 Update rsync.rb 2014-02-26 19:04:08 +08:00
Tom Vaughan d494a4faf7 bump 2014-02-23 19:00:00 -03:00
Tom Vaughan dca25529a3 Merge pull request #57 from crtvhd/master
Use binary transfer mode for all files to prevent corrupt images when deploying via FTP
2014-02-23 18:58:34 -03:00
Martin Wessely 774e656cfa Upload all files as binary to prevent corrupt images 2014-02-23 22:07:30 +01:00
Tom Vaughan 8226bba8b3 bump 2014-02-23 13:52:02 -03:00
Tom Vaughan e729af6b02 Merge pull request #56 from xinminlabs/master
add port reader for ftp method
2014-02-23 13:51:07 -03:00
Richard Huang 0bd94419ea add port reader for ftp method 2014-02-24 00:44:11 +08:00
Tom Vaughan e89b403ad8 bump 2014-02-23 11:36:02 -03:00
Tom Vaughan 865b98f1c0 Ensure `-e ssh ...` is always passed to rsync. Fixes #54 2014-02-23 11:27:50 -03:00
Tom Vaughan c22ff4bc15 Merge pull request #52 from whitetrefoil/master
Why not let the port of SFTP configurable?
2014-02-23 11:09:15 -03:00
Tom Vaughan 1d120c0112 Merge pull request #55 from derek-watson/features/environments_readme
Multiple Environments readme
2014-02-23 11:07:04 -03:00
Derek Watson ae68d40616 whitespace 2014-02-22 23:24:54 -05:00
Derek Watson dbaef1ead7 refined language 2014-02-22 23:23:27 -05:00
Derek Watson 669763b878 rmeoved conflicts 2014-02-22 23:22:24 -05:00
Derek Watson 4e46a4e3e7 Merge branch 'features/environments_readme' of github.com:derek-watson/middleman-deploy into features/environments_readme
Conflicts:
	README.md
2014-02-22 23:19:34 -05:00
Derek Watson a7e90214f2 documented multiple environment config 2014-02-22 23:18:38 -05:00
Derek Watson 260665eef9 documented multiple environment config 2014-02-22 23:13:13 -05:00
WhiteTrefoil 08875eebec Supporting port config of SFTP 2014-01-18 21:55:50 +08:00
Tom Vaughan 83c24d7443 Merge pull request #53 from cveneziani/refactoring
Refactoring
2014-01-18 05:15:23 -08:00
Cecile Veneziani 11860dd930 Refactoring
- Create a class per method
- Create a class per git strategy
- Extract USAGE into a file
- Refactor git and ftp/sftp methods
2014-01-16 16:52:52 +01:00
Tom Vaughan 064b17add2 Merge pull request #49 from cveneziani/git_submodule_strategy
Add strategy option to git method
2013-12-23 10:55:11 -08:00
Cecile Veneziani 23c6b8c1f6 Add strategy option to git method
- Set force push as default strategy (avoid breaking change)
- Add submodule strategy
2013-11-30 21:28:35 +01:00
Tom Vaughan b0f7cde56a bump 2013-11-23 17:17:25 -03:00
Tom Vaughan 26f2e43a52 Add new rsync `flags` option to error message. 2013-11-19 20:36:02 -03:00
Tom Vaughan 64ffb98d14 Merge pull request #48 from jasonsemko/jason
Adding "flags" option for rsync
2013-11-19 15:26:03 -08:00
Jason Semko eaedc962b8 updating readme 2013-11-18 17:59:58 -08:00
Jason Semko 5b1723ab34 adding a flags option to override default rsync flags 2013-11-18 17:42:55 -08:00
Tom Vaughan 63a9e82bd2 Add a prominent link to the wiki. 2013-11-18 10:37:42 -03:00
Tom Vaughan 23cace3319 Merge pull request #41 from sDaniel/master
Quotes-Fix - deploying/comitting to github on a windows machine is not woking
2013-10-03 06:20:14 -07:00
Sebastian Daniel 36785eb98f fix for quotes not woking when comitting on a windows machine. + comment since change didn't show up on github 2013-10-01 20:14:23 +02:00
Sebastian Daniel 273174f427 fix for quotes not woking when comitting on a windows machine. 2013-10-01 19:43:02 +02:00
Tom Vaughan 0b0f447117 This is misleading. There are no tests. 2013-09-21 13:37:36 -03:00
Tom Vaughan 4f03a0eaa1 Prefer README.md over the GitHub pages site. 2013-09-21 13:21:15 -03:00
Tom Vaughan 0f1a55a82b Because why not. 2013-09-21 12:13:07 -04:00
31 changed files with 881 additions and 412 deletions

3
.document Normal file
View File

@ -0,0 +1,3 @@
LICENSE.md
README.md
lib/**/*.rb

26
.gitignore vendored
View File

@ -1,8 +1,18 @@
# Ignore bundler lock file
/Gemfile.lock
# Ignore pkg folder
/pkg
# Ignore coverage folder
/coverage
*.gem
*.rbc
.bundle
.config
.yardoc
Gemfile.lock
InstalledFiles
_yardoc
coverage
doc/
lib/bundler/man
pkg
rdoc
spec/reports
test/tmp
test/version_tmp
tmp
bin

11
.rubocop.yml Normal file
View File

@ -0,0 +1,11 @@
AllCops:
Include:
- 'Gemfile'
Exclude:
- 'script/**/*'
- 'vendor/**/*'
- 'bin/**/*'
Documentation:
Enabled: false
ClassAndModuleChildren:
Enabled: false

26
.travis.yml Normal file
View File

@ -0,0 +1,26 @@
language: ruby
sudo: false
cache: bundler
bundler_args: --without development
rvm:
- ruby-head
- ruby
- jruby-head
- jruby
- 2.1.0
- 2.0.0
- 1.9.3
- rbx-2
before_script: bundle update
matrix:
fast_finish: true
allow_failures:
- rvm: ruby-head
- rvm: ruby
- rvm: jruby-head
- rvm: jruby
- rvm: rbx-2
notifications:
email: false
env:
- CODECLIMATE_REPO_TOKEN=5eee8e8624962f963a52a1d2313dc7407e3b8006291e3704346c786642cc073b

6
.yardopts Normal file
View File

@ -0,0 +1,6 @@
--markup markdown
-
CHANGELOG.md
CONTRIBUTING.md
LICENSE.md
README.md

12
CHANGELOG.md Normal file
View File

@ -0,0 +1,12 @@
Next Release
============
* Your contribution here.
2.0.0-alpha (02/08/2015)
==================
* [Fixing compatibility issues with middleman v4.0.0.beta.1](https://github.com/middleman-contrib/middleman-deploy/pull/87) - [@emilioforrer](https://github.com/emilioforrer).
1.0.0 (16/07/2014)
==================
* [Respect user details of git repo](https://github.com/middleman-contrib/middleman-deploy/pull/70) - [@Gee-Bee](https://github.com/gee-bee).
* [Prevent bad commits deploying](https://github.com/middleman-contrib/middleman-deploy/pull/77) - [@karlfreeman](https://github.com/mconnell).

44
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,44 @@
## Contributing
In the spirit of [free software][free-sw], **everyone** is encouraged to help
improve this project.
[free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
Here are some ways *you* can contribute:
* by using alpha, beta, and prerelease versions
* by reporting bugs
* by suggesting new features
* by writing or editing documentation
* by writing specifications
* by writing code (**no patch is too small**: fix typos, add comments, clean up
inconsistent whitespace)
* by refactoring code
* by closing [issues][]
* by reviewing patches
[issues]: https://github.com/karlfreeman/middleman-deploy/issues
## Submitting an Issue
We use the [GitHub issue tracker][issues] to track bugs and features. Before
submitting a bug report or feature request, check to make sure it hasn't
already been submitted. When submitting a bug report, please include a [Gist][]
that includes a stack trace and any details that may be necessary to reproduce
the bug, including your gem version, Ruby version, and operating system.
Ideally, a bug report should include a pull request with failing specs.
[gist]: https://gist.github.com/
## Submitting a Pull Request
1. [Fork the repository.][fork]
2. [Create a topic branch.][branch]
3. Add specs for your unimplemented feature or bug fix.
4. Run `bundle exec rake cucumber`. If your specs pass, return to step 3.
5. Implement your feature or bug fix.
6. Run `bundle exec rake cucumber`. If your specs fail, return to step 5.
7. Add, commit, and push your changes.
9. [Submit a pull request.][pr]
[fork]: http://help.github.com/fork-a-repo/
[branch]: http://learn.github.com/p/branching.html
[pr]: http://help.github.com/send-pull-requests/

18
Gemfile
View File

@ -1,19 +1,11 @@
source 'https://rubygems.org'
# Specify your gem's dependencies in middleman-deploy.gemspec
gemspec
group :development do
gem "rake"
gem "rdoc"
gem "yard"
end
group :test do
gem "compass"
gem "cucumber"
gem "fivemat"
gem "aruba"
gem "rspec"
gem "simplecov"
gem 'rake', '~> 10.0'
gem 'cucumber', '~> 1.3'
gem 'aruba', '~> 0.5'
gem 'fivemat'
gem 'codeclimate-test-reporter'
end

View File

@ -1,4 +1,6 @@
Copyright (c) 2012 Tom Vaughan <thomas.david.vaughan@gmail.com>
Copyright (c) 2012-2014 Tom Vaughan, Karl Freeman
MIT License
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@ -8,13 +10,13 @@ distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

223
README.md
View File

@ -1,18 +1,13 @@
# middleman-deploy [![Build Status](https://travis-ci.org/tvaughan/middleman-deploy.png?branch=master)](https://travis-ci.org/tvaughan/middleman-deploy)
# Middleman Deploy
Deploys a [middleman](http://middlemanapp.com/) built site via **rsync**,
**ftp**, **sftp**, or **git** (e.g. gh-pages on github).
Deploy your [Middleman](http://middlemanapp.com/) build via **rsync**, **ftp**, **sftp**, or **git** (e.g. [gh-pages on github](https://help.github.com/articles/creating-project-pages-manually)).
## Installation
Add this to the Gemfile of the repository of your middleman site:
```ruby
gem "middleman-deploy"
gem 'middleman-deploy', '~> 1.0'
```
and run `bundle install`.
## Usage
```
@ -20,6 +15,87 @@ $ middleman build [--clean]
$ middleman deploy [--build-before]
```
## Possible Configurations
Middleman-deploy can deploy a site via rsync, ftp, sftp, or git. Checkout [the wiki](https://github.com/tvaughan/middleman-deploy/wiki/_pages) for advanced set-up options.
### Rsync
Make sure that `rsync` is installed, and activate the extension by adding the
following to `config.rb`:
```ruby
activate :deploy do |deploy|
deploy.deploy_method = :rsync
deploy.host = 'www.example.com'
deploy.path = '/srv/www/site'
# Optional Settings
# deploy.user = 'tvaughan' # no default
# deploy.port = 5309 # ssh port, default: 22
# deploy.clean = true # remove orphaned files on remote host, default: false
# deploy.flags = '-rltgoDvzO --no-p --del' # add custom flags, default: -avz
end
```
### Git (e.g. GitHub Pages)
Make sure that `git` is installed, and activate the extension by adding the
following to `config.rb`:
```ruby
activate :deploy do |deploy|
deploy.deploy_method = :git
# Optional Settings
# deploy.remote = 'custom-remote' # remote name or git url, default: origin
# deploy.branch = 'custom-branch' # default: gh-pages
# deploy.strategy = :submodule # commit strategy: can be :force_push or :submodule, default: :force_push
# deploy.commit_message = 'custom-message' # commit message (can be empty), default: Automated commit at `timestamp` by middleman-deploy `version`
end
```
If you use a remote name, you must first add it using `git remote add`. Run
`git remote -v` to see a list of possible remote names. If you use a git url,
it must end with '.git'.
Afterwards, the `build` directory will become a git repo.
If you use the force push strategy, this branch will be created on the remote if
it doesn't already exist.
But if you use the submodule strategy, you must first initialize build folder as
a submodule. See `git submodule add` documentation.
### FTP
Activate the extension by adding the following to `config.rb`:
```ruby
activate :deploy do |deploy|
deploy.deploy_method = :ftp
deploy.host = 'ftp.example.com'
deploy.path = '/srv/www/site'
deploy.user = 'tvaughan'
deploy.password = 'secret'
end
```
### SFTP
Activate the extension by adding the following to `config.rb`:
```ruby
activate :deploy do |deploy|
deploy.deploy_method = :sftp
deploy.host = 'sftp.example.com'
deploy.port = 22
deploy.path = '/srv/www/site'
# Optional Settings
# deploy.user = 'tvaughan' # no default
# deploy.password = 'secret' # no default
end
```
### Run Automatically
To automatically run `middleman build` during `middleman deploy`, turn on the
`build_before` option while activating the deploy extension:
@ -30,96 +106,81 @@ activate :deploy do |deploy|
end
```
## Possible Configurations
### Multiple Environments
Middleman-deploy can deploy a site via rsync, ftp, sftp, or git.
### rsync
Make sure that `rsync` is installed, and activate the extension by adding the
following to `config.rb`:
Deploy your site to more than one configuration using environment variables.
```ruby
activate :deploy do |deploy|
deploy.method = :rsync
deploy.host = "www.example.com"
deploy.path = "/srv/www/site"
# Optional Settings
# deploy.user = "tvaughan" # no default
# deploy.port = 5309 # ssh port, default: 22
# deploy.clean = true # remove orphaned files on remote host, default: false
# config.rb
case ENV['TARGET'].to_s.downcase
when 'production'
activate :deploy do |deploy|
deploy.deploy_method = :rsync
deploy.host = 'www.example.com'
deploy.path = '/srv/www/production-site'
end
else
activate :deploy do |deploy|
deploy.deploy_method = :rsync
deploy.host = 'staging.example.com'
deploy.path = '/srv/www/staging-site'
end
end
```
### Git (e.g. GitHub Pages)
Make sure that `git` is installed, and activate the extension by adding the
following to `config.rb`:
```ruby
activate :deploy do |deploy|
deploy.method = :git
# Optional Settings
# deploy.remote = "custom-remote" # remote name or git url, default: origin
# deploy.branch = "custom-branch" # default: gh-pages
# Rakefile
namespace :deploy do
def deploy(env)
puts "Deploying to #{env}"
system "TARGET=#{env} bundle exec middleman deploy"
end
task :staging do
deploy :staging
end
task :production do
deploy :production
end
end
```
If you use a remote name, you must first add it using `git remote add`. Run
`git remote -v` to see a list of possible remote names. If you use a git url,
it must end with '.git'.
Afterwards, the `build` directory will become a git repo. This branch will be
created on the remote if it doesn't already exist.
### FTP
Activate the extension by adding the following to `config.rb`:
```ruby
activate :deploy do |deploy|
deploy.method = :ftp
deploy.host = "ftp.example.com"
deploy.path = "/srv/www/site"
deploy.user = "tvaughan"
deploy.password = "secret"
end
```
$ rake deploy:staging
$ rake deploy:production
```
### SFTP
## Badges
Activate the extension by adding the following to `config.rb`:
[![Gem Version](http://img.shields.io/gem/v/middleman-deploy.svg)][gem]
[![Build Status](http://img.shields.io/travis/karlfreeman/middleman-deploy.svg)][travis]
[![Code Quality](http://img.shields.io/codeclimate/github/karlfreeman/middleman-deploy.svg)][codeclimate]
[![Code Coverage](http://img.shields.io/codeclimate/coverage/github/karlfreeman/middleman-deploy.svg)][codeclimate]
[![Gittip](http://img.shields.io/gittip/karlfreeman.svg)][gittip]
```ruby
activate :deploy do |deploy|
deploy.method = :sftp
deploy.host = "sftp.example.com"
deploy.path = "/srv/www/site"
# Optional Settings
# deploy.user = "tvaughan" # no default
# deploy.password = "secret" # no default
end
```
## Supported Ruby Versions
## Breaking Changes
This library aims to support and is [tested against][travis] the following Ruby
implementations:
* `v0.1.0`
- Removed the `--clean` command-line option. This option only applied to
the rsync deploy method. The idea going forward is that command-line
options must apply to all deploy methods. Options that are specific to a
deploy method will only be available in `config.rb`.
- Removed `deploy` from the `after_build` hook. This caused a `deploy` to
be run each time `build` was called. This workflow never made
sense. `deploy` was added to the `after_build` hook simply because it
was available.
- Ruby 2.1.0
- Ruby 2.0.0
- Ruby 1.9.3
- [JRuby][jruby]
- [Rubinius][rubinius]
## Thanks!
# Credits
A **BIG** thanks to
[everyone who has contributed](https://github.com/tvaughan/middleman-deploy/graphs/contributors)!
Almost all pull requests are accepted.
A **BIG** thanks to [everyone who has contributed](https://github.com/karlfreeman/middleman-deploy/graphs/contributors)! Almost all pull requests are accepted.
## Other
Inspiration:
Inspired by the rsync task in
[Octopress](https://github.com/imathis/octopress).
- The rsync task in [Octopress](https://github.com/imathis/octopress)
[gem]: https://rubygems.org/gems/middleman-deploy
[travis]: http://travis-ci.org/karlfreeman/middleman-deploy
[codeclimate]: https://codeclimate.com/github/karlfreeman/middleman-deploy
[gittip]: https://www.gittip.com/karlfreeman
[jruby]: http://www.jruby.org
[rubinius]: http://rubini.us

View File

@ -1,14 +1,25 @@
require 'bundler'
Bundler.setup
Bundler::GemHelper.install_tasks
require 'cucumber/rake/task'
Cucumber::Rake::Task.new(:cucumber, 'Run features that should pass') do |t|
t.cucumber_opts = "--color --tags ~@wip --strict --format #{ENV['CUCUMBER_FORMAT'] || 'Fivemat'}"
exempt_tags = ['--tags ~@wip']
t.cucumber_opts = "--color #{exempt_tags.join(' ')} --strict --format #{ENV['CUCUMBER_FORMAT'] || 'Fivemat'}"
end
require 'rake/clean'
begin
require 'yard'
YARD::Rake::YardocTask.new
rescue LoadError
end
task :test => ["cucumber"]
begin
require 'rubocop/rake_task'
desc 'Run rubocop'
RuboCop::RakeTask.new(:rubocop)
rescue LoadError
end
task :default => :test
task default: :cucumber
task test: :cucumber

View File

@ -1,6 +1,8 @@
require "simplecov"
SimpleCov.start
PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__)))
require "middleman-core"
require "middleman-core/step_definitions"
require 'middleman-core'
require 'middleman-core/step_definitions'
require 'codeclimate-test-reporter'
CodeClimate::TestReporter.start
require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-deploy')

6
features/test.feature Normal file
View File

@ -0,0 +1,6 @@
Feature: test
Scenario: whilst testing
Given the Server is running at "test-app"
When I go to "/index.html"
Then I should see "<h1>Test</h1>"

View File

View File

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

View File

@ -1,8 +1,8 @@
require "middleman-core"
require 'middleman-core'
require "middleman-deploy/commands"
require 'middleman-deploy/commands'
::Middleman::Extensions.register(:deploy) do
require "middleman-deploy/extension"
::Middleman::Deploy
require 'middleman-deploy/extension'
::Middleman::Deploy::Extension
end

View File

@ -1,289 +1,119 @@
require "middleman-core/cli"
require "middleman-deploy/extension"
require "middleman-deploy/pkg-info"
require 'middleman-core/cli'
require 'middleman-core/rack' if Middleman::VERSION.to_i > 3
require 'middleman-deploy/pkg-info'
require 'middleman-deploy/extension'
require 'middleman-deploy/methods'
require 'middleman-deploy/strategies'
module Middleman
module Cli
# This class provides a "deploy" command for the middleman CLI.
class Deploy < Thor
class Deploy < Thor::Group
include Thor::Actions
check_unknown_options!
namespace :deploy
class_option :environment,
aliases: '-e',
default: ENV['MM_ENV'] || ENV['RACK_ENV'] || 'production',
desc: 'The environment Middleman will run under'
class_option :verbose,
type: :boolean,
default: false,
desc: 'Print debug messages'
class_option :instrument,
type: :string,
default: false,
desc: 'Print instrument messages'
class_option :build_before,
type: :boolean,
aliases: '-b',
desc: 'Run `middleman build` before the deploy step'
def self.subcommand_help(_options)
# TODO
end
# Tell Thor to exit with a nonzero exit code on failure
def self.exit_on_failure?
true
end
desc "deploy [options]", Middleman::Deploy::TAGLINE
method_option "build_before",
:type => :boolean,
:aliases => "-b",
:desc => "Run `middleman build` before the deploy step"
def deploy
if options.has_key? "build_before"
build_before = options.build_before
else
build_before = self.deploy_options.build_before
env = options['environment'] ? :production : options['environment'].to_s.to_sym
verbose = options['verbose'] ? 0 : 1
instrument = options['instrument']
@app = ::Middleman::Application.new do
config[:mode] = :build
config[:environment] = env
::Middleman::Logger.singleton(verbose, instrument)
end
if build_before
# http://forum.middlemanapp.com/t/problem-with-the-build-task-in-an-extension
run("middleman build") || exit(1)
end
send("deploy_#{self.deploy_options.method}")
build_before(options)
process
end
protected
def print_usage_and_die(message)
raise Error, "ERROR: " + message + "\n" + <<EOF
def build_before(options = {})
build_enabled = options.fetch('build_before', deploy_options.build_before)
You should follow one of the four examples below to setup the deploy
extension in config.rb.
# To deploy the build directory to a remote host via rsync:
activate :deploy do |deploy|
deploy.method = :rsync
# host and path *must* be set
deploy.host = "www.example.com"
deploy.path = "/srv/www/site"
# user is optional (no default)
deploy.user = "tvaughan"
# port is optional (default is 22)
deploy.port = 5309
# clean is optional (default is false)
deploy.clean = true
end
# To deploy to a remote branch via git (e.g. gh-pages on github):
activate :deploy do |deploy|
deploy.method = :git
# remote is optional (default is "origin")
# run `git remote -v` to see a list of possible remotes
deploy.remote = "some-other-remote-name"
# branch is optional (default is "gh-pages")
# run `git branch -a` to see a list of possible branches
deploy.branch = "some-other-branch-name"
end
# To deploy the build directory to a remote host via ftp:
activate :deploy do |deploy|
deploy.method = :ftp
# host, user, passwword and path *must* be set
deploy.host = "ftp.example.com"
deploy.path = "/srv/www/site"
deploy.user = "tvaughan"
deploy.password = "secret"
end
# To deploy the build directory to a remote host via sftp:
activate :deploy do |deploy|
deploy.method = :sftp
# host, user, passwword and path *must* be set
deploy.host = "sftp.example.com"
deploy.path = "/srv/www/site"
# user is optional (no default)
deploy.user = "tvaughan"
# password is optional (no default)
deploy.password = "secret"
end
EOF
if build_enabled
# http://forum.middlemanapp.com/t/problem-with-the-build-task-in-an-extension
run("middleman build -e #{options['environment']}") || exit(1)
end
end
def inst
::Middleman::Application.server.inst
def print_usage_and_die(message)
fail StandardError, "ERROR: #{message}\n#{Middleman::Deploy::README}"
end
def process
server_instance = @app
camelized_method = deploy_options.deploy_method.to_s.split('_').map(&:capitalize).join
method_class_name = "Middleman::Deploy::Methods::#{camelized_method}"
method_instance = method_class_name.constantize.new(server_instance, deploy_options)
method_instance.process
end
def deploy_options
options = nil
begin
options = inst.options
options = ::Middleman::Deploy.options
rescue NoMethodError
print_usage_and_die "You need to activate the deploy extension in config.rb."
print_usage_and_die 'You need to activate the deploy extension in config.rb.'
end
if (!options.method)
print_usage_and_die "The deploy extension requires you to set a method."
unless options.deploy_method
print_usage_and_die 'The deploy extension requires you to set a method.'
end
case options.method
case options.deploy_method
when :rsync, :sftp
if (!options.host || !options.path)
print_usage_and_die "The #{options.method} method requires host and path to be set."
unless options.host && options.path
print_usage_and_die "The #{options.deploy_method} method requires host and path to be set."
end
when :ftp
if (!options.host || !options.user || !options.password || !options.path)
print_usage_and_die "The ftp deploy method requires host, path, user, and password to be set."
unless options.host && options.user && options.password && options.path
print_usage_and_die 'The ftp deploy method requires host, path, user, and password to be set.'
end
end
options
end
def deploy_rsync
host = self.deploy_options.host
port = self.deploy_options.port
path = self.deploy_options.path
# Append "@" to user if provided.
user = self.deploy_options.user
user = "#{user}@" if user && !user.empty?
dest_url = "#{user}#{host}:#{path}"
puts "## Deploying via rsync to #{dest_url} port=#{port}"
command = "rsync -avze '" + "ssh -p #{port}" + "' #{self.inst.build_dir}/ #{dest_url}"
if self.deploy_options.clean
command += " --delete"
end
run command
end
def deploy_git
remote = self.deploy_options.remote
branch = self.deploy_options.branch
puts "## Deploying via git to remote=\"#{remote}\" and branch=\"#{branch}\""
#check if remote is not a git url
unless remote =~ /\.git$/
remote = `git config --get remote.#{remote}.url`.chop
end
#if the remote name doesn't exist in the main repo
if remote == ''
puts "Can't deploy! Please add a remote with the name '#{self.deploy_options.remote}' to your repo."
exit
end
Dir.chdir(self.inst.build_dir) do
unless File.exists?('.git')
`git init`
`git remote add origin #{remote}`
else
#check if the remote repo has changed
unless remote == `git config --get remote.origin.url`.chop
`git remote rm origin`
`git remote add origin #{remote}`
end
end
#if there is a branch with that name, switch to it, otherwise create a new one and switch to it
if `git branch`.split("\n").any? { |b| b =~ /#{branch}/i }
`git checkout #{branch}`
else
`git checkout -b #{branch}`
end
`git add -A`
`git commit --allow-empty -am 'Automated commit at #{Time.now.utc} by #{Middleman::Deploy::PACKAGE} #{Middleman::Deploy::VERSION}'`
`git push -f origin #{branch}`
end
end
def deploy_ftp
require 'net/ftp'
require 'ptools'
host = self.deploy_options.host
user = self.deploy_options.user
pass = self.deploy_options.password
path = self.deploy_options.path
puts "## Deploying via ftp to #{user}@#{host}:#{path}"
ftp = Net::FTP.new(host)
ftp.login(user, pass)
ftp.chdir(path)
ftp.passive = true
Dir.chdir(self.inst.build_dir) do
files = Dir.glob('**/*', File::FNM_DOTMATCH)
files.reject { |a| a =~ Regexp.new('\.$') }.each do |f|
if File.directory?(f)
begin
ftp.mkdir(f)
puts "Created directory #{f}"
rescue
end
else
begin
if File.binary?(f)
ftp.putbinaryfile(f, f)
else
ftp.puttextfile(f, f)
end
rescue Exception => e
reply = e.message
err_code = reply[0,3].to_i
if err_code == 550
if File.binary?(f)
ftp.putbinaryfile(f, f)
else
ftp.puttextfile(f, f)
end
end
end
puts "Copied #{f}"
end
end
end
ftp.close
end
def deploy_sftp
require 'net/sftp'
require 'ptools'
host = self.deploy_options.host
user = self.deploy_options.user
pass = self.deploy_options.password
path = self.deploy_options.path
puts "## Deploying via sftp to #{user}@#{host}:#{path}"
# `nil` is a valid value for user and/or pass.
Net::SFTP.start(host, user, :password => pass) do |sftp|
sftp.mkdir(path)
Dir.chdir(self.inst.build_dir) do
files = Dir.glob('**/*', File::FNM_DOTMATCH)
files.reject { |a| a =~ Regexp.new('\.$') }.each do |f|
if File.directory?(f)
begin
sftp.mkdir("#{path}/#{f}")
puts "Created directory #{f}"
rescue
end
else
begin
sftp.upload(f, "#{path}/#{f}")
rescue Exception => e
reply = e.message
err_code = reply[0,3].to_i
if err_code == 550
sftp.upload(f, "#{path}/#{f}")
end
end
puts "Copied #{f}"
end
end
end
end
end
end
# Alias "d" to "deploy"
Base.map({ "d" => "deploy" })
# Add to CLI
Base.register(Middleman::Cli::Deploy, 'deploy', 'deploy [options]', Middleman::Deploy::TAGLINE)
# Alias "d" to "deploy"
Base.map('d' => 'deploy')
end
end

View File

@ -1,20 +1,35 @@
# Require core library
require "middleman-core"
require 'middleman-core'
# Extension namespace
module Middleman
module Deploy
class Options < Struct.new(:whatisthis, :method, :host, :port, :user, :password, :path, :clean, :remote, :branch, :build_before); end
@options
class << self
attr_reader :options
def options
@@options
end
attr_writer :options
end
class Extension < Extension
option :deploy_method, nil
option :host, nil
option :port, nil
option :user, nil
option :password, nil
option :path, nil
option :clean, nil
option :remote, nil
option :branch, nil
option :strategy, nil
option :build_before, nil
option :flags, nil
option :commit_message, nil
def initialize(app, options_hash = {}, &block)
super
def registered(app, options_hash={}, &block)
options = Options.new(options_hash)
yield options if block_given?
# Default options for the rsync method.
@ -22,25 +37,17 @@ module Middleman
options.clean ||= false
# Default options for the git method.
options.remote ||= "origin"
options.branch ||= "gh-pages"
options.remote ||= 'origin'
options.branch ||= 'gh-pages'
options.strategy ||= :force_push
options.commit_message ||= nil
options.build_before ||= false
@@options = options
app.send :include, Helpers
end
alias :included :registered
end
module Helpers
def options
::Middleman::Deploy.options
def after_configuration
::Middleman::Deploy.options = options
end
end
end
end

View File

@ -0,0 +1,5 @@
require 'middleman-deploy/methods/base'
require 'middleman-deploy/methods/ftp'
require 'middleman-deploy/methods/git'
require 'middleman-deploy/methods/rsync'
require 'middleman-deploy/methods/sftp'

View File

@ -0,0 +1,22 @@
module Middleman
module Deploy
module Methods
class Base
attr_reader :options, :server_instance
def initialize(server_instance, options = {})
@options = options
@server_instance = server_instance
end
def build_dir
server_instance.config.setting(:build_dir).value
end
def process
fail NotImplementedError
end
end
end
end
end

View File

@ -0,0 +1,86 @@
require 'net/ftp'
require 'ptools'
module Middleman
module Deploy
module Methods
class Ftp < Base
attr_reader :host, :port, :pass, :path, :user
def initialize(server_instance, options = {})
super(server_instance, options)
@host = self.options.host
@user = self.options.user
@pass = self.options.password
@path = self.options.path
@port = self.options.port
end
def process
puts "## Deploying via ftp to #{user}@#{host}:#{path}"
ftp = open_connection
Dir.chdir(build_dir) do
filtered_files.each do |filename|
if File.directory?(filename)
upload_directory(ftp, filename)
else
upload_binary(ftp, filename)
end
end
end
ftp.close
end
protected
def filtered_files
files = Dir.glob('**/*', File::FNM_DOTMATCH)
files.reject { |filename| filename =~ Regexp.new('\.$') }
end
def handle_exception(exception, ftp, filename)
reply = exception.message
err_code = reply[0, 3].to_i
if err_code == 550
if File.binary?(filename)
ftp.putbinaryfile(filename, filename)
else
ftp.puttextfile(filename, filename)
end
end
end
def open_connection
ftp = Net::FTP.new(host)
ftp.login(user, pass)
ftp.chdir(path)
ftp.passive = true
ftp
end
def upload_binary(ftp, filename)
begin
ftp.putbinaryfile(filename, filename)
rescue Exception => exception
handle_exception(exception, ftp, filename)
end
puts "Copied #{filename}"
end
def upload_directory(ftp, filename)
ftp.mkdir(filename)
puts "Created directory #{filename}"
rescue
end
end
end
end
end

View File

@ -0,0 +1,17 @@
module Middleman
module Deploy
module Methods
class Git < Base
def process
puts "## Deploying via git to remote=\"#{options.remote}\" and branch=\"#{options.branch}\""
camelized_strategy = options.strategy.to_s.split('_').map(&:capitalize).join
strategy_class_name = "Middleman::Deploy::Strategies::Git::#{camelized_strategy}"
strategy_instance = strategy_class_name.constantize.new(build_dir, options.remote, options.branch, options.commit_message)
strategy_instance.process
end
end
end
end
end

View File

@ -0,0 +1,34 @@
module Middleman
module Deploy
module Methods
class Rsync < Base
attr_reader :clean, :flags, :host, :path, :port, :user
def initialize(server_instance, options = {})
super(server_instance, options)
@clean = self.options.clean
@flags = self.options.flags
@host = self.options.host
@path = self.options.path
@port = self.options.port
@user = self.options.user
end
def process
# Append "@" to user if provided.
user = "#{self.user}@" if user && !user.empty?
dest_url = "#{user}#{host}:#{path}"
flags = self.flags || '-avz'
command = "rsync #{flags} '-e ssh -p #{port}' #{build_dir}/ #{dest_url}"
command += ' --delete' if clean
puts "## Deploying via rsync to #{dest_url} port=#{port}"
exec command
end
end
end
end
end

View File

@ -0,0 +1,60 @@
require 'net/sftp'
require 'ptools'
module Middleman
module Deploy
module Methods
class Sftp < Ftp
def process
puts "## Deploying via sftp to #{user}@#{host}:#{path}"
# `nil` is a valid value for user and/or pass.
Net::SFTP.start(host, user, password: pass, port: port) do |sftp|
sftp.mkdir(path)
Dir.chdir(build_dir) do
filtered_files.each do |filename|
if File.directory?(filename)
upload_directory(sftp, filename)
else
upload_file(sftp, filename)
end
end
end
end
end
protected
def handle_exception(exception, filename, file_path)
reply = exception.message
err_code = reply[0, 3].to_i
sftp.upload(filename, file_path) if err_code == 550
end
def upload_directory(sftp, filename)
file_path = "#{path}/#{filename}"
begin
sftp.mkdir(file_path)
puts "Created directory #{filename}"
rescue
end
end
def upload_file(sftp, filename)
file_path = "#{path}/#{filename}"
begin
sftp.upload(filename, file_path)
rescue Exception => exception
handle_exception(exception, filename, file_path)
end
puts "Copied #{filename}"
end
end
end
end
end

View File

@ -1,7 +1,64 @@
module Middleman
module Deploy
PACKAGE = "middleman-deploy"
VERSION = "0.1.3"
TAGLINE = "Deploy a middleman built site over rsync, ftp, sftp, or git (e.g. gh-pages on github)."
PACKAGE = 'middleman-deploy'
VERSION = '2.0.0-alpha'
TAGLINE = 'Deploy a middleman built site over rsync, ftp, sftp, or git (e.g. gh-pages on github).'
README = %{
You should follow one of the four examples below to setup the deploy
extension in config.rb.
# To deploy the build directory to a remote host via rsync:
activate :deploy do |deploy|
deploy.method = :rsync
# host and path *must* be set
deploy.host = "www.example.com"
deploy.path = "/srv/www/site"
# user is optional (no default)
deploy.user = "tvaughan"
# port is optional (default is 22)
deploy.port = 5309
# clean is optional (default is false)
deploy.clean = true
# flags is optional (default is -avze)
deploy.flags = "-rltgoDvzO --no-p --del -e"
end
# To deploy to a remote branch via git (e.g. gh-pages on github):
activate :deploy do |deploy|
deploy.method = :git
# remote is optional (default is "origin")
# run `git remote -v` to see a list of possible remotes
deploy.remote = "some-other-remote-name"
# branch is optional (default is "gh-pages")
# run `git branch -a` to see a list of possible branches
deploy.branch = "some-other-branch-name"
# strategy is optional (default is :force_push)
deploy.strategy = :submodule
end
# To deploy the build directory to a remote host via ftp:
activate :deploy do |deploy|
deploy.method = :ftp
# host, user, passwword and path *must* be set
deploy.host = "ftp.example.com"
deploy.path = "/srv/www/site"
deploy.user = "tvaughan"
deploy.password = "secret"
end
# To deploy the build directory to a remote host via sftp:
activate :deploy do |deploy|
deploy.method = :sftp
# host, user, passwword and path *must* be set
deploy.host = "sftp.example.com"
deploy.port = 22
deploy.path = "/srv/www/site"
# user is optional (no default)
deploy.user = "tvaughan"
# password is optional (no default)
deploy.password = "secret"
end}
end
end

View File

@ -0,0 +1,3 @@
require 'middleman-deploy/strategies/git/base'
require 'middleman-deploy/strategies/git/force_push'
require 'middleman-deploy/strategies/git/submodule'

View File

@ -0,0 +1,56 @@
module Middleman
module Deploy
module Strategies
module Git
class Base
attr_accessor :branch, :build_dir, :remote, :commit_message, :user_name, :user_email
def initialize(build_dir, remote, branch, commit_message)
self.branch = branch
self.build_dir = build_dir
self.remote = remote
self.commit_message = commit_message
self.user_name = `git config --get user.name`
self.user_email = `git config --get user.email`
end
def process
fail NotImplementedError
end
protected
def add_signature_to_commit_message(base_message)
signature = "#{Middleman::Deploy::PACKAGE} #{Middleman::Deploy::VERSION}"
time = "#{Time.now.utc}"
"#{base_message} at #{time} by #{signature}"
end
def checkout_branch
# if there is a branch with that name, switch to it, otherwise create a new one and switch to it
if `git branch`.split("\n").any? { |b| b =~ /#{branch}/i }
`git checkout #{branch}`
else
`git checkout -b #{branch}`
end
end
def commit_branch(options = '')
message = commit_message ? commit_message : add_signature_to_commit_message('Automated commit')
run_or_fail('git add -A')
run_or_fail("git commit --allow-empty -am \"#{message}\"")
run_or_fail("git push #{options} origin #{branch}")
end
private
def run_or_fail(command)
system(command) || fail("ERROR running: #{command}")
end
end
end
end
end
end

View File

@ -0,0 +1,58 @@
module Middleman
module Deploy
module Strategies
module Git
class ForcePush < Base
def process
Dir.chdir(build_dir) do
add_remote_url
checkout_branch
commit_branch('-f')
end
end
private
def add_remote_url
url = get_remote_url
unless File.exist?('.git')
`git init`
`git remote add origin #{url}`
`git config user.name "#{user_name}"`
`git config user.email "#{user_email}"`
else
# check if the remote repo has changed
unless url == `git config --get remote.origin.url`.chop
`git remote rm origin`
`git remote add origin #{url}`
end
# check if the user name has changed
`git config user.name "#{user_name}"` unless user_name == `git config --get user.name`
# check if the user email has changed
`git config user.email "#{user_email}"` unless user_email == `git config --get user.email`
end
end
def get_remote_url
remote = self.remote
url = remote
# check if remote is not a git url
unless remote =~ /\.git$/
url = `git config --get remote.#{url}.url`.chop
end
# if the remote name doesn't exist in the main repo
if url == ''
puts "Can't deploy! Please add a remote with the name '#{remote}' to your repo."
exit
end
url
end
end
end
end
end
end

View File

@ -0,0 +1,42 @@
module Middleman
module Deploy
module Strategies
module Git
class Submodule < Base
def process
Dir.chdir(build_dir) do
checkout_branch
pull_submodule
commit_branch
end
commit_submodule
end
private
def commit_submodule
current_branch = `git rev-parse --abbrev-ref HEAD`
message = add_signature_to_commit_message('Deployed')
`git add #{build_dir}`
`git commit --allow-empty -m "#{message}"`
`git push origin #{current_branch}`
end
def pull_submodule
`git fetch`
`git stash`
`git rebase #{remote}/#{branch}`
`git stash pop`
if $CHILD_STATUS.exitstatus == 1
puts "Can't deploy! Please resolve conflicts. Then process to manual commit and push on #{branch} branch."
exit
end
end
end
end
end
end
end

View File

@ -1 +1 @@
require "middleman-deploy"
require 'middleman-deploy'

View File

@ -1,27 +1,32 @@
# -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require "middleman-deploy/pkg-info"
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'middleman-deploy/pkg-info'
Gem::Specification.new do |s|
s.name = Middleman::Deploy::PACKAGE
s.version = Middleman::Deploy::VERSION
s.platform = Gem::Platform::RUBY
s.authors = ["Tom Vaughan"]
s.email = ["thomas.david.vaughan@gmail.com"]
s.homepage = "http://tvaughan.github.io/middleman-deploy/"
s.summary = Middleman::Deploy::TAGLINE
s.description = Middleman::Deploy::TAGLINE
s.license = "MIT"
Gem::Specification.new do |spec|
spec.name = Middleman::Deploy::PACKAGE
spec.version = Middleman::Deploy::VERSION
spec.authors = ['Tom Vaughan', 'Karl Freeman']
spec.email = ['thomas.david.vaughan@gmail.com', 'karlfreeman@gmail.com']
spec.summary = Middleman::Deploy::TAGLINE
spec.description = Middleman::Deploy::TAGLINE
spec.homepage = 'https://github.com/karlfreeman/middleman-deploy'
spec.license = 'MIT'
s.files = `git ls-files`.split("\n")
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
s.require_paths = ["lib"]
spec.files = `git ls-files -z`.split("\x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ['lib']
spec.required_ruby_version = '>= 1.9.3'
# The version of middleman-core your extension depends on
s.add_runtime_dependency("middleman-core", [">= 3.0.0"])
spec.add_dependency 'middleman-core', '>= 3.2'
spec.add_dependency 'ptools'
spec.add_dependency 'net-sftp'
# Additional dependencies
s.add_runtime_dependency("ptools")
s.add_runtime_dependency("net-sftp")
spec.add_development_dependency 'bundler', '~> 1.5'
spec.add_development_dependency 'rake', '~> 10.0'
spec.add_development_dependency 'kramdown', '>= 0.14'
spec.add_development_dependency 'rubocop', '~> 0.19'
spec.add_development_dependency 'pry'
spec.add_development_dependency 'yard'
end