shoelaces 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +11 -0
  5. data/CONTRIBUTING.md +37 -0
  6. data/Gemfile +3 -0
  7. data/Gemfile.lock +131 -0
  8. data/LICENSE +21 -0
  9. data/README.md +211 -0
  10. data/Rakefile +8 -0
  11. data/bin/rake +16 -0
  12. data/bin/rspec +16 -0
  13. data/bin/setup +13 -0
  14. data/bin/shoelaces +13 -0
  15. data/lib/shoelaces.rb +4 -0
  16. data/lib/shoelaces/actions.rb +29 -0
  17. data/lib/shoelaces/app_builder.rb +437 -0
  18. data/lib/shoelaces/generators/app_generator.rb +233 -0
  19. data/lib/shoelaces/version.rb +5 -0
  20. data/shoelaces.gemspec +53 -0
  21. data/spec/fakes/bin/heroku +5 -0
  22. data/spec/fakes/bin/hub +5 -0
  23. data/spec/features/github_spec.rb +10 -0
  24. data/spec/features/heroku_spec.rb +19 -0
  25. data/spec/features/new_project_spec.rb +77 -0
  26. data/spec/spec_helper.rb +24 -0
  27. data/spec/support/fake_github.rb +21 -0
  28. data/spec/support/fake_heroku.rb +38 -0
  29. data/spec/support/shoelaces.rb +49 -0
  30. data/templates/Gemfile.erb +63 -0
  31. data/templates/Guardfile +33 -0
  32. data/templates/Procfile +2 -0
  33. data/templates/README.md.erb +34 -0
  34. data/templates/_analytics.html.erb +7 -0
  35. data/templates/_flashes.html.erb +7 -0
  36. data/templates/_javascript.html.erb +12 -0
  37. data/templates/_variables.scss +2 -0
  38. data/templates/about.html.erb.erb +67 -0
  39. data/templates/action_mailer.rb +5 -0
  40. data/templates/application.css.scss +18 -0
  41. data/templates/background_jobs_rspec.rb +19 -0
  42. data/templates/bin_setup.erb +34 -0
  43. data/templates/config_locales_en.yml +16 -0
  44. data/templates/contact.html.erb.erb +67 -0
  45. data/templates/database_cleaner_rspec.rb +21 -0
  46. data/templates/development_seeds.rb +12 -0
  47. data/templates/disable_xml_params.rb +3 -0
  48. data/templates/errors.rb +34 -0
  49. data/templates/factory_girl_rspec.rb +3 -0
  50. data/templates/high_voltage.rb +3 -0
  51. data/templates/home.html.erb.erb +16 -0
  52. data/templates/i18n.rb +3 -0
  53. data/templates/newrelic.yml.erb +34 -0
  54. data/templates/noise.png +0 -0
  55. data/templates/postgresql_database.yml.erb +12 -0
  56. data/templates/rack_timeout.rb +1 -0
  57. data/templates/sample.env +3 -0
  58. data/templates/secrets.yml +14 -0
  59. data/templates/shoelaces_gitignore +13 -0
  60. data/templates/shoelaces_layout.html.erb.erb +25 -0
  61. data/templates/shoelaces_layout_footer.html.erb.erb +11 -0
  62. data/templates/shoelaces_layout_header.html.erb.erb +33 -0
  63. data/templates/smtp.rb +9 -0
  64. data/templates/spec_helper.rb +30 -0
  65. data/templates/staging.rb +5 -0
  66. data/templates/travis.yml.erb +24 -0
  67. data/templates/unicorn.rb +30 -0
  68. metadata +232 -0
@@ -0,0 +1,38 @@
1
+ class FakeHeroku
2
+ RECORDER = File.expand_path(File.join('..', '..', 'tmp', 'heroku_commands'), File.dirname(__FILE__))
3
+
4
+ def initialize(args)
5
+ @args = args
6
+ end
7
+
8
+ def run!
9
+ File.open(RECORDER, 'a') do |file|
10
+ file.puts @args.join(' ')
11
+ end
12
+ end
13
+
14
+ def self.clear!
15
+ FileUtils.rm_rf RECORDER
16
+ end
17
+
18
+ def self.has_gem_included?(project_path, gem_name)
19
+ gemfile = File.open(File.join(project_path, 'Gemfile'), 'a')
20
+
21
+ File.foreach(gemfile).any? do |line|
22
+ line.match(/#{Regexp.quote(gem_name)}/)
23
+ end
24
+ end
25
+
26
+ def self.has_created_app_for?(remote_name)
27
+ app_name = "#{ShoelacesTestHelpers::APP_NAME}-#{remote_name}"
28
+ expected_line = "create #{app_name} --remote=#{remote_name}\n"
29
+
30
+ File.foreach(RECORDER).any? { |line| line == expected_line }
31
+ end
32
+
33
+ def self.has_configured_vars?(remote_name, var)
34
+ File.foreach(RECORDER).any? do |line|
35
+ line =~ /^config:add #{var}=.+ --remote=#{remote_name}\n$/
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,49 @@
1
+ module ShoelacesTestHelpers
2
+ APP_NAME = 'dummy'
3
+
4
+ def remove_project_directory
5
+ FileUtils.rm_rf(project_path)
6
+ end
7
+
8
+ def create_tmp_directory
9
+ FileUtils.mkdir_p(tmp_path)
10
+ end
11
+
12
+ def run_shoelaces(arguments = nil)
13
+ Dir.chdir(tmp_path) do
14
+ Bundler.with_clean_env do
15
+ ENV['TESTING'] = '1'
16
+
17
+ %x(#{shoelaces_bin} #{APP_NAME} #{arguments})
18
+ end
19
+ end
20
+ end
21
+
22
+ def drop_dummy_database
23
+ if File.exists?(project_path)
24
+ Dir.chdir(project_path) do
25
+ Bundler.with_clean_env do
26
+ `rake db:drop`
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ def project_path
33
+ @project_path ||= Pathname.new("#{tmp_path}/#{APP_NAME}")
34
+ end
35
+
36
+ private
37
+
38
+ def tmp_path
39
+ @tmp_path ||= Pathname.new("#{root_path}/tmp")
40
+ end
41
+
42
+ def shoelaces_bin
43
+ File.join(root_path, 'bin', 'shoelaces')
44
+ end
45
+
46
+ def root_path
47
+ File.expand_path('../../../', __FILE__)
48
+ end
49
+ end
@@ -0,0 +1,63 @@
1
+ source "https://rubygems.org"
2
+
3
+ ruby "<%= Shoelaces::RUBY_VERSION %>"
4
+
5
+ gem "airbrake"
6
+ gem 'bootstrap-sass'
7
+ gem "coffee-rails"
8
+ gem "delayed_job_active_record"
9
+ gem "email_validator"
10
+ gem "high_voltage"
11
+ gem "jquery-rails"
12
+ gem 'paperclip', '~> 3.0'
13
+ gem "pg"
14
+ gem "rack-timeout"
15
+ gem "rails", "<%= Shoelaces::RAILS_VERSION %>"
16
+ gem "recipient_interceptor"
17
+ gem "sass-rails", "~> 4.0.3"
18
+ gem "simple_form"
19
+ gem "title"
20
+ gem "uglifier"
21
+ gem "unicorn"
22
+
23
+ # gem 'devise'
24
+ # gem 'omniauth-facebook'
25
+ # gem 'omniauth-twitter'
26
+ # gem 'twitter'
27
+ # gem 'fb_graph'
28
+ # gem 'cancan'
29
+
30
+ group :development do
31
+ gem "spring"
32
+ gem "spring-commands-rspec"
33
+
34
+ gem 'guard'
35
+ gem 'guard-rspec', require: false
36
+ gem 'guard-livereload', require: false
37
+ gem 'rack-livereload'
38
+ gem 'terminal-notifier-guard'
39
+ end
40
+
41
+ group :development, :test do
42
+ gem "awesome_print"
43
+ gem "byebug"
44
+ gem "dotenv-rails"
45
+ gem "factory_girl_rails"
46
+ gem "pry-rails"
47
+ gem "rspec-rails", "~> 3.0.0"
48
+ end
49
+
50
+ group :test do
51
+ gem "capybara-webkit", ">= 1.2.0"
52
+ gem "database_cleaner"
53
+ gem "formulaic"
54
+ gem "launchy"
55
+ gem "shoulda-matchers", require: false
56
+ gem "timecop"
57
+ gem "webmock"
58
+ end
59
+
60
+ group :staging, :production do
61
+ gem "newrelic_rpm", ">= 3.7.3"
62
+ # gem 'aws-sdk', '~> 1.5.7'
63
+ end
@@ -0,0 +1,33 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'livereload' do
5
+ watch(%r{app/views/.+\.(erb|haml|slim)$})
6
+ watch(%r{app/helpers/.+\.rb})
7
+ watch(/public\/.+\.(css|js|html)/)
8
+ watch(%r{config/locales/.+\.yml})
9
+
10
+ # Rails Assets Pipeline
11
+ watch(%r{(app|vendor)(/assets/\w+/(.+\.(css|js|html|png|jpg|erb))).*}) { |m| "/assets/#{m[3]}" }
12
+ end
13
+
14
+ guard :rspec do
15
+ watch(/^app\/(.+)\.rb$/) { |m| "spec/#{m[1]}_spec.rb" }
16
+ watch(/^app\/(.*)(\.erb|\.haml|\.slim)$/) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
17
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb" }
18
+ watch(%r{^spec/support/(.+)\.rb$}) { 'spec' }
19
+ watch('config/routes.rb') { 'spec/routing' }
20
+ watch('app/controllers/application_controller.rb') { 'spec/controllers' }
21
+ end
22
+
23
+ notification(
24
+ :tmux,
25
+ display_message: true,
26
+ timeout: 5,
27
+ # the first %s will show the title, the second the message
28
+ # Alternately you can also configure *success_message_format*,
29
+ # *pending_message_format*, *failed_message_format*
30
+ default_message_format: '%s >> %s',
31
+ line_separator: ' > ',
32
+ color_location: 'status-left-fg'
33
+ )
@@ -0,0 +1,2 @@
1
+ web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
2
+ worker: bundle exec rake jobs:work
@@ -0,0 +1,34 @@
1
+ <%= app_name.humanize %>
2
+ <%= '=' * app_name.humanize.length %>
3
+
4
+ Getting Started
5
+ ---------------
6
+
7
+ This repository comes equipped with a self-setup script:
8
+
9
+ % ./bin/setup
10
+
11
+ It assumes you have a machine equipped with Ruby, Postgres, etc. If not, set up
12
+ your machine with [this script].
13
+
14
+ [this script]: https://github.com/jonr22/laptop
15
+
16
+ After setting up, you can run the application using [foreman]:
17
+
18
+ % foreman start
19
+
20
+ If you don't have `foreman`, see [Foreman's install instructions][foreman]. It
21
+ is [purposefully excluded from the project's `Gemfile`][exclude].
22
+
23
+ [foreman]: https://github.com/ddollar/foreman
24
+ [exclude]: https://github.com/ddollar/foreman/pull/437#issuecomment-41110407
25
+
26
+ Guidelines
27
+ ----------
28
+
29
+ Use the following guides for getting things done, programming well, and
30
+ programming in style.
31
+
32
+ * [Protocol](http://github.com/thoughtbot/guides/blob/master/protocol)
33
+ * [Best Practices](http://github.com/thoughtbot/guides/blob/master/best-practices)
34
+ * [Style](http://github.com/thoughtbot/guides/blob/master/style)
@@ -0,0 +1,7 @@
1
+ <% if ENV["SEGMENT_IO_KEY"] %>
2
+ <script type="text/javascript">
3
+ window.analytics=window.analytics||[],window.analytics.methods=["identify","group","track","page","pageview","alias","ready","on","once","off","trackLink","trackForm","trackClick","trackSubmit"],window.analytics.factory=function(t){return function(){var a=Array.prototype.slice.call(arguments);return a.unshift(t),window.analytics.push(a),window.analytics}};for(var i=0;i<window.analytics.methods.length;i++){var key=window.analytics.methods[i];window.analytics[key]=window.analytics.factory(key)}window.analytics.load=function(t){if(!document.getElementById("analytics-js")){var a=document.createElement("script");a.type="text/javascript",a.id="analytics-js",a.async=!0,a.src=("https:"===document.location.protocol?"https://":"http://")+"cdn.segment.io/analytics.js/v1/"+t+"/analytics.min.js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(a,n)}},window.analytics.SNIPPET_VERSION="2.0.9",
4
+ window.analytics.load("<%= ENV["SEGMENT_IO_KEY"] %>");
5
+ window.analytics.page();
6
+ </script>
7
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <% if flash.any? %>
2
+ <div id="flash">
3
+ <% flash.each do |key, value| -%>
4
+ <div id="flash_<%= key %>"><%= value %></div>
5
+ <% end -%>
6
+ </div>
7
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <%= javascript_include_tag :application %>
2
+
3
+ <%= yield :javascript %>
4
+
5
+ <%= render "analytics" %>
6
+
7
+ <% if Rails.env.test? %>
8
+ <%= javascript_tag do %>
9
+ $.fx.off = true;
10
+ $.ajaxSetup({ async: false });
11
+ <% end %>
12
+ <% end %>
@@ -0,0 +1,2 @@
1
+ $gray: #333;
2
+ $light-gray: #a0a0a0;
@@ -0,0 +1,67 @@
1
+ <div class="container-fluid">
2
+ <div class="page-header">
3
+ <h1>About Us <small>Everything you ever wanted to know about <%=app_name%></small></h1>
4
+ </div>
5
+
6
+ <div class="panel panel-default">
7
+ <div class="panel-body">
8
+ <p>
9
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut felis
10
+ mi. Vestibulum varius imperdiet justo at pellentesque. Donec lacinia
11
+ vel sapien sed iaculis. Etiam vitae gravida arcu. Pellentesque
12
+ condimentum viverra ligula, sed euismod neque porta vitae. Curabitur
13
+ fermentum nulla ac sem imperdiet, quis sollicitudin tortor scelerisque.
14
+ Nulla laoreet nisi sapien, in ornare dui suscipit vitae. Vestibulum
15
+ consectetur venenatis diam vitae sollicitudin. Donec tempus mi massa,
16
+ non tristique nunc vestibulum ac. Etiam at diam at lorem malesuada
17
+ tempus. Aenean mollis dui eget libero consequat, a euismod ante iaculis.
18
+ Maecenas id pretium est. Nam ultricies leo ac metus sagittis
19
+ consectetur. Quisque ut libero urna.
20
+ </p>
21
+
22
+ <p>
23
+ Fusce rhoncus tellus vitae pretium rhoncus. Ut eu ante luctus, commodo
24
+ lectus vel, eleifend quam. Proin ipsum quam, tempor sed nisi eu, auctor
25
+ volutpat lorem. Sed in nunc vel erat rhoncus facilisis. Phasellus et
26
+ elit ac nisl molestie rhoncus. Vivamus id justo ultrices neque bibendum
27
+ laoreet. Mauris scelerisque quam vitae velit lacinia placerat. Sed non
28
+ aliquet magna, vel dapibus nisl. In nec lorem lorem. Cras vitae volutpat
29
+ lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
30
+ a posuere erat, sit amet tristique libero. Donec sit amet lobortis est,
31
+ et tempus erat. Nulla semper urna ut purus tincidunt, quis consectetur
32
+ lacus fermentum.
33
+ </p>
34
+ </div>
35
+ </div>
36
+
37
+ <div class="panel panel-default">
38
+ <div class="panel-body">
39
+ <p>
40
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut felis
41
+ mi. Vestibulum varius imperdiet justo at pellentesque. Donec lacinia
42
+ vel sapien sed iaculis. Etiam vitae gravida arcu. Pellentesque
43
+ condimentum viverra ligula, sed euismod neque porta vitae. Curabitur
44
+ fermentum nulla ac sem imperdiet, quis sollicitudin tortor scelerisque.
45
+ Nulla laoreet nisi sapien, in ornare dui suscipit vitae. Vestibulum
46
+ consectetur venenatis diam vitae sollicitudin. Donec tempus mi massa,
47
+ non tristique nunc vestibulum ac. Etiam at diam at lorem malesuada
48
+ tempus. Aenean mollis dui eget libero consequat, a euismod ante iaculis.
49
+ Maecenas id pretium est. Nam ultricies leo ac metus sagittis
50
+ consectetur. Quisque ut libero urna.
51
+ </p>
52
+
53
+ <p>
54
+ Fusce rhoncus tellus vitae pretium rhoncus. Ut eu ante luctus, commodo
55
+ lectus vel, eleifend quam. Proin ipsum quam, tempor sed nisi eu, auctor
56
+ volutpat lorem. Sed in nunc vel erat rhoncus facilisis. Phasellus et
57
+ elit ac nisl molestie rhoncus. Vivamus id justo ultrices neque bibendum
58
+ laoreet. Mauris scelerisque quam vitae velit lacinia placerat. Sed non
59
+ aliquet magna, vel dapibus nisl. In nec lorem lorem. Cras vitae volutpat
60
+ lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
61
+ a posuere erat, sit amet tristique libero. Donec sit amet lobortis est,
62
+ et tempus erat. Nulla semper urna ut purus tincidunt, quis consectetur
63
+ lacus fermentum.
64
+ </p>
65
+ </div>
66
+ </div>
67
+ </div>
@@ -0,0 +1,5 @@
1
+ RSpec.configure do |config|
2
+ config.before(:each) do
3
+ ActionMailer::Base.deliveries.clear
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ @import "variables";
2
+ @import "bootstrap";
3
+
4
+ html {
5
+ background: $gray image-url('noise.png') top left;
6
+ }
7
+
8
+ footer {
9
+ color: $light-gray;
10
+ background: $gray image-url('noise.png') top left;
11
+ padding-top: 20px;
12
+ a {
13
+ color: $light-gray;
14
+ &:hover {
15
+ color: $light-gray;
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,19 @@
1
+ module BackgroundJobs
2
+ def run_background_jobs_immediately
3
+ delay_jobs = Delayed::Worker.delay_jobs
4
+ Delayed::Worker.delay_jobs = false
5
+ yield
6
+ ensure
7
+ Delayed::Worker.delay_jobs = delay_jobs
8
+ end
9
+ end
10
+
11
+ RSpec.configure do |config|
12
+ config.around(:each, type: :feature) do |example|
13
+ run_background_jobs_immediately do
14
+ example.run
15
+ end
16
+ end
17
+
18
+ config.include BackgroundJobs
19
+ end
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env sh
2
+
3
+ # Set up Rails app. Run this script immediately after cloning the codebase.
4
+ # https://github.com/thoughtbot/guides/tree/master/protocol
5
+
6
+ # Exit if any subcommand fails
7
+ set -e
8
+
9
+ # Set up Ruby dependencies via Bundler
10
+ bundle install
11
+
12
+ # Set up configurable environment variables
13
+ if [ ! -f .env ]; then
14
+ cp .sample.env .env
15
+ fi
16
+
17
+ # Set up database and add any development seed data
18
+ bundle exec rake dev:prime
19
+
20
+ # Add binstubs to PATH via export PATH=".git/safe/../../bin:$PATH" in ~/.zshenv
21
+ mkdir -p .git/safe
22
+
23
+ # Pick a port for Foreman
24
+ echo "port: <%= config[:port_number] %>" > .foreman
25
+
26
+ # Print warning if Foreman is not installed
27
+ if ! command -v foreman &>/dev/null; then
28
+ echo "foreman is not installed."
29
+ echo "See https://github.com/ddollar/foreman for install instructions."
30
+ fi
31
+
32
+ if [ -d ~/.pow ]; then
33
+ echo <%= config[:port_number] %> > ~/.pow/<%=app_name%>
34
+ fi
@@ -0,0 +1,16 @@
1
+ en:
2
+ date:
3
+ formats:
4
+ default:
5
+ "%m/%d/%Y"
6
+ with_weekday:
7
+ "%a %m/%d/%y"
8
+
9
+ time:
10
+ formats:
11
+ default:
12
+ "%a, %b %-d, %Y at %r"
13
+ date:
14
+ "%b %-d, %Y"
15
+ short:
16
+ "%B %d"
@@ -0,0 +1,67 @@
1
+ <div class="container-fluid">
2
+ <div class="page-header">
3
+ <h1>Contact Us <small>How to reach <%=app_name%></small></h1>
4
+ </div>
5
+
6
+ <div class="panel panel-default">
7
+ <div class="panel-body">
8
+ <p>
9
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut felis
10
+ mi. Vestibulum varius imperdiet justo at pellentesque. Donec lacinia
11
+ vel sapien sed iaculis. Etiam vitae gravida arcu. Pellentesque
12
+ condimentum viverra ligula, sed euismod neque porta vitae. Curabitur
13
+ fermentum nulla ac sem imperdiet, quis sollicitudin tortor scelerisque.
14
+ Nulla laoreet nisi sapien, in ornare dui suscipit vitae. Vestibulum
15
+ consectetur venenatis diam vitae sollicitudin. Donec tempus mi massa,
16
+ non tristique nunc vestibulum ac. Etiam at diam at lorem malesuada
17
+ tempus. Aenean mollis dui eget libero consequat, a euismod ante iaculis.
18
+ Maecenas id pretium est. Nam ultricies leo ac metus sagittis
19
+ consectetur. Quisque ut libero urna.
20
+ </p>
21
+
22
+ <p>
23
+ Fusce rhoncus tellus vitae pretium rhoncus. Ut eu ante luctus, commodo
24
+ lectus vel, eleifend quam. Proin ipsum quam, tempor sed nisi eu, auctor
25
+ volutpat lorem. Sed in nunc vel erat rhoncus facilisis. Phasellus et
26
+ elit ac nisl molestie rhoncus. Vivamus id justo ultrices neque bibendum
27
+ laoreet. Mauris scelerisque quam vitae velit lacinia placerat. Sed non
28
+ aliquet magna, vel dapibus nisl. In nec lorem lorem. Cras vitae volutpat
29
+ lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
30
+ a posuere erat, sit amet tristique libero. Donec sit amet lobortis est,
31
+ et tempus erat. Nulla semper urna ut purus tincidunt, quis consectetur
32
+ lacus fermentum.
33
+ </p>
34
+ </div>
35
+ </div>
36
+
37
+ <div class="panel panel-default">
38
+ <div class="panel-body">
39
+ <p>
40
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut felis
41
+ mi. Vestibulum varius imperdiet justo at pellentesque. Donec lacinia
42
+ vel sapien sed iaculis. Etiam vitae gravida arcu. Pellentesque
43
+ condimentum viverra ligula, sed euismod neque porta vitae. Curabitur
44
+ fermentum nulla ac sem imperdiet, quis sollicitudin tortor scelerisque.
45
+ Nulla laoreet nisi sapien, in ornare dui suscipit vitae. Vestibulum
46
+ consectetur venenatis diam vitae sollicitudin. Donec tempus mi massa,
47
+ non tristique nunc vestibulum ac. Etiam at diam at lorem malesuada
48
+ tempus. Aenean mollis dui eget libero consequat, a euismod ante iaculis.
49
+ Maecenas id pretium est. Nam ultricies leo ac metus sagittis
50
+ consectetur. Quisque ut libero urna.
51
+ </p>
52
+
53
+ <p>
54
+ Fusce rhoncus tellus vitae pretium rhoncus. Ut eu ante luctus, commodo
55
+ lectus vel, eleifend quam. Proin ipsum quam, tempor sed nisi eu, auctor
56
+ volutpat lorem. Sed in nunc vel erat rhoncus facilisis. Phasellus et
57
+ elit ac nisl molestie rhoncus. Vivamus id justo ultrices neque bibendum
58
+ laoreet. Mauris scelerisque quam vitae velit lacinia placerat. Sed non
59
+ aliquet magna, vel dapibus nisl. In nec lorem lorem. Cras vitae volutpat
60
+ lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer
61
+ a posuere erat, sit amet tristique libero. Donec sit amet lobortis est,
62
+ et tempus erat. Nulla semper urna ut purus tincidunt, quis consectetur
63
+ lacus fermentum.
64
+ </p>
65
+ </div>
66
+ </div>
67
+ </div>