mozzn 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mozzn.gemspec
4
+ gemspec
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
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require 'mozzn'
3
+
4
+ # Start our command line interface
5
+ Mozzn.start
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
@@ -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,4 @@
1
+ module Mozzn
2
+ class Disconnected < Exception; end
3
+ class UnexpectedOutput < Exception; end
4
+ 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
@@ -0,0 +1,3 @@
1
+ module Mozzn
2
+ VERSION = "0.1.0"
3
+ end
data/lib/mozzn.rb ADDED
@@ -0,0 +1,15 @@
1
+ require "mozzn/extensions"
2
+ require "mozzn/version"
3
+ require 'mozzn/config'
4
+ require 'mozzn/api'
5
+ require 'mozzn/cli'
6
+
7
+
8
+ module Mozzn
9
+ class << self
10
+ def start
11
+ # Invoke our CLI
12
+ Mozzn::Cli.start
13
+ end
14
+ end
15
+ end
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
@@ -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: