mozzn 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +84 -0
- data/Rakefile +1 -0
- data/bin/mozzn +5 -0
- data/lib/mozzn/api.rb +52 -0
- data/lib/mozzn/cli.rb +191 -0
- data/lib/mozzn/config.rb +37 -0
- data/lib/mozzn/exceptions.rb +4 -0
- data/lib/mozzn/extensions.rb +10 -0
- data/lib/mozzn/version.rb +3 -0
- data/lib/mozzn.rb +15 -0
- data/mozzn.gemspec +31 -0
- data/scripts/generate_readme.sh +31 -0
- data/spec/cli_spec.rb +160 -0
- data/spec/spec_helper.rb +29 -0
- metadata +177 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 94fa3cb336e2a80bde0c291f85eb02592b6eaf9d
|
4
|
+
data.tar.gz: 007817626426c1ec1cd9d4e3429163872bc79fa5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4ab37a6abbcb179792e4865bef118d075d3fc4793c48e92341b996f03433ed3dca35f68947b42430109d1b1537fe1b2ed74bf906de030e72d84c084872d25c87
|
7
|
+
data.tar.gz: 30bff826c0da4bfc83f40ab0bd7a8e13d3c8297f43a2c3b79260bd2adb54d9c969892293c215ccde856ad3295a9966b3765eff4fa2914c7e4f876041d49f3ea6
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Mozzn
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
#Mozzn
|
2
|
+
Command Line Interface for mozzn APIs
|
3
|
+
##Installation
|
4
|
+
|
5
|
+
Run the following command from your terminal:
|
6
|
+
|
7
|
+
$ gem install mozzn
|
8
|
+
|
9
|
+
##Usage
|
10
|
+
###Mozzn Commands
|
11
|
+
|
12
|
+
|
13
|
+
Commands:
|
14
|
+
- mozzn add_key
|
15
|
+
- mozzn create_app APPNAME
|
16
|
+
- mozzn help COMMAND
|
17
|
+
- mozzn login
|
18
|
+
- mozzn remove_app APPNAME
|
19
|
+
- mozzn update
|
20
|
+
|
21
|
+
Detailed command usage:
|
22
|
+
|
23
|
+
$ mozzn add_key
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
####mozzn add_key
|
28
|
+
|
29
|
+
#####Options:
|
30
|
+
-k, [--public-key=PUBLIC_KEY]
|
31
|
+
-p, [--key-path=KEY_PATH]
|
32
|
+
|
33
|
+
Add your SSH Public Key directily or add its path
|
34
|
+
|
35
|
+
$ mozzn create_app
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
####mozzn create_app APPNAME
|
40
|
+
|
41
|
+
create a new application
|
42
|
+
|
43
|
+
$ mozzn help
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
####mozzn help COMMAND
|
48
|
+
|
49
|
+
For more infromation about spicific COMMAND
|
50
|
+
|
51
|
+
$ mozzn login
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
####mozzn login
|
56
|
+
|
57
|
+
#####Options:
|
58
|
+
-u, [--email=EMAIL]
|
59
|
+
-p, [--password=PASSWORD]
|
60
|
+
|
61
|
+
Login with your mozzn credentials, an interactive shell will ask you about your email and password
|
62
|
+
|
63
|
+
$ mozzn remove_app
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
####mozzn remove_app APPNAME
|
68
|
+
|
69
|
+
Remove spcicfic Application.
|
70
|
+
|
71
|
+
$ mozzn update
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
####mozzn update
|
76
|
+
|
77
|
+
To show if there is an update for the CLI
|
78
|
+
|
79
|
+
## Contributing
|
80
|
+
1. Fork it ( http://github.com/mozzn/mozzn/fork )
|
81
|
+
2. Create your feature branch ( git checkout -b my-new-feature)
|
82
|
+
3. Commit your changes ( git commit -am 'Add some feature')
|
83
|
+
4. Push to the branch ( git push origin my-new-feature)
|
84
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/mozzn
ADDED
data/lib/mozzn/api.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'json'
|
3
|
+
require 'mozzn/exceptions'
|
4
|
+
|
5
|
+
module Mozzn
|
6
|
+
class Api
|
7
|
+
attr_accessor :connection
|
8
|
+
attr_accessor :token
|
9
|
+
|
10
|
+
def initialize token = nil
|
11
|
+
@connection = Faraday.new('http://mozzn.com/api/v1/')
|
12
|
+
@token = token
|
13
|
+
end
|
14
|
+
|
15
|
+
def get path, parms
|
16
|
+
begin
|
17
|
+
response = @connection.get uri(path), parms
|
18
|
+
rescue Faraday::Error::ConnectionFailed => e
|
19
|
+
raise Mozzn::Disconnected
|
20
|
+
end
|
21
|
+
begin
|
22
|
+
JSON.parse(response.body)
|
23
|
+
rescue JSON::ParserError => e
|
24
|
+
raise Mozzn::UnexpectedOutput
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def post path, parms
|
30
|
+
begin
|
31
|
+
response = @connection.post uri(path), parms
|
32
|
+
rescue Faraday::Error::ConnectionFailed => e
|
33
|
+
raise Mozzn::Disconnected
|
34
|
+
end
|
35
|
+
begin
|
36
|
+
JSON.parse(response.body)
|
37
|
+
rescue JSON::ParserError => e
|
38
|
+
raise Mozzn::UnexpectedOutput
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
private
|
45
|
+
def uri path
|
46
|
+
uri = []
|
47
|
+
uri << path.to_s
|
48
|
+
uri << "auth_token=#{@token}" unless @token.nil?
|
49
|
+
uri.join('?')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/mozzn/cli.rb
ADDED
@@ -0,0 +1,191 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'highline'
|
3
|
+
require 'cocaine'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'git'
|
6
|
+
require 'mozzn/version'
|
7
|
+
|
8
|
+
module Mozzn
|
9
|
+
class Cli < Thor
|
10
|
+
include Thor::Actions
|
11
|
+
|
12
|
+
trap(:INT) { exit 1 }
|
13
|
+
|
14
|
+
default_task :help
|
15
|
+
|
16
|
+
desc 'login', 'Login with your mozzn credentials, an interactive shell will ask you about your email and password'
|
17
|
+
# mozzn login
|
18
|
+
method_option :email, :aliases => "-u", :desc => "Mozzn email"
|
19
|
+
method_option :password, :aliases => "-p", :desc => "Mozzn password"
|
20
|
+
def login
|
21
|
+
mozzn = Mozzn::Api.new
|
22
|
+
if options[:email].nil? && options[:password].nil?
|
23
|
+
hl = HighLine.new
|
24
|
+
email = hl.ask 'Mozzn email: '
|
25
|
+
password = hl.ask('Mozzn password (we will not store this): ') { |q| q.echo = "*" }
|
26
|
+
elsif options[:email].nil? || options[:password].nil?
|
27
|
+
raise Thor::Error, "Email and password must be provided!"
|
28
|
+
else
|
29
|
+
email = options[:email]
|
30
|
+
password = options[:password]
|
31
|
+
end
|
32
|
+
params = {
|
33
|
+
user: {
|
34
|
+
email: email,
|
35
|
+
password: password
|
36
|
+
}
|
37
|
+
}
|
38
|
+
response = mozzn.post(:sessions, params)
|
39
|
+
auth_token = response['data']['auth_token']
|
40
|
+
if auth_token == nil
|
41
|
+
raise Thor::Error, response['info']
|
42
|
+
else
|
43
|
+
Mozzn::Config.new.add('token', auth_token)
|
44
|
+
say response['info'], :green
|
45
|
+
git_check
|
46
|
+
ssh_key_check
|
47
|
+
end
|
48
|
+
rescue Mozzn::Disconnected
|
49
|
+
say 'Unable to connect to Mozzn. Please check your internet connection.', :red
|
50
|
+
rescue Mozzn::UnexpectedOutput
|
51
|
+
say 'UnexpectedOutput', :red
|
52
|
+
end
|
53
|
+
|
54
|
+
desc 'add_key', 'Add your SSH Public Key directily or add its path'
|
55
|
+
method_option :public_key, :aliases => "-k", :desc => "RSA/DSA public key"
|
56
|
+
method_option :key_path, :aliases => "-p", :desc => "Path to RSA/DSA public key"
|
57
|
+
# mozzn add_key
|
58
|
+
def add_key
|
59
|
+
mozzn = Mozzn::Api.new(Mozzn::Config.new.read['token'])
|
60
|
+
if options[:key_path].present?
|
61
|
+
key_path = File.expand_path(options[:key_path])
|
62
|
+
elsif options[:public_key].present?
|
63
|
+
public_key = options[:public_key]
|
64
|
+
else
|
65
|
+
raise Thor::Error, "Neither a key path or an SSH key were provided. You must use -p or -k options."
|
66
|
+
end
|
67
|
+
|
68
|
+
if public_key.nil?
|
69
|
+
if File.exist?(key_path)
|
70
|
+
File.open(key_path, "rb") do |f|
|
71
|
+
public_key = f.read
|
72
|
+
end
|
73
|
+
else
|
74
|
+
raise Thor::Error, "Unable to read #{key_path}. File does not exist or not accessible."
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
path = 'keys'
|
79
|
+
params = {
|
80
|
+
key: {
|
81
|
+
public: public_key
|
82
|
+
}
|
83
|
+
}
|
84
|
+
response = mozzn.post(path, params)
|
85
|
+
say response['info'], :green
|
86
|
+
rescue Mozzn::Disconnected
|
87
|
+
say 'Unable to connect to Mozzn check the internet connection!', :red
|
88
|
+
rescue Mozzn::UnexpectedOutput
|
89
|
+
say 'UnexpectedOutput', :red
|
90
|
+
end
|
91
|
+
|
92
|
+
desc 'create_app APPNAME', 'create a new application'
|
93
|
+
# mozzn create_app
|
94
|
+
def create_app name = nil
|
95
|
+
mozzn = Mozzn::Api.new(Mozzn::Config.new.read['token'])
|
96
|
+
if name == nil
|
97
|
+
raise Thor::Error, "You must enter application name."
|
98
|
+
end
|
99
|
+
path = 'applications'
|
100
|
+
params = {
|
101
|
+
application: {
|
102
|
+
name: name
|
103
|
+
}
|
104
|
+
}
|
105
|
+
response = mozzn.post(path, params)
|
106
|
+
say response['info'], :green
|
107
|
+
git = Git.init
|
108
|
+
unless File.exist?('.git')
|
109
|
+
git.add(all: true)
|
110
|
+
begin
|
111
|
+
git.commit('First commit')
|
112
|
+
rescue Git::GitExecuteError => e
|
113
|
+
# Do nothing
|
114
|
+
end
|
115
|
+
end
|
116
|
+
begin
|
117
|
+
git.add_remote("mozzn", "git@git.mozzn.com:#{name}.git")
|
118
|
+
rescue Git::GitExecuteError => e
|
119
|
+
say 'You already have this remote.', :red
|
120
|
+
end
|
121
|
+
rescue Mozzn::Disconnected
|
122
|
+
say 'Unable to connect to Mozzn check the internet connection!', :red
|
123
|
+
rescue Mozzn::UnexpectedOutput
|
124
|
+
say 'UnexpectedOutput'
|
125
|
+
end
|
126
|
+
|
127
|
+
desc 'remove_app APPNAME', 'Remove spcicfic Application.'
|
128
|
+
|
129
|
+
def remove_app name = nil
|
130
|
+
mozzn = Mozzn::Api.new(Mozzn::Config.new.read['token'])
|
131
|
+
if !name.present?
|
132
|
+
raise Thor::Error, "You must enter Application Name!"
|
133
|
+
end
|
134
|
+
params = {
|
135
|
+
name: name
|
136
|
+
}
|
137
|
+
path = 'applications'
|
138
|
+
begin
|
139
|
+
response = mozzn.get(path, params)
|
140
|
+
say response['info'], :green
|
141
|
+
rescue JSON::ParserError => e
|
142
|
+
raise Thor::Error,"You do not have an application with the name #{params[:name]}. Please check the application name."
|
143
|
+
end
|
144
|
+
rescue Mozzn::Disconnected
|
145
|
+
say 'Unable to connect to Mozzn. Check your internet connection!', :red
|
146
|
+
rescue Mozzn::UnexpectedOutput
|
147
|
+
say 'UnexpectedOutput', :red
|
148
|
+
end
|
149
|
+
|
150
|
+
desc 'update', 'To show if there is an update for the CLI'
|
151
|
+
def update
|
152
|
+
# TODO after gem release https://rubygems.org/api/v1/versions/mozzn.json
|
153
|
+
@connection = Faraday.new('https://rubygems.org/api/v1/versions/coulda.json')
|
154
|
+
response = @connection.get
|
155
|
+
body = JSON.parse(response.body)
|
156
|
+
versions = body.map { |n| n['number'] }
|
157
|
+
if Gem::Version.new(versions.last) > Gem::Version.new(Mozzn::VERSION)
|
158
|
+
say 'An update is available. To install it run the following command "update gem mozzn"', :yellow
|
159
|
+
else
|
160
|
+
say 'You have the latest version.', :green
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
desc 'help COMMAND', 'For more infromation about spicific COMMAND'
|
165
|
+
def help command = nil
|
166
|
+
puts 'Primary help topics, type "mozzn help COMMAND" for more details.'
|
167
|
+
puts "Version: #{Mozzn::VERSION}"
|
168
|
+
super command
|
169
|
+
end
|
170
|
+
|
171
|
+
no_commands do
|
172
|
+
desc 'git_check', 'checks if user has git installed in $PATH or not'
|
173
|
+
def git_check
|
174
|
+
line = Cocaine::CommandLine.new("which git")
|
175
|
+
begin
|
176
|
+
output = line.run
|
177
|
+
rescue Cocaine::ExitStatusError => e
|
178
|
+
raise Thor::Error, 'Unable to find git it is either not installed or not in your $PATH. You may need to install it or add it to $PATH.'
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
desc 'ssh_key_check', 'checks if user has ssh key in ~/.ssh path'
|
183
|
+
def ssh_key_check
|
184
|
+
ssh = ['~/.ssh/id_rsa.pub','~/.ssh/id_dsa.pub']
|
185
|
+
unless ssh.map { |ssh| File.exist?(File.expand_path(ssh))}
|
186
|
+
raise Thor::Error, "Unable to find an SSH key in #{File.expand_path('~/.ssh/')}. "
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
data/lib/mozzn/config.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Mozzn
|
4
|
+
class Config
|
5
|
+
attr_accessor :data
|
6
|
+
|
7
|
+
def rc
|
8
|
+
File.expand_path("~/.mozznrc")
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
read
|
13
|
+
end
|
14
|
+
|
15
|
+
def add key, value
|
16
|
+
self.data ||= {}
|
17
|
+
self.data[key] = value
|
18
|
+
self.write
|
19
|
+
end
|
20
|
+
|
21
|
+
def read
|
22
|
+
if File.exists?(self.rc)
|
23
|
+
self.data = YAML.load_file(self.rc)
|
24
|
+
else
|
25
|
+
self.data = {}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def write
|
30
|
+
File.open(self.rc, 'w') { |f| YAML.dump(self.data, f) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def method_missing meth, *args, &block
|
34
|
+
self.data[meth.to_s] if self.data && self.data.has_key?(meth.to_s)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Object
|
2
|
+
# Copied from: https://github.com/rails/rails/blob/f4e180578c673194f58d4ff5a4a656cc51b2249e/activesupport/lib/active_support/core_ext/object/blank.rb
|
3
|
+
def blank?
|
4
|
+
respond_to?(:empty?) ? empty? : !self
|
5
|
+
end
|
6
|
+
|
7
|
+
def present?
|
8
|
+
!blank?
|
9
|
+
end
|
10
|
+
end
|
data/lib/mozzn.rb
ADDED
data/mozzn.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'mozzn/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "mozzn"
|
8
|
+
spec.version = Mozzn::VERSION
|
9
|
+
spec.authors = ["mozzn"]
|
10
|
+
spec.email = ["info@mozzn.com"]
|
11
|
+
spec.summary = %q{Command Line Interface to mozzn.}
|
12
|
+
spec.description = %q{Command Line Interface to mozzn}
|
13
|
+
spec.homepage = "http://mozzn.com"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec"
|
24
|
+
|
25
|
+
spec.add_dependency "thor"
|
26
|
+
spec.add_dependency "highline"
|
27
|
+
spec.add_dependency "faraday"
|
28
|
+
spec.add_dependency "cocaine"
|
29
|
+
spec.add_dependency "git"
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
echo -ne > README.md
|
3
|
+
echo "#Mozzn" >> README.md
|
4
|
+
echo "Command Line Interface for mozzn APIs" >> README.md
|
5
|
+
echo "##Installation" >> README.md
|
6
|
+
echo >> README.md
|
7
|
+
echo "Run the following command from your terminal:" >> README.md
|
8
|
+
echo >> README.md
|
9
|
+
echo " $ gem install mozzn" >> README.md
|
10
|
+
echo >> README.md
|
11
|
+
echo "##Usage" >> README.md
|
12
|
+
echo "###Mozzn Commands" >> README.md
|
13
|
+
mozzn help | sed -e 's/mozzn /- mozzn /g' >> README.md
|
14
|
+
echo "Detailed command usage: ">> README.md
|
15
|
+
echo >> README.md
|
16
|
+
for i in `mozzn help | grep -e '^ mozzn' | awk '{print $2}'`;do echo " $ mozzn $i" >> README.md; mozzn help $i >> README.md; echo '' >> README.md; done;
|
17
|
+
sed -i -e "s/^Primary help topics\(.*\)$//g" README.md
|
18
|
+
sed -i -e "s/^Version:\(.*\)$//g" README.md
|
19
|
+
sed -i "s/# \(.*\)$//g" README.md
|
20
|
+
sed -i "s/^$//g" README.md
|
21
|
+
sed -i -e "s/^Usage:\(.*\)$//g" README.md
|
22
|
+
sed -i -e "s/^ mozzn/####mozzn/g" README.md
|
23
|
+
sed -i -e "s/^Options:/#####Options:\r\r/g" README.md
|
24
|
+
echo "## Contributing" >> README.md
|
25
|
+
echo "1. Fork it ( http://github.com/mozzn/mozzn/fork )" >> README.md
|
26
|
+
echo "2. Create your feature branch ( git checkout -b my-new-feature)" >> README.md
|
27
|
+
echo "3. Commit your changes ( git commit -am 'Add some feature')" >> README.md
|
28
|
+
echo "4. Push to the branch ( git push origin my-new-feature)" >> README.md
|
29
|
+
echo "5. Create new Pull Request" >> README.md
|
30
|
+
|
31
|
+
|
data/spec/cli_spec.rb
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'mozzn'
|
3
|
+
|
4
|
+
def unique_name
|
5
|
+
uuid = SecureRandom.uuid
|
6
|
+
"APP#{uuid}"
|
7
|
+
end
|
8
|
+
|
9
|
+
def long_string
|
10
|
+
string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc hendrerit ultricies tortor eu posuere. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vivamus suscipit lacinia tellus, id aliquam metus commodo quis. In eget mauris felis. Integer lobortis justo id mauris ullamcorper, et scelerisque elit lobortis. Integer non iaculis tortor, nec placerat est. Donec sed urna ac augue placerat pellentesque. Aliquam placerat, leo ac mollis pharetra, libero sem dictum augue, eu imperdiet quam elit eu mi. Vestibulum imperdiet elit ligula, nec congue diam lobortis quis. Quisque sit amet pellentesque erat, at vulputate neque. Donec viverra velit non dignissim aliquet. Integer porta, augue non porttitor tincidunt, enim erat dignissim velit, quis dictum metus arcu non mauris. Duis venenatis massa et sapien tristique, ac hendrerit odio venenatis. Integer eleifend arcu dapibus, volutpat mauris ut, lacinia ante. Quisque congue, nisi eu fringilla ullamcorper, felis tortor sodales sem, euismod ullamcorper enim ligula ac ligula. Quisque eget sapien pellentesque, fringilla est sed, auctor ligula. Donec scelerisque, velit at pellentesque auctor, urna massa aliquam massa, sit amet rutrum nulla ipsum at lorem. Aenean scelerisque ante arcu, et scelerisque tellus eleifend eu. Sed sodales purus eu sodales egestas. Phasellus rhoncus nibh lacus, non tempor enim malesuada in. Nunc cursus nunc ante, ac bibendum erat pulvinar quis. Pellentesque porta gravida nulla. Etiam lobortis laoreet cursus. Sed nisi neque, pretium a consectetur ut, euismod eget est. Aenean blandit erat ante, tristique ullamcorper purus fermentum in. Fusce rhoncus dapibus mi, a auctor dolor dictum sodales. Donec elementum varius nisl a mollis. Phasellus eu metus ipsum. Nulla vel est sagittis, hendrerit mi eu, sollicitudin purus. Curabitur non ipsum pulvinar, cursus tortor a, ultrices eros. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquet molestie turpis vitae pretium. Cras dictum luctus enim, sed gravida leo dictum vel. Vestibulum a tortor erat. Nullam sit amet nulla vel odio porta luctus hendrerit dapibus ante. Mauris venenatis turpis non viverra sagittis. Aenean ligula lacus, eleifend nec tincidunt et, venenatis sed metus. Donec tempor sollicitudin congue. Vivamus nec enim vitae elit dapibus rhoncus. Praesent commodo tempor tortor, vitae congue justo gravida ut. Integer eget scelerisque purus. Aliquam vulputate porttitor neque, quis tempus urna consectetur quis. Sed sagittis vel nibh sit amet tempus. Maecenas vel velit arcu. Quisque in erat condimentum, commodo ante consequat, placerat lacus. Duis et enim in est dictum sagittis vel eu purus. Fusce vestibulum lorem adipiscing augue accumsan, id mollis est tempor. Vivamus ultrices quam non augue gravida, quis venenatis orci tincidunt. In euismod cursus scelerisque. Curabitur dignissim dapibus nibh. Maecenas sodales non eros at lacinia. Nulla blandit at sapien vel sodales. Vivamus a tempor est. Aliquam erat volutpat. Curabitur semper, purus a cursus porta, sem augue pharetra risus, eu volutpat orci massa id tortor. Maecenas varius commodo dui vel viverra. Fusce ac posuere diam. Nulla non porta sapien. Nullam magna urna, faucibus quis mauris in, convallis mollis urna. Proin id elementum felis. Suspendisse potenti. Quisque vel blandit sapien. Proin eu velit mi. Nam vestibulum pharetra nisl sit amet molestie. Praesent ut lorem est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis at sollicitudin justo. Vivamus varius, arcu quis dictum facilisis, mi lectus consequat velit, a ullamcorper mi est quis tellus. Nam tortor turpis, vestibulum eu lacus a, tristique mattis dui. Mauris sodales felis non justo vestibulum ornare. Quisque vel metus ac ipsum viverra aliquet eu placerat lacus. Aenean porttitor, arcu a hendrerit aliquet, mauris turpis pretium purus, eget commodo augue mauris eget nulla. Nunc blandit lobortis metus, ut ultricies dolor egestas a. Nullam ultricies sit amet lorem nec congue. Sed condimentum lectus adipiscing tortor mattis ullamcorper. Sed ut neque porttitor sem convallis scelerisque fermentum non quam. Nam ut rutrum tellus. Curabitur fermentum facilisis erat, id tincidunt felis blandit vel. Proin eu libero eu leo scelerisque feugiat. Donec a posuere eros. Morbi nibh leo, tristique egestas est non, tincidunt euismod est. Phasellus ut ornare erat, et placerat elit. Cras pellentesque malesuada dignissim. Pellentesque bibendum lacus neque, nec commodo mi vestibulum quis. Proin vel ultrices odio. Praesent ultrices, magna in cursus luctus, nulla nibh pellentesque elit, vitae sollicitudin turpis quam quis sapien. Nullam vitae turpis a arcu laoreet interdum. Fusce a imperdiet nulla. Donec sed nisl adipiscing, convallis diam molestie, condimentum nisi. Nunc blandit mollis tellus, sit amet fringilla urna tempor id. Sed aliquam vulputate est quis fermentum. Cras eget varius nisl. Curabitur erat tellus, tincidunt ut nisl a, iaculis aliquam urna. Proin blandit lacus neque, at viverra ipsum malesuada ut. Vestibulum vel dui vestibulum, sollicitudin enim fermentum, gravida quam. Ut felis massa, elementum eget nibh ac, ornare adipiscing quam. Nunc molestie nec dui eu mollis. Nam tincidunt dapibus lobortis. Ut posuere elit augue, et feugiat elit volutpat vitae. Cras eleifend sodales enim, in vehicula velit sodales non. Aenean a quam et libero ornare vehicula ut vitae diam. Aenean vel sem et nunc pharetra laoreet eget a neque. Fusce nibh magna, dapibus tempus nibh et, viverra imperdiet elit. Phasellus bibendum scelerisque erat, in aliquam ipsum scelerisque id. Praesent condimentum, tortor ut sagittis suscipit, eros dolor pellentesque massa, eget egestas magna turpis aliquam risus. Morbi gravida tortor eget arcu dapibus pretium. Aliquam accumsan sollicitudin vulputate. Donec dictum blandit dui nec dictum. Fusce eget rhoncus mi. Aliquam ornare rhoncus cursus. Nam quis massa massa. Phasellus nec dui sapien. Cras tempus lorem justo, quis rhoncus urna pellentesque sed. Pellentesque nisi diam, congue ut libero at, tempus ornare enim. Vestibulum nec odio ac urna facilisis porta. Quisque sed pulvinar justo. Proin pulvinar libero nec tincidunt ullamcorper. Morbi quis magna quis elit laoreet adipiscing nec quis neque. Suspendisse potenti. Suspendisse potenti. Curabitur nunc turpis, porta consequat consectetur sit amet, varius vitae erat. Morbi ac ante ultrices, aliquet felis sagittis, interdum nibh. In nulla nisi, interdum id congue sed, facilisis eu quam. Vestibulum pretium ullamcorper convallis. Pellentesque lobortis neque eu est bibendum rhoncus. Cras bibendum imperdiet nibh non dignissim. Donec porta in libero a feugiat. Duis suscipit semper interdum. Nulla quis pulvinar magna. Fusce lectus dolor, hendrerit volutpat tempus vel, malesuada non enim. Praesent consequat egestas condimentum. Vestibulum aliquam a felis non congue. Duis fringilla ultrices sapien lobortis lobortis. Etiam dui quam, interdum ut mattis et, pellentesque non dui. Praesent blandit, tortor a convallis suscipit, massa lacus lacinia lacus, a elementum augue ante eu justo. Curabitur eget nisi quis neque lacinia sollicitudin. Donec quis tincidunt augue. Sed tincidunt id elit nec fermentum. In tempor libero sit amet felis bibendum blandit. Nullam rhoncus dolor id dapibus vulputate. Etiam et suscipit arcu. Suspendisse suscipit lectus in mauris laoreet, dapibus aliquam ligula faucibus. In elit risus, venenatis a dignissim vel, congue quis sem. Proin tincidunt orci quis est facilisis, id ultricies ipsum facilisis. Sed hendrerit auctor eleifend. Cras fermentum sollicitudin enim ac molestie. Morbi ut mattis sem. Integer varius porttitor turpis. Sed lobortis rutrum velit ut feugiat. Vestibulum luctus a neque quis laoreet. Sed at purus dui. Pellentesque ac enim imperdiet diam tempus fermentum in congue diam. Nulla facilisi. Cras interdum ipsum at metus fringilla faucibus. Maecenas commodo luctus tempor. Duis at ligula lorem. Proin adipiscing urna sed dui euismod convallis. Sed eget leo ullamcorper, vulputate justo iaculis, elementum dolor. Sed vel scelerisque neque. Phasellus a laoreet mauris, nec interdum felis. Sed rhoncus massa quis velit mattis ornare. Vestibulum congue ante sed est interdum ornare. Sed accumsan nisl in enim aliquam cursus sit amet a urna. Phasellus vitae elementum nisl. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Interdum et malesuada fames ac ante ipsum primis in faucibus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque non orci dictum, egestas neque a, vestibulum neque. Aliquam et lorem vitae enim condimentum luctus at sed arcu. Aenean sit amet tortor posuere, consectetur eros at, accumsan risus. Donec iaculis ultrices nisl, et fermentum leo mollis in. Cras massa neque, cursus eu dignissim sed, vulputate hendrerit lectus. Quisque venenatis libero in justo varius eleifend. Cras malesuada iaculis nisl, a dignissim arcu elementum id. Ut bibendum, tellus vitae laoreet semper, risus augue accumsan massa, at suscipit massa justo sed nisl. Praesent gravida, orci sed lobortis pellentesque, purus neque vehicula turpis, sed molestie leo ante sit amet nibh. Aliquam vehicula odio metus, non cursus erat pretium fringilla. Suspendisse ut mattis ipsum, id luctus libero. Donec sit amet dolor a erat laoreet laoreet. Ut pharetra neque non lorem molestie, in elementum nisi lobortis. Curabitur a augue lorem. Integer at arcu orci. Mauris eget libero id odio gravida vehicula ac at magna. Vestibulum ac metus venenatis, aliquet erat vel, pharetra eros. Pellentesque quis diam tellus. Maecenas non viverra sem. Aenean quis varius nisi, vitae ultricies risus. Fusce congue nisl nisi, id lacinia augue molestie id. Cras mattis, libero ut egestas accumsan, velit ipsum dictum risus, eget eleifend dolor massa pharetra nunc. Morbi euismod enim vitae metus mattis semper. Sed ante magna, convallis sollicitudin magna vel, molestie scelerisque dui. Nam in quam quis magna interdum semper. In pellentesque, arcu sit amet aliquet congue, nisi est rhoncus elit, at pharetra enim lacus gravida urna. Praesent feugiat nisl vel accumsan aliquam. Etiam velit nisl, adipiscing non metus et, viverra fringilla mauris. Morbi ornare velit in odio volutpat venenatis. Aliquam erat volutpat. Nam sodales dictum velit consequat venenatis. Aliquam in convallis velit. Donec vitae enim tortor. Phasellus posuere dolor diam, euismod tincidunt purus elementum sed. Mauris at justo eu justo euismod dictum vel in libero. Proin ac magna eu odio ultrices ornare ac quis felis. Vivamus laoreet magna at ultrices imperdiet. Ut malesuada sodales odio sit amet mollis. Maecenas id facilisis ligula. Cras vehicula consectetur augue, eu vulputate nisi facilisis a. Aenean quis dolor sed lacus tincidunt varius sed id velit. Quisque sodales nisi at metus sagittis, id tempor orci pretium. Vivamus dapibus porttitor orci. Nulla volutpat imperdiet purus eu imperdiet. Ut laoreet dui eget purus tempor, eu blandit neque mattis. Ut eget justo gravida, mattis sapien vel, mattis magna. Aliquam fringilla iaculis erat sed eleifend. Etiam consectetur scelerisque est et euismod. Vestibulum suscipit id elit at blandit. Duis lobortis eleifend diam, ac aliquet ligula porttitor in. Fusce vitae justo metus. Etiam in condimentum est. Nullam porttitor fermentum rhoncus. Donec quis magna at enim semper facilisis. Fusce mollis a ante eu mattis. Nullam gravida lorem ut vestibulum feugiat. Duis interdum tincidunt massa quis condimentum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque purus quam, molestie vitae tempus dignissim, consectetur ut tortor. Integer non consectetur dolor. Aliquam quam purus, suscipit in libero eu, pellentesque pretium quam. In consequat et arcu sed auctor. Nulla ac mi turpis. Vestibulum imperdiet lectus turpis, at commodo tortor rutrum ut. Proin nec lorem lobortis, elementum purus ut, laoreet magna. Sed condimentum sem eget malesuada semper. In sem dui, bibendum eu nisi ac, semper commodo urna. Cras molestie nisi vel massa sodales, at aliquam leo ultricies. Curabitur sagittis quis tellus a tristique. Aenean blandit malesuada ornare. Ut ultricies tortor consectetur accumsan lobortis. Curabitur interdum enim feugiat, viverra velit vehicula, fermentum nisl. Nunc lobortis vel dui id bibendum. Suspendisse ornare diam neque, in iaculis sapien tempus at. Aenean varius laoreet interdum. Integer semper nulla lacus, eget rutrum felis hendrerit vestibulum. Nam sed vehicula diam, at porta ipsum. Pellentesque pretium orci id orci congue, nec pellentesque nulla dictum. Quisque hendrerit cursus mi. Nam non eros feugiat, vulputate nisi id, cursus tellus. Aenean facilisis est enim, et ultricies quam congue quis. Sed consectetur varius sem, sit amet pulvinar orci semper eget. Ut feugiat tincidunt sem, non dictum felis volutpat eget. Morbi imperdiet tortor a justo fringilla rutrum. Sed quis turpis ac lorem scelerisque dignissim. Ut pulvinar iaculis rutrum. Nullam sed dignissim risus, suscipit vehicula lectus. Aliquam dui enim, tincidunt ut mi in, varius imperdiet libero. Proin blandit at nibh eu pharetra. Integer ultrices nec augue sit amet fringilla. Sed sollicitudin erat eu luctus luctus. Nullam semper aliquet rutrum. Aliquam nec pretium diam. Aliquam venenatis consectetur dignissim. Sed egestas, velit et commodo dictum, neque urna aliquet tortor, nec dignissim orci sem quis felis. Aenean pharetra quis risus quis elementum. Proin ac blandit eros, at ultrices enim. Donec at turpis est. Mauris eget leo mi. Quisque aliquam ornare lacinia. Sed sed risus non urna mollis posuere quis a odio. Donec eleifend, mi ac dictum accumsan, elit neque molestie urna, et malesuada tellus arcu vel risus. Praesent placerat vel mauris sagittis venenatis. Integer massa elit, tempor fermentum sem vel, porta commodo mauris. Quisque tincidunt nulla ut nulla ornare molestie. In quis nunc pellentesque, mollis eros a, auctor ante. Aenean eros nibh, luctus ut dui et, vehicula pharetra leo. Donec velit purus, volutpat a aliquam ut, convallis quis nisi. Nunc a tellus augue. Vestibulum ante sem, tempor eu consequat eu, ultrices at sem. Aenean nec tellus mi. Donec at ante vitae odio lobortis lobortis sit amet nec dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc tellus erat, euismod vel fringilla ac, tempor a ipsum. Nulla enim purus, feugiat sed urna in, consectetur condimentum urna. Maecenas faucibus tincidunt ligula, at tincidunt sem sollicitudin a. In pharetra ante sed quam accumsan consequat. Suspendisse egestas nunc vel facilisis faucibus. Vestibulum varius semper velit vel convallis. Donec dapibus auctor ipsum vitae hendrerit. Aliquam sed placerat ligula. Nunc eu mauris tellus. Vivamus augue massa, fermentum eget ultricies ac, lacinia nec nisl. Aenean justo eros, elementum egestas tellus non, placerat tincidunt quam. Nulla facilisi. Quisque quam ante, commodo in tempus quis, fermentum nec arcu. Nunc sed lacus felis. Praesent diam lorem, consequat sed libero quis, tempor vehicula mauris. Donec imperdiet congue lacus at consectetur. Ut massa tellus, euismod quis laoreet nec, fringilla vel augue. Vestibulum sodales ligula sit amet rhoncus hendrerit. Cras tempor ante ac arcu faucibus, aliquet venenatis magna interdum. Suspendisse et felis ac mi sagittis pellentesque ut sed risus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi bibendum diam non erat dictum pellentesque. Suspendisse imperdiet gravida vestibulum. Fusce eros elit, vulputate et eleifend in, condimentum et purus. Pellentesque fermentum sapien nec ultrices rhoncus. Sed quis pulvinar nisl, nec porta ligula. Mauris sed consectetur lorem, nec eleifend urna. Etiam mollis, quam in tempor vestibulum, libero odio mollis est, vehicula lobortis lectus ligula ac urna. Curabitur placerat lacinia nunc, vitae aliquam sem commodo ac. Sed congue magna a odio dapibus, eget tristique eros mattis. Praesent tempus quis tellus eleifend facilisis. Maecenas id imperdiet nunc, et tempor odio. Cras nec dignissim augue, aliquam vehicula quam. Aenean at laoreet libero, vitae dignissim massa. Duis sed lectus ut odio viverra aliquet et nec elit. Sed viverra enim vulputate adipiscing ornare. In sit amet interdum metus, id commodo erat. Nunc ac mi ut metus ornare aliquam non quis sem. Integer vitae pulvinar enim. Fusce sed purus vehicula, scelerisque dolor in, mattis quam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed blandit arcu sit amet nisl varius condimentum id eu neque. Praesent convallis lacinia fringilla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec vitae enim tortor. Suspendisse dolor arcu, mollis sit amet cursus quis, consequat ut lectus. Duis ullamcorper ante quam, a viverra magna convallis et. Cras in luctus lectus, at porta felis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam viverra dui sit amet justo fermentum, ac mollis velit convallis. Sed et risus dui. Aenean vel felis sodales, luctus ipsum id, aliquam dui. Curabitur a ante suscipit, auctor elit ut, tempus lacus. Sed ullamcorper vulputate purus, at commodo arcu feugiat a. Ut placerat hendrerit orci, in dignissim ipsum pharetra vel. Nam fermentum leo vitae massa facilisis tincidunt. Proin varius nibh risus, ut varius metus convallis in. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies id mi vitae volutpat. Donec tempus elit orci, ac commodo nibh porta id. Suspendisse nec magna varius leo eleifend tempor. Integer iaculis odio in mi posuere aliquam. Nunc velit enim, sollicitudin vel libero sed, commodo pulvinar purus. Morbi condimentum at sem non volutpat. Praesent eget dolor non sem luctus volutpat. Maecenas a convallis quam. Donec consequat at velit ut imperdiet. Morbi vulputate felis et orci mattis, sit amet congue tellus egestas. Nulla nec orci mi. Vestibulum aliquam dolor augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras congue purus diam, non interdum nibh hendrerit et. In dignissim in mauris in viverra. Etiam sollicitudin mi sed scelerisque facilisis. Sed consequat adipiscing commodo. Fusce eu tortor ac dolor gravida convallis. Curabitur feugiat commodo nulla. Donec odio eros, varius adipiscing mi id, viverra laoreet arcu. Sed mauris turpis, aliquam eget volutpat ut, elementum nec leo. Nam erat erat, convallis sed diam eget, rutrum dignissim ligula. Aliquam rhoncus vulputate dolor et mollis. Duis nisi felis, sodales in odio in, scelerisque pellentesque magna. Nunc sagittis consequat gravida. Aliquam aliquet elit lacinia dolor euismod, id imperdiet massa rhoncus. Sed vitae vestibulum felis. Pellentesque ornare consectetur enim. Vestibulum dignissim nec velit sed pellentesque. Proin placerat nulla nibh, eu euismod magna fermentum sed. Cras ultricies mauris eget ullamcorper tincidunt. Maecenas vestibulum sem sed magna rutrum, at mattis urna iaculis. Phasellus quis molestie nisi. Nulla facilisi. Mauris risus nisi, vehicula vitae magna eget, vulputate placerat massa. Fusce suscipit sed dui eget volutpat. Donec ac accumsan turpis. Suspendisse potenti. Vestibulum cursus sapien et mi sollicitudin adipiscing. Donec convallis placerat elit, ut laoreet augue volutpat at. Vivamus non turpis nunc. In eleifend nibh consectetur nisl molestie, ac tincidunt dolor vulputate. Donec urna tortor, condimentum nec ipsum et, imperdiet vulputate mauris. Nunc ut nisi non turpis pharetra viverra. Aenean enim dolor, pellentesque sit amet sapien sit amet, placerat posuere tortor. Nunc faucibus, lorem non euismod malesuada, orci velit ultrices diam, vitae facilisis lorem nisi nec diam. Vivamus nulla felis, dignissim aliquet eros eget, vulputate condimentum leo. Sed quis congue tellus. Nam sed odio sit amet est lacinia suscipit. Sed ultrices porttitor felis vel imperdiet. Praesent pulvinar ligula ut erat iaculis, non sollicitudin erat volutpat. Proin ac laoreet quam, id placerat tellus. Cras eu semper velit. Curabitur porttitor lectus vel sem lacinia, ullamcorper feugiat lorem sodales. Quisque porta eros orci, vitae pellentesque quam interdum vitae. Suspendisse potenti. Morbi venenatis sodales ullamcorper. Fusce lectus augue, vestibulum id consequat elementum, pellentesque eget lorem. Nam sed massa diam. In feugiat at ipsum commodo faucibus. Pellentesque tempor metus feugiat lacinia porta. Sed malesuada sapien eget nunc volutpat porta. Sed tincidunt porta turpis at porta. Donec id magna quis elit vestibulum varius a in tortor. Mauris sed dignissim mi. Aenean dignissim, nulla quis hendrerit sagittis, metus turpis rutrum quam, id bibendum orci ipsum id turpis. Etiam mattis lorem in dui pretium semper. Phasellus ornare, lacus non porta dapibus, orci neque mattis felis, eu varius turpis ante nec sem. Vivamus in eros ultrices, gravida erat ut, sodales lacus. Curabitur vel bibendum leo, consectetur vehicula nulla. Aenean eu enim sapien. Aenean sagittis commodo libero, at rhoncus enim laoreet a. Fusce leo felis, malesuada ut est at, dapibus molestie orci. In imperdiet fermentum lacinia. Nam accumsan hendrerit imperdiet. Nullam quis elit in mauris imperdiet aliquam. Morbi ac sapien sodales, volutpat neque a, imperdiet lacus. Pellentesque bibendum augue nec purus egestas, ac aliquet nisl pharetra. Donec imperdiet accumsan nunc, a laoreet nunc feugiat nec. Pellentesque aliquam massa sapien, nec sollicitudin dolor scelerisque vitae. Aliquam posuere dignissim egestas. Fusce malesuada egestas scelerisque. Sed tellus lectus, accumsan non luctus tincidunt, consectetur non felis. Vestibulum ac neque purus. In vehicula sit amet sapien vel elementum. Mauris luctus pellentesque cursus. Aenean eget purus eu nibh tempor auctor eu non tortor. Aliquam mi odio, dignissim ut leo id, consequat tincidunt libero. Sed vitae fermentum est, nec vestibulum lorem. Donec interdum nisi in sem elementum iaculis. Suspendisse sagittis magna quis sem consectetur, nec lobortis est suscipit. Mauris pharetra leo eget arcu feugiat, tempus vehicula orci malesuada. Phasellus metus magna, varius sed nunc et, adipiscing euismod orci. Quisque in dui metus. Cras augue dolor, fringilla at bibendum id, faucibus in ante. Aliquam aliquam, tellus quis ultrices adipiscing, felis nibh porttitor arcu, et laoreet dolor nisl id nisl. Pellentesque dignissim eget purus in dapibus. Ut porttitor felis sed pellentesque dictum. Aenean a lacus cursus, laoreet sapien sit amet, molestie quam. Fusce lacus metus, porta sed lectus nec, laoreet pellentesque sem. Integer congue velit tortor, sit amet tristique ipsum lobortis quis. Vestibulum viverra adipiscing nulla nec pellentesque. Cras sollicitudin ut sapien ac tempor. Sed eleifend, sapien vitae pharetra mattis, nunc mauris volutpat libero, a pretium leo massa sit amet ligula. Fusce malesuada velit at felis tempor rhoncus. Quisque arcu metus, lacinia nec bibendum id, accumsan in tellus. Praesent congue orci non dolor rhoncus consectetur. Cras feugiat porttitor lorem, nec iaculis neque vulputate at. Ut vel elementum justo, non porta tellus. Nam dignissim commodo suscipit. Donec hendrerit tristique sapien, ac tincidunt magna tincidunt ac. Quisque eget purus ultricies, convallis dolor at, sagittis mauris. Suspendisse faucibus, ante eu congue iaculis, augue quam dictum diam, nec pellentesque ipsum sem ac nunc. Curabitur quis luctus ligula, semper ullamcorper magna. Nullam sit amet erat feugiat, gravida tellus interdum, accumsan elit. In velit mauris, tempor et massa gravida, molestie varius diam. In rutrum at sapien vel accumsan. Curabitur eu velit eu risus commodo ullamcorper vitae at diam. Vivamus sit amet porta orci. Maecenas lorem massa, porttitor nec ante auctor, fringilla rhoncus arcu. Integer faucibus, nulla commodo congue accumsan, erat ligula ullamcorper eros, eget cursus eros nisl id leo. Fusce suscipit diam nec lectus sollicitudin, id vulputate elit hendrerit. Quisque facilisis auctor scelerisque. Integer lectus nulla, ultrices non eros at, elementum viverra turpis. Cras rutrum enim non euismod scelerisque. Duis tempor hendrerit eros ut fringilla. Quisque imperdiet purus quis sapien bibendum, sed tincidunt augue bibendum. Nulla luctus viverra urna, sit amet auctor nibh gravida sollicitudin. Aliquam volutpat nunc sit amet quam imperdiet rutrum. Sed eget dolor quis felis tincidunt malesuada. Morbi blandit consequat hendrerit. Donec venenatis tortor et dui blandit pellentesque. Nullam ut felis nisi. Donec vel semper lectus. Praesent imperdiet, nulla et mattis laoreet, ipsum eros elementum quam, at lacinia tellus arcu a enim. Nullam adipiscing at arcu vel rutrum. Integer nec diam blandit, accumsan urna vitae, dignissim nunc. Donec viverra est quis fermentum elementum. Aliquam interdum odio a elementum porta. Proin non accumsan nunc. Pellentesque tincidunt odio accumsan odio ultrices auctor. Cras non eleifend mauris. Sed id faucibus diam, ut pellentesque leo. Sed in orci non nunc varius luctus non nec dolor. Morbi fringilla et augue vel imperdiet. Aenean ante erat, tincidunt sed purus quis, tristique aliquam leo. Proin sed nisl placerat, aliquam neque et, dignissim lorem. Proin placerat euismod odio eu lobortis. Nam sit amet nisi vel est iaculis vestibulum vitae ac leo. In euismod tellus at mi fringilla, sit amet blandit nulla lacinia. Nullam posuere venenatis venenatis. Integer vel tortor cursus, facilisis est vel, semper enim. Vestibulum at pharetra massa. Donec in auctor augue. Morbi facilisis dignissim sapien, vitae consequat dolor vulputate in. Integer ut erat ultrices, eleifend sapien blandit, fringilla mi. Sed odio augue, placerat eget cursus sed, consequat vitae turpis. Curabitur sed tristique sapien. Integer porttitor eget odio quis sodales. Cras ornare, velit auctor dapibus ultricies, turpis mi dignissim neque, ultrices faucibus arcu libero tempor urna. Ut eu rutrum nisl. Mauris scelerisque nunc sed cursus lobortis. Proin eget cursus est, et aliquam tellus. Suspendisse in dictum purus, a venenatis urna. Aliquam erat volutpat. Phasellus dapibus metus nec lacus pulvinar euismod. Duis sollicitudin massa sapien, at tincidunt nisl placerat id. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec nec lacus augue. Curabitur facilisis, erat id fringilla ultricies, urna ipsum pulvinar arcu, vitae laoreet quam risus quis metus. In auctor turpis molestie quam molestie tempor. Suspendisse quis rhoncus orci. Phasellus vel enim mi. Praesent cursus non turpis at mollis. Mauris condimentum, risus ut auctor eleifend, justo nunc semper ante, quis egestas dui felis ac dolor. Morbi laoreet quam sit amet mauris dictum auctor. Vestibulum auctor sodales erat viverra suscipit. Quisque ac ipsum faucibus magna aliquam semper non eget leo. Suspendisse ut quam posuere, auctor diam a, posuere leo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin dignissim semper ante, vel pretium orci tincidunt ac. Suspendisse blandit interdum massa, sit amet scelerisque lacus faucibus sit amet. Donec vitae rutrum odio. Nam mi enim, facilisis sed odio vitae, adipiscing eleifend tellus. Praesent non massa pellentesque, gravida ipsum nec, ullamcorper odio. Morbi vitae felis nulla. Fusce eu tincidunt ante. Vestibulum pretium hendrerit eros, et imperdiet tortor sodales ac. Vestibulum sodales sem vel arcu ullamcorper, sed tempus purus placerat. Cras adipiscing arcu quam, at euismod tortor imperdiet eget. Quisque sed lectus felis. Donec hendrerit, nisi sit amet blandit tempus, sapien arcu iaculis tortor, a viverra dolor justo ac felis. Maecenas euismod quam ultrices pellentesque fringilla. Donec lobortis vulputate lectus at molestie. Pellentesque fringilla ornare sapien egestas ultrices. Integer pulvinar dui in augue elementum convallis. Nulla tempus adipiscing nisi. Morbi in vestibulum arcu. Integer condimentum consequat pulvinar. Maecenas consectetur ut urna sed vehicula. Mauris vitae justo eu dolor sollicitudin tristique. Etiam nec porttitor lacus, nec sagittis turpis. Cras semper ipsum ut sollicitudin tempor. Proin placerat sem nec blandit varius. Fusce in nibh non nulla aliquet dignissim. Sed tempus sed neque id tristique. Sed eget interdum neque, convallis luctus ligula. Morbi a arcu a lectus posuere lobortis eu id velit. Nunc sed vehicula velit, eget pellentesque enim. Donec fringilla rhoncus pellentesque. Ut ullamcorper mi est, ac tristique ante ultrices et. Mauris consectetur massa ut pretium blandit. Phasellus at massa sit amet diam pretium blandit non eu est. Ut odio arcu, interdum porttitor tristique dignissim, rhoncus ut risus. Nulla eu orci nec tellus dignissim pellentesque sed id nibh. Suspendisse porta quam quis erat mattis, vitae mattis tellus fermentum. Aliquam erat volutpat. Cras molestie erat augue, sit amet tempus ante lacinia quis. Integer tristique erat rhoncus malesuada varius. Nulla vel felis id orci viverra suscipit eget in leo. Sed facilisis purus id ipsum vestibulum, eget tincidunt metus lacinia. Donec leo arcu, volutpat a ultricies id, cursus sed eros. Vestibulum viverra sapien at augue pharetra faucibus. Curabitur consequat pulvinar arcu, vitae aliquet leo. Suspendisse vel suscipit risus, quis vehicula nisl. Vivamus eget felis metus. Curabitur at dapibus eros, non sollicitudin nulla. Nunc fringilla rhoncus ipsum quis viverra."
|
11
|
+
end
|
12
|
+
|
13
|
+
describe Mozzn::Cli do
|
14
|
+
before :each do
|
15
|
+
@cli = Mozzn::Cli.new
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "mozzn create_app" do
|
19
|
+
describe "with valid params" do
|
20
|
+
it "returns Application created successfuly" do
|
21
|
+
output = capture(:stdout) { @cli.create_app "#{unique_name}"}
|
22
|
+
one,two = output.split("\n")
|
23
|
+
expect(one).to match('Application created successfuly')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "with invalid params" do
|
28
|
+
it "returns creating faild " do
|
29
|
+
output = capture(:stdout) { @cli.create_app "App name"}
|
30
|
+
one,two = output.split("\n")
|
31
|
+
expect(one).to match('creating faild')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "without params " do
|
36
|
+
it "returns You must enter Application Name! " do
|
37
|
+
expect { @cli.create_app }.to raise_error(Thor::Error, "You must enter application name.")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "mozzn add_key" do
|
43
|
+
describe "with valid SSH key" do
|
44
|
+
it "returns SSH key created" do
|
45
|
+
@cli.options = {public_key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXwZsqptW/1sxBvT6FAukbGsDKzqoBwwaAj6yUgM1ygdupF3NHhpf3huenu9X09SQTjvGDUjLCn6MgIREumrn3JaIEceqRVI5wtAd2c8S1kwJxZLYqTJT4iifW/ydTocz94FADwrLYWHIjlGLh/FY6xDHhloL0Ymvv+iiEg4cWhdC23zenEUOBS7khnw2FeXxLag4/tcinEYR1+Z3PrhRvfg964Rlf1BdspRwuF26GbiRqgo2M1bj9tBH5PZyL17R06adOpBAh1UzT8X9qSXi9OYE9C2HDIGH3MRpCdpJWU36FWqg8iG/DnFzlxzheRJ78A5R8WdDL2oMFE/BrkM9d'}
|
46
|
+
output = capture(:stdout) { @cli.add_key }
|
47
|
+
expect(output).to match('SSH key created')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "with invalid SSH key" do
|
52
|
+
it "returns SSH key created" do
|
53
|
+
@cli.options = {public_key: 'invalid_public_key'}
|
54
|
+
output = capture(:stdout) { @cli.add_key }
|
55
|
+
expect(output).to match('creating faild')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "with valid SSH key path" do
|
60
|
+
it "returns SSH key created" do
|
61
|
+
@cli.options = {key_path: '~/.ssh/id_rsa.pub'}
|
62
|
+
output = capture(:stdout) { @cli.add_key }
|
63
|
+
expect(output).to match('SSH key created')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "with invalid SSH key path" do
|
68
|
+
it "returns Unable to read /invalid_path, file does not exist or not accessible!" do
|
69
|
+
@cli.options = {key_path: '/invalid_path'}
|
70
|
+
expect { @cli.add_key }.to raise_error(Thor::Error, "Unable to read /invalid_path. File does not exist or not accessible.")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "without params " do
|
75
|
+
it "returns You must enter an SSH key path or a public SSH key!" do
|
76
|
+
expect { @cli.add_key }.to raise_error(Thor::Error, "Neither a key path or an SSH key were provided. You must use -p or -k options.")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "mozzn login" do
|
82
|
+
describe "with valid params " do
|
83
|
+
it "returns Successfully logged in." do
|
84
|
+
@cli.options = {
|
85
|
+
email: 'rania@overcstudios.com',
|
86
|
+
password: '12345678'
|
87
|
+
}
|
88
|
+
output = capture(:stdout) { @cli.login }
|
89
|
+
output.chomp!
|
90
|
+
expect(output).to match("Successfully logged in.")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "with long_string email and password " do
|
95
|
+
it "returns Invalid email or password." do
|
96
|
+
@cli.options = {
|
97
|
+
email: long_string,
|
98
|
+
password: long_string
|
99
|
+
}
|
100
|
+
expect { @cli.login }.to raise_error(Thor::Error, "Invalid email or password.")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "with invalid params " do
|
105
|
+
it "returns Invalid email or password." do
|
106
|
+
@cli.options = {
|
107
|
+
email: 'invalid@example.com',
|
108
|
+
password: '12345678'
|
109
|
+
}
|
110
|
+
expect { @cli.login }.to raise_error(Thor::Error, "Invalid email or password.")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "with nil params " do
|
115
|
+
it "returns Invalid email or password." do
|
116
|
+
@cli.options = {
|
117
|
+
email: '',
|
118
|
+
password: ''
|
119
|
+
}
|
120
|
+
expect { @cli.login }.to raise_error(Thor::Error, "Invalid email or password.")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe "without email " do
|
125
|
+
it "returns Email and password must be provided! " do
|
126
|
+
@cli.options = {
|
127
|
+
password: '12345678'
|
128
|
+
}
|
129
|
+
expect { @cli.login }.to raise_error(Thor::Error, "Email and password must be provided!")
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe "without password " do
|
134
|
+
it "returns Email and password must be provided! " do
|
135
|
+
@cli.options = {
|
136
|
+
email: 'rania@overcstudios.com'
|
137
|
+
}
|
138
|
+
expect { @cli.login }.to raise_error(Thor::Error, "Email and password must be provided!")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
describe "with no params " do
|
143
|
+
it "returns an interactive shell asking for email and password" do
|
144
|
+
pending
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
describe "mozzn update" do
|
149
|
+
describe "with avilable updates" do
|
150
|
+
it "returns An update is available" do
|
151
|
+
pending
|
152
|
+
end
|
153
|
+
end
|
154
|
+
describe "with no avilable updates" do
|
155
|
+
it "returns You have the latest version." do
|
156
|
+
pending
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'rspec'
|
3
|
+
|
4
|
+
Bundler.setup
|
5
|
+
|
6
|
+
# Copied from: https://github.com/erikhuda/thor/blob/master/spec/helper.rb#L49
|
7
|
+
|
8
|
+
def capture(stream)
|
9
|
+
begin
|
10
|
+
stream = stream.to_s
|
11
|
+
eval "$#{stream} = StringIO.new"
|
12
|
+
yield
|
13
|
+
result = eval("$#{stream}").string
|
14
|
+
ensure
|
15
|
+
eval("$#{stream} = #{stream.upcase}")
|
16
|
+
end
|
17
|
+
|
18
|
+
result
|
19
|
+
end
|
20
|
+
|
21
|
+
RSpec.configure do |config|
|
22
|
+
config.color_enabled = true
|
23
|
+
config.order = 'random'
|
24
|
+
config.filter_run focused: true
|
25
|
+
|
26
|
+
config.filter_run_excluding disabled: true
|
27
|
+
|
28
|
+
config.run_all_when_everything_filtered = true
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,177 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mozzn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- mozzn
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.5'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: thor
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: highline
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: faraday
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: cocaine
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: git
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: Command Line Interface to mozzn
|
126
|
+
email:
|
127
|
+
- info@mozzn.com
|
128
|
+
executables:
|
129
|
+
- mozzn
|
130
|
+
extensions: []
|
131
|
+
extra_rdoc_files: []
|
132
|
+
files:
|
133
|
+
- .gitignore
|
134
|
+
- Gemfile
|
135
|
+
- LICENSE.txt
|
136
|
+
- README.md
|
137
|
+
- Rakefile
|
138
|
+
- bin/mozzn
|
139
|
+
- lib/mozzn.rb
|
140
|
+
- lib/mozzn/api.rb
|
141
|
+
- lib/mozzn/cli.rb
|
142
|
+
- lib/mozzn/config.rb
|
143
|
+
- lib/mozzn/exceptions.rb
|
144
|
+
- lib/mozzn/extensions.rb
|
145
|
+
- lib/mozzn/version.rb
|
146
|
+
- mozzn.gemspec
|
147
|
+
- scripts/generate_readme.sh
|
148
|
+
- spec/cli_spec.rb
|
149
|
+
- spec/spec_helper.rb
|
150
|
+
homepage: http://mozzn.com
|
151
|
+
licenses:
|
152
|
+
- MIT
|
153
|
+
metadata: {}
|
154
|
+
post_install_message:
|
155
|
+
rdoc_options: []
|
156
|
+
require_paths:
|
157
|
+
- lib
|
158
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
159
|
+
requirements:
|
160
|
+
- - '>='
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: '0'
|
163
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - '>='
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
requirements: []
|
169
|
+
rubyforge_project:
|
170
|
+
rubygems_version: 2.0.3
|
171
|
+
signing_key:
|
172
|
+
specification_version: 4
|
173
|
+
summary: Command Line Interface to mozzn.
|
174
|
+
test_files:
|
175
|
+
- spec/cli_spec.rb
|
176
|
+
- spec/spec_helper.rb
|
177
|
+
has_rdoc:
|