smooster 0.0.1 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzY4ODQyYzM0ZWE2ZjhhYjFiZmZlZGI3MWY5ZDU3OTYzOWM0MGM1Yw==
4
+ OTk5NmY4MGEzZmRlMWMzOTUwNzBkMWIxMWU1NTg3ZGM3OTI3ODA3Ng==
5
5
  data.tar.gz: !binary |-
6
- MWVhNDJhY2NmY2E4ZjJjMTlhNmJiMWU0NzBmMGFhYzM2ZWY2Y2QxNA==
7
- !binary "U0hBNTEy":
6
+ ZWJmZjk4Y2Q1M2U5MTZjZDU4ZTlkOWYxZDc2MGRjODg1OWE3NDNhOQ==
7
+ SHA512:
8
8
  metadata.gz: !binary |-
9
- MmVhNTMxODZjYzAxZjgzYzU0YmQwMjM2ZGNhN2YwZDQxN2JjOGM4OWM0YTBj
10
- M2E3ZWVhYjUzMDk4MDU1MWZmMGMwNGMwNmViNWFlZjQwNDIzMWVlZDkwZWFk
11
- MWM3OGM1MjUwNWVkYTRhMzc4MDY4OGFjN2M5ODJlODA0YjYwYWY=
9
+ N2NiMDYzZDU0ZDdhMWMwZGJhNWU4ZWY1MjM1YzViZWRhODQ4MDExZWFhZTAw
10
+ M2ZmYWU1N2U2Mjc0MmUzOTk4ZTgwMmMyMjQ5ZjkxZDgxNTY3MTFjZjZjYzEx
11
+ MGRkNTMxYzM4MzljZmY0ZmQ3YWQ4N2IwNmIxYTJiNmMyZTE3NmU=
12
12
  data.tar.gz: !binary |-
13
- YWU1MzhiMzZhNzEwZTM2OTNhYjQ3NGE5NWJiMDJkMmQwZDkzMGJkMjI5YTZm
14
- ZGYwZGY4NjZhZTUzMTNlZTVhODA0ZDNjMGU0ZDYwYTUyYTE2OWE3MDZjNGMy
15
- MWM3MTZhMDk4N2YyZDQ5MjFjMzBlMDcxN2NmZTA0ZTVhZDk0MWI=
13
+ NGQzMmNlMDcwOWM2MjJlOTliYTU1ODg2NzBmNTBhMzU3YTQ1M2VhNzk1Mzli
14
+ ZTVhY2IxMjU1ZWIzNmZlZjA2ZmY5OTA0ZTYzNDhhMTMyY2E5MTJjMjQ2MTAy
15
+ OWE2ZjhlNzFkMjliOWMzYzljMzQ2NWUxMmFhYzYyNWE2MmE1ZDc=
data/.gitignore CHANGED
@@ -3,6 +3,7 @@
3
3
  .sass-cache
4
4
  .DS_Store
5
5
  .idea
6
+ .smo
6
7
  /log/*
7
8
  /tmp/*
8
9
  /db/*.sqlite3
data/README.md CHANGED
@@ -6,16 +6,49 @@ This is a ruby gem
6
6
 
7
7
  $ gem install smooster
8
8
 
9
+ get your api key from http://cms.smooster.com/api_keys
10
+
11
+ $ smooster setup THIS_SHOULD_BE_YOUR_PERSONAL_API_KEY
12
+
9
13
  ## Usage
10
14
 
11
- Type shelly in terminal for usage info
15
+ Type smooster in terminal for usage info
16
+
17
+ $ smooster
18
+
19
+ To add a new project navigate to your local folder with the new smooster html project
20
+
21
+ $ cd ~/my_html_project/
22
+
23
+ $ smooster site THIS_SHOULD_BE_YOUR_SITE_ID
12
24
 
13
- shelly
25
+ $ smooster deploy
14
26
 
15
27
  ## Running tests
16
28
 
17
29
  bundle exec rake
18
30
 
31
+ ## Wishlist
32
+ * A wizard for project for new sites - best case even creates a new site in smooster before deployment
33
+ * Detecting liquid variables in site_templates an auto activating liquid feature
34
+ * add subtemplate feature - auto detect similar parts in html and create subtemplates
35
+ * Feature that can create a page for each uploaded site_template (so that it's easier to check, if they are working) and return the links for all of them
36
+
37
+ ## Changelog
38
+
39
+ ###0.1.2
40
+ * Uploading assets first
41
+ * Enhanced deploy command default is assets only. options are assets, templates, all
42
+
43
+ ###0.1.1
44
+ * Added a setup wizard for the users api_key
45
+ * Added a setup wizard for new projects / sites
46
+ * Minor improvements to configuration
47
+
48
+ ###0.1.0
49
+ * upload or update files in html folder to site_templates in smooster
50
+ * upload or update files in media folder to media_assets in smooster (including creating needed folder structure)
51
+
19
52
  ## Contributing
20
53
 
21
54
  1. Fork it ( https://github.com/[my-github-username]/smooster/fork )
data/Rakefile CHANGED
@@ -6,5 +6,9 @@ RSpec::Core::RakeTask.new(:spec)
6
6
 
7
7
  task default: :spec
8
8
 
9
+ desc "Open an irb session preloaded with this library"
10
+ task :console do
11
+ sh "irb -rubygems -I lib -I extra -r smooster.rb"
12
+ end
9
13
 
10
14
 
@@ -2,7 +2,5 @@
2
2
 
3
3
  require 'smooster/cli/executable'
4
4
 
5
-
6
- executable = Smooster::Cli::Executable.new(ARGV)
7
- executable.start
5
+ Smooster::Cli::Executable.start
8
6
 
@@ -1,5 +1,23 @@
1
1
  require "smooster/version"
2
+ require 'active_model'
3
+ require 'rest_client'
4
+ require 'nokogiri'
5
+ require "yaml/store"
6
+ require 'logger'
7
+
8
+ #base
9
+ require 'smooster/rest-client/rest-client-purge'
10
+
11
+ #deploy
12
+ require 'smooster/deploy/site_templates'
13
+ require 'smooster/deploy/site_template'
14
+ require 'smooster/deploy/media_assets'
15
+ require 'smooster/deploy/media_asset'
16
+
17
+ #debug
18
+ require 'pry'
19
+
2
20
 
3
21
  module Smooster
4
- # Your code goes here...
22
+ autoload :Application, "smooster/application"
5
23
  end
@@ -0,0 +1,62 @@
1
+ module Smooster
2
+ class Application
3
+ include Singleton
4
+ include ActiveModel::Model
5
+
6
+ attr_accessor :config, :user_config, :site_templates_store, :media_assets_store
7
+
8
+ def self.start
9
+ self.instance
10
+ end
11
+
12
+ def base_dir
13
+ Dir.pwd
14
+ end
15
+
16
+ def logger
17
+ unless File.directory?("#{Dir.pwd}/.smo")
18
+ FileUtils.mkdir_p("#{Dir.pwd}/.smo")
19
+ end
20
+ @logger ||= Logger.new(Dir.pwd + '/.smo/error.log', 'monthly')
21
+ end
22
+
23
+ def site_templates_store
24
+ @site_templates_store ||= YAML::Store.new("#{self.base_dir}/.smo/site_templates.yml")
25
+ end
26
+
27
+ def media_assets_store
28
+ @media_assets_store ||= YAML::Store.new("#{self.base_dir}/.smo/media_assets.yml")
29
+ end
30
+
31
+ def config
32
+ @config ||= YAML::Store.new("#{self.base_dir}/.smo/configure.yml")
33
+ end
34
+
35
+ def html_folder
36
+ config.transaction { config[:html_folder] }
37
+ end
38
+
39
+ def api_url
40
+ config.transaction { config[:api_url] }
41
+ end
42
+
43
+ def site_id
44
+ config.transaction { config[:site_id] }
45
+ end
46
+
47
+ def user_config
48
+ @user_config ||= YAML::Store.new("#{Dir.home}/.smo/user_configure.yml")
49
+ end
50
+
51
+ def api_key
52
+ user_config.transaction { user_config[:api_key] }
53
+ end
54
+
55
+ def update_api_key(api_key)
56
+ user_config.transaction do
57
+ user_config[:api_key] = api_key
58
+ end
59
+ end
60
+
61
+ end
62
+ end
@@ -1,12 +1,79 @@
1
- require "smooster/version"
1
+ require "smooster"
2
+ require "colorize"
2
3
  require "thor"
3
4
 
4
5
  module Smooster
5
6
  module Cli
6
7
 
7
8
  class Executable < Thor
8
- def hello
9
- puts "Hello world!"
9
+ desc "test", "Returns test data"
10
+ def test
11
+ puts Smooster::Application.instance.api_key()
12
+ puts Dir.pwd
13
+ end
14
+
15
+ desc "setup API_KEY", "Setup your smooster gem. Add your API_KEY"
16
+ def setup(api_key)
17
+ Smooster::Application.instance.update_api_key(api_key)
18
+ puts Smooster::Application.instance.api_key()
19
+ puts "done!"
20
+ end
21
+
22
+ desc "site SITE_ID [API_URL, HTML_FOLDER]", "Setup a new site / project. SITE_ID is the smooster site_id given, when you create a new site in smooster."
23
+ #method_options :force => :boolean, :alias => :string
24
+ def site(site_id, api_url="http://cms.smooster.com/api", html_folder="html")
25
+
26
+ unless File.directory?("#{Smooster::Application.instance.base_dir}/.smo")
27
+ FileUtils.mkdir_p("#{Smooster::Application.instance.base_dir}/.smo")
28
+ end
29
+
30
+ config_store = Smooster::Application.instance.config
31
+ config_store.transaction do
32
+ config_store[:api_url] = api_url
33
+ config_store[:html_folder] = html_folder
34
+ config_store[:site_id] = site_id
35
+ end
36
+ end
37
+
38
+ desc "deploy [TYPE]", "deploy your project to the smooster cloud DEFAULT=assets [assets,templates,all]"
39
+ def deploy(type="assets")
40
+ puts "Starting push to smooster..."
41
+
42
+ if type == "assets" || type == "all"
43
+ Smooster::Deploy::MediaAsset.all.each do |ma|
44
+ status = "[deployed]".colorize(:blue)
45
+ status = "[unchanged]".colorize(:green) if ma.checksum.to_s == ma.load_checksum.to_s
46
+ puts "#{ma.file_path} #{status}"
47
+ ma.upload
48
+ end
49
+ end
50
+
51
+ if type == "templates" || type == "all"
52
+ Smooster::Deploy::SiteTemplate.all.each do |st|
53
+ status = "[deployed]".colorize(:blue)
54
+ status = "[unchanged]".colorize(:green) if st.checksum.to_s == st.load_checksum.to_s
55
+ st.upload
56
+ puts "#{st.path} #{status}"
57
+ end
58
+ end
59
+
60
+ puts "#{type} done!"
61
+ end
62
+
63
+ desc "load [TYPE]", "load your project from the smooster cloud DEFAULT=assets [assets,templates,all]"
64
+ def load(type="assets")
65
+ puts "Starting loading from smooster..."
66
+
67
+ if type == "assets" || type == "all"
68
+ Smooster::Deploy::MediaAsset.all.each do |ma|
69
+ status = "[loading]".colorize(:blue)
70
+ status = "[unchanged]".colorize(:green) if ma.checksum.to_s == ma.load_checksum.to_s
71
+ puts "#{ma.file_path} #{status}"
72
+ ma.download
73
+ end
74
+ end
75
+
76
+ puts "#{type} done!"
10
77
  end
11
78
  end
12
79
 
@@ -0,0 +1,84 @@
1
+ require 'open-uri'
2
+
3
+ module Smooster
4
+ module Deploy
5
+ class MediaAsset
6
+ include ActiveModel::Model
7
+ include ActiveModel::Serializers::JSON
8
+ extend Smooster::Deploy::MediaAssets
9
+
10
+ attr_accessor :file_path, :folder_path, :checksum, :smo_id
11
+
12
+ def attributes
13
+ {'file_path' => file_path, 'checksum' => checksum, 'smo_id' => smo_id}
14
+ end
15
+
16
+ def file_path=(file_path)
17
+ @file_path = file_path
18
+ file_path = file_path.gsub("#{Smooster::Application.instance.base_dir}/#{Smooster::Application.instance.html_folder()}/","")
19
+ self.folder_path= File.dirname(file_path)
20
+ @file_path
21
+ end
22
+
23
+ def store
24
+ Smooster::Application.instance.media_assets_store
25
+ end
26
+
27
+ def load_checksum
28
+ store.transaction { store[self.file_path][:checksum] if store[self.file_path].present? }
29
+ end
30
+
31
+ def load_smo_id
32
+ store.transaction { store[self.file_path][:smo_id] if store[self.file_path].present? }
33
+ end
34
+
35
+ def download
36
+ begin
37
+ response = RestClient.get("#{Smooster::Application.instance.api_url()}/#{Smooster::Application.instance.site_id()}/media_assets/find_by_slug/#{self.folder_path}/#{File.basename(self.file_path)}", {"Authorization" => 'Token token="'+ Smooster::Application.instance.api_key() +'"', "Accept" => 'application/vnd.smoosterid.v2'})
38
+ data = JSON.parse(response)
39
+ self.checksum = open(data['file']['url']) {|f| Digest::MD5.hexdigest(f.read) }
40
+ self.smo_id = data['id']
41
+ self.save
42
+ rescue => e
43
+ Smooster::Application.instance.logger.error "Error in media_asset download for #{self.file_path}!: #{e} / #{e.backtrace.inspect}"
44
+ puts "This file failed to load: #{self.file_path}".colorize(:red)
45
+ end
46
+
47
+
48
+ end
49
+
50
+ def upload
51
+ return false if self.checksum.to_s == self.load_checksum.to_s
52
+
53
+ if self.smo_id.present?
54
+ begin
55
+ response = RestClient.put "#{Smooster::Application.instance.api_url()}/#{Smooster::Application.instance.site_id()}/media_assets/#{self.smo_id}", {:media_asset => {:file => File.new(self.file_path, 'rb'), :folder_path => self.folder_path}}, {"Authorization" => 'Token token="'+ Smooster::Application.instance.api_key() +'"', "Accept" => 'application/vnd.smoosterid.v2'}
56
+ rescue => e
57
+ puts "This file couldn't be updated: #{self.file_path}".colorize(:red)
58
+ end
59
+ else
60
+ begin
61
+ response = RestClient.post "#{Smooster::Application.instance.api_url()}/#{Smooster::Application.instance.site_id()}/media_assets", {:media_asset => {:file => File.new(self.file_path, 'rb'), :folder_path => self.folder_path}}, {"Authorization" => 'Token token="'+ Smooster::Application.instance.api_key() +'"', "Accept" => 'application/vnd.smoosterid.v2'}
62
+ rescue => e
63
+ Smooster::Application.instance.logger.error "Error in media_asset upload for #{self.file_path}!: #{e}"
64
+ puts "This file couldn't be uploaded: #{self.file_path}".colorize(:red)
65
+ end
66
+ end
67
+
68
+ if response.present?
69
+ data = JSON.parse(response)
70
+ RestClient.purge data['file']['url'] if self.smo_id.present? && Smooster::Application.instance.api_url() != "http://127.0.0.1/api"
71
+ self.smo_id = data['id']
72
+ self.save
73
+ end
74
+
75
+ end
76
+
77
+ def save
78
+ store.transaction do
79
+ store[self.file_path] = {:checksum => self.checksum.to_s, :smo_id => self.smo_id}
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,46 @@
1
+ module Smooster
2
+ module Deploy
3
+ module MediaAssets
4
+
5
+ def collection
6
+ collection = []
7
+ response.each do |file|
8
+ media_asset = MediaAsset.new({:file_path => file, :checksum => Digest::MD5.hexdigest(File.read(file))})
9
+ media_asset.smo_id = media_asset.load_smo_id if media_asset.load_smo_id.present?
10
+ collection << media_asset
11
+ end
12
+ collection
13
+ end
14
+ alias_method :all, :collection
15
+
16
+ def response
17
+ @response ||= initialize_collection
18
+ end
19
+
20
+ def reload!
21
+ @response = initialize_collection
22
+ end
23
+
24
+ def upload_all
25
+ self.all.each do |media_asset|
26
+ media_asset.upload
27
+ end
28
+ end
29
+
30
+ def method_missing(name, *args, &block)
31
+ if collection.respond_to? name
32
+ collection.send(name, *args)
33
+ else
34
+ super
35
+ end
36
+ end
37
+
38
+ private
39
+ def initialize_collection
40
+ Dir.glob("#{Smooster::Application.instance.base_dir}/#{Smooster::Application.instance.html_folder()}/media/**/*.*")
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+
@@ -0,0 +1,47 @@
1
+ module Smooster
2
+ module Deploy
3
+ class SiteTemplate
4
+ include ActiveModel::Model
5
+ include ActiveModel::Serializers::JSON
6
+ extend Smooster::Deploy::SiteTemplates
7
+
8
+ attr_accessor :title, :body, :path, :checksum, :smo_id
9
+
10
+ def attributes
11
+ {'title' => title, 'body' => body, 'path' => path, 'checksum' => checksum, 'smo_id' => smo_id}
12
+ end
13
+
14
+ def store
15
+ Smooster::Application.instance.site_templates_store
16
+ end
17
+
18
+ def load_checksum
19
+ store.transaction { store[self.path][:checksum] if store[self.path].present? }
20
+ end
21
+
22
+ def load_smo_id
23
+ store.transaction { store[self.path][:smo_id] if store[self.path].present? }
24
+ end
25
+
26
+ def upload
27
+ return false if self.checksum.to_s == self.load_checksum.to_s
28
+
29
+ if self.smo_id.present?
30
+ response = RestClient.put "#{Smooster::Application.instance.api_url()}/#{Smooster::Application.instance.site_id()}/site_templates/#{self.smo_id}", {:site_template => {:body => self.body, :title => self.title}}, {"Authorization" => 'Token token="'+ Smooster::Application.instance.api_key() +'"', "Accept" => 'application/vnd.smoosterid.v2'}
31
+ else
32
+ response = RestClient.post "#{Smooster::Application.instance.api_url()}/#{Smooster::Application.instance.site_id()}/site_templates", {:body => self.body, :title => self.title}, {"Authorization" => 'Token token="'+ Smooster::Application.instance.api_key() +'"', "Accept" => 'application/vnd.smoosterid.v2'}
33
+ end
34
+
35
+ data = JSON.parse(response)
36
+ self.smo_id = data['id']
37
+ self.save
38
+ end
39
+
40
+ def save
41
+ store.transaction do
42
+ store[self.path] = {:checksum => self.checksum.to_s, :smo_id => self.smo_id}
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,49 @@
1
+ module Smooster
2
+ module Deploy
3
+ module SiteTemplates
4
+
5
+ def collection
6
+ collection = []
7
+ response.each do |file|
8
+ body = File.read(file)
9
+ template = SiteTemplate.new({:body => body, :path => file, :checksum => Digest::MD5.hexdigest(body)})
10
+ template.smo_id = template.load_smo_id if template.load_smo_id.present?
11
+ source = Nokogiri::HTML(body)
12
+ template.title = source.css('title').first.inner_html
13
+ collection << template
14
+ end
15
+ collection
16
+ end
17
+ alias_method :all, :collection
18
+
19
+ def response
20
+ @response ||= initialize_collection
21
+ end
22
+
23
+ def reload!
24
+ @response = initialize_collection
25
+ end
26
+
27
+ def upload_all
28
+ self.all.each do |template|
29
+ template.upload
30
+ end
31
+ end
32
+
33
+ def method_missing(name, *args, &block)
34
+ if collection.respond_to? name
35
+ collection.send(name, *args)
36
+ else
37
+ super
38
+ end
39
+ end
40
+
41
+ private
42
+ def initialize_collection
43
+ Dir.glob("#{Smooster::Application.instance.base_dir}/#{Smooster::Application.instance.html_folder()}/**/*.html")
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+
@@ -0,0 +1,13 @@
1
+ require 'rest-client'
2
+
3
+ class Net::HTTP::Purge < Net::HTTPRequest
4
+ METHOD = 'PURGE'
5
+ REQUEST_HAS_BODY = false
6
+ RESPONSE_HAS_BODY = true
7
+ end
8
+
9
+ module RestClient
10
+ def self.purge(url, headers={}, &block)
11
+ Request.execute(:method => :purge, :url => url, :headers => headers, &block)
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ project:
2
+ html_folder: html
3
+ api_url: http://cms.smooster.com/api
4
+ site_id: 54351208bb1b7507d1000001
@@ -1,3 +1,3 @@
1
1
  module Smooster
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.4"
3
3
  end
File without changes
@@ -19,7 +19,15 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency("thor")
22
+ spec.add_dependency("activesupport")
23
+ spec.add_dependency("activemodel")
24
+ spec.add_dependency("rest-client")
25
+ spec.add_dependency("colorize")
26
+ spec.add_dependency("nokogiri", ["~> 1.5"])
22
27
 
28
+ spec.add_development_dependency "pry"
29
+ spec.add_development_dependency "pry-debugger"
30
+ spec.add_development_dependency "pry-stack_explorer"
23
31
  spec.add_development_dependency "bundler", "~> 1.7"
24
32
  spec.add_development_dependency "rake", "~> 10.0"
25
33
  spec.add_development_dependency "rspec"
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'smooster'
3
+ include Smooster::Deploy
4
+
5
+ describe SiteTemplate do
6
+
7
+ describe "has a body" do
8
+
9
+ let(:site_template) { SiteTemplate.new(body: "www.xyz.de")}
10
+
11
+ it "should return body " do
12
+ expect(site_template.body).to eql "www.xyz.de"
13
+ end
14
+
15
+ end
16
+
17
+ describe "collection" do
18
+
19
+ it "should return all SiteTemplates" do
20
+ expect(SiteTemplate.all.count).to eql 1
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
@@ -0,0 +1,426 @@
1
+ <!DOCTYPE html>
2
+ <html lang="de">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5
+
6
+ <meta charset="utf-8">
7
+ <title>Startseite</title>
8
+ <meta name="description" content="">
9
+ <meta name="keywords" content="">
10
+ <meta name="viewport" content="width=device-width,initial-scale=1">
11
+ <meta name="robots" content="index,follow">
12
+ <link rel="canonical" href="">
13
+
14
+ <!--<link rel="shortcut icon" href="/media/favicon.ico" type="image/x-icon">-->
15
+
16
+ <link href="media/css/style.css" rel="stylesheet">
17
+ <link rel="stylesheet" href="http://code.smooster.com/libs/jquery.nivo.lightbox/1.0/themes/default/default.css" type="text/css">
18
+ <link href="http://code.smooster.com/libs/jquery.nivo.lightbox/1.0/nivo-lightbox.css" rel="stylesheet">
19
+ <!--[if lte IE 8]><script type="text/javascript" src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
20
+
21
+ <!-- Optional style - delete what you don't need (DONT FORGET TO: Fix path if you keep it!) -->
22
+ <link href="lib/selectBoxIt/jquery.selectBoxIt.css" rel="stylesheet">
23
+ <link href="http://code.smooster.com/libs/jquery.glide/1.0.6/style.css" rel="stylesheet">
24
+ <!-- END -->
25
+ </head>
26
+ <body>
27
+ <div id="wrapper">
28
+ <header>
29
+ <nav id="mainnavi" data-mercury="extra" data-extra="html-list" data-extra-name="Main-Navigation" data-extra-list-type="multilevel">
30
+ <ul>
31
+ <li><a href="" class="active">Start</a></li>
32
+ <li><a href="">Über uns</a></li>
33
+ <li><a href="">Leistungen</a>
34
+ <ul>
35
+ <li><a href="">Brot</a></li>
36
+ <li><a href="">Zucker</a></li>
37
+ <li><a href="">Spiele</a></li>
38
+ </ul>
39
+ </li>
40
+ <li><a href="">Kontakt</a></li>
41
+ </ul>
42
+ </nav>
43
+
44
+ <!--OPTIONS:
45
+ for multilanguage add this: data-scope="folder" data-depth="2"
46
+ -->
47
+ </header>
48
+
49
+ <main>
50
+
51
+
52
+
53
+ <section>
54
+ <h2>Beispiel: basic slider<h2>
55
+ <div class="slider basic">
56
+ <div class="slides">
57
+ <article class="slide">
58
+ <div id="slideshow-teaser">
59
+ <p>Slogan Slide1</p>
60
+ </div>
61
+ <div class="slide-background-image">
62
+ <img src="http://dummyimage.com/940x600/000/ccc" alt="">
63
+ </div>
64
+ </article>
65
+ <article class="slide">
66
+ <div id="slideshow-teaser">
67
+ <p>Slogan Slide2</p>
68
+ </div>
69
+ <div class="slide-background-image">
70
+ <img src="http://dummyimage.com/600x400/000/ccc" alt="">
71
+ </div>
72
+ </article>
73
+ <article class="slide">
74
+ <div class="slide-background-image">
75
+ <img src="http://dummyimage.com/600x400/000/ccc" alt="">
76
+ </div>
77
+ </article>
78
+ <article class="slide">
79
+ <div class="slide-background-image">
80
+ <img src="http://dummyimage.com/600x400/000/ccc" alt="">
81
+ </div>
82
+ </article>
83
+ </div>
84
+ </div>
85
+
86
+ <!-- LESS:
87
+ @import 'lib/smo-glide-basic.less';
88
+ -->
89
+
90
+ <!-- CSS:
91
+ <link href="http://code.smooster.com/libs/jquery.glide/1.0.6/style.css" rel="stylesheet">
92
+ -->
93
+
94
+ <!-- JS:
95
+ <script src="http://code.smooster.com/libs/jquery/1.9.1/jquery.js" type="text/javascript"></script>
96
+ <script src="http://code.smooster.com/libs/jquery.glide/1.0.6/jquery.glide.min.js" type="text/javascript"></script>
97
+ -->
98
+
99
+ </section>
100
+
101
+ <section>
102
+ <h2>Beispiel: theilig slider<h2>
103
+ <div class="slider th-version">
104
+ <div class="slides">
105
+ <article class="slide">
106
+ <div id="slideshow-teaser">
107
+ <p>Slogan Slide1</p>
108
+ </div>
109
+ <div class="slide-background-image">
110
+ <img src="http://dummyimage.com/940x600/000/ccc" alt="">
111
+ </div>
112
+ </article>
113
+ <article class="slide">
114
+ <div id="slideshow-teaser">
115
+ <p>Slogan Slide2</p>
116
+ </div>
117
+ <div class="slide-background-image">
118
+ <img src="http://dummyimage.com/600x400/000/ccc" alt="">
119
+ </div>
120
+ </article>
121
+ <article class="slide">
122
+ <div class="slide-background-image">
123
+ <img src="http://dummyimage.com/600x400/000/ccc" alt="">
124
+ </div>
125
+ </article>
126
+ <article class="slide">
127
+ <div class="slide-background-image">
128
+ <img src="http://dummyimage.com/600x400/000/ccc" alt="">
129
+ </div>
130
+ </article>
131
+ </div>
132
+ </div>
133
+ <div class="slider_navigation"></div>
134
+
135
+ <!-- LESS:
136
+ @import 'lib/smo-glide-th-version.less';
137
+ -->
138
+
139
+ <!-- CSS:
140
+ <link href="http://code.smooster.com/libs/jquery.glide/1.0.6/style.css" rel="stylesheet">
141
+ -->
142
+
143
+ <!-- JS:
144
+ <script src="http://code.smooster.com/libs/jquery/1.9.1/jquery.js" type="text/javascript"></script>
145
+ <script src="http://code.smooster.com/libs/jquery.glide/1.0.6/jquery.glide.min.js" type="text/javascript"></script>
146
+ <script>
147
+ $(window).load(function() {
148
+ $('.slide-background-image').each(function(index,value){
149
+ $(value).closest('article').css('background-image', "url("+$(value).find('img').attr('src')+")")
150
+ $(value).find('img').hide()
151
+ })
152
+ });
153
+
154
+ $('.slider').glide({
155
+ arrowRightText: '<i class="fa fa-play"></i>',
156
+ arrowLeftText: '<i class="fa fa-play fa-rotate-180"></i>',
157
+ navigation: '.slider_navigation',
158
+ navigationCenter: false,
159
+ navigationClass: 'th_slide_navi',
160
+ navigationItemClass: "th_slide_navi_item",
161
+ navigationCurrentItemClass: "th_slide_navi_item_current"
162
+ });
163
+ </script>
164
+ -->
165
+
166
+ </section>
167
+
168
+ <section>
169
+ <h2>Beispiel: theilig piktos toolbar<h2>
170
+ <p>Siehe Toolbar an der linken Seite</p>
171
+
172
+ <aside id="piktos" class="hidden-mobile">
173
+ <div id="piktos-image">
174
+ <ul>
175
+ <li><a href=""><i class="fa fa-phone"></i></a></li>
176
+ <li><a href=""><i class="fa fa-car"></i></a></li>
177
+ <li><a href=""><i class="fa fa-envelope"></i></a></li>
178
+ <li><a href=""><i class="fa fa-camera"></i></a></li>
179
+ </ul>
180
+ </div>
181
+ <div id="piktos-content">
182
+ <p>Sie haben Fragen? <br>Oder wollen einen Termin vereinbaren? <br>Rufen Sie und einfach an!</p>
183
+ <span>FON: 012 3456789</span>
184
+ </div>
185
+ </aside>
186
+
187
+ <!-- LESS:
188
+ @import 'lib/smo-piktos-toolbar-th.less';
189
+ -->
190
+
191
+
192
+ <!-- COFFEE:
193
+ loadShortLinksToolbar = ->
194
+ $('#piktos').hover (->
195
+ $("#piktos").toggleClass('open')
196
+ return
197
+ ), ->
198
+ $("#piktos").toggleClass('open')
199
+ return
200
+ -->
201
+
202
+ </section>
203
+
204
+ <section>
205
+ <h2>Beispiel: Textausblenden (more Funktion)<h2>
206
+
207
+ <div id="lead">
208
+ <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
209
+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
210
+ At vero eos et accusam et justo duo dolores et ea rebum. </p>
211
+ </div>
212
+ <div id="further">
213
+ <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
214
+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
215
+ At vero eos et accusam et justo duo dolores et ea rebum. </p>
216
+ </div>
217
+
218
+ <!-- COFFEE:
219
+ loadMoreButton = ->
220
+ if $("#further").length
221
+ unless $('#more_link').length > 0 or $('#further').html().length == 0
222
+ more_link = $('<a>', {href: '#',id: 'more_link'}).html("mehr")
223
+ $('#lead p').last().append(more_link)
224
+ more_link.click (event) ->
225
+ event.preventDefault()
226
+ $('#further').slideDown()
227
+ more_link.remove()
228
+ $('#further').hide()
229
+ -->
230
+
231
+ </section>
232
+
233
+
234
+ <section>
235
+ <h2>Beispiel: Formular<h2>
236
+
237
+ <form action="/f/[HIER_MUSS_DIE_ID_EINGESETZT_WERDEN]/send" method="post" class="form_validation">
238
+ <div class="row">
239
+ <div class="col-1-2 hidden-mobile">
240
+ <label for="Anrede">Anrede</label>
241
+ </div>
242
+ <div class="col-2-2">
243
+ <label><input type="radio" name="f[Anrede]" value="Herr">Herr</label>
244
+ <label><input type="radio" name="f[Anrede]" value="Frau">Frau</label>
245
+ </div>
246
+ </div>
247
+ <div class="row">
248
+ <div class="col-1-2">
249
+ <label for="nachname">Name*</label>
250
+ </div>
251
+ <div class="col-2-2">
252
+ <input type="text" name="f[Nachname]" id="nachname" required="">
253
+ </div>
254
+ </div>
255
+ <div class="row">
256
+ <div class="col-1-2">
257
+ <label for="Telefon">Telefon</label>
258
+ </div>
259
+ <div class="col-2-2">
260
+ <input type="text" name="f[Telefon]" id="Telefon">
261
+ </div>
262
+ </div>
263
+ <div class="row">
264
+ <div class="col-1-2">
265
+ <label for="email">E-Mail*</label>
266
+ </div>
267
+ <div class="col-2-2">
268
+ <input type="email" name="f[E-mail]" id="email" required="">
269
+ </div>
270
+ </div>
271
+ <div class="row">
272
+ <div class="col-1-2">
273
+ <label for="Nachricht">Nachricht</label>
274
+ </div>
275
+ <div class="col-2-2">
276
+ <textarea name="f[Nachricht]" id="Nachricht"></textarea>
277
+ </div>
278
+ </div>
279
+ <div class="row">
280
+ <div class="col-1-2">
281
+ &nbsp;
282
+ </div>
283
+ <div class="col-2-2">
284
+ <input type="submit" id="button-abschicken" value="senden">
285
+ </div>
286
+ </div>
287
+ </form>
288
+
289
+
290
+ <!-- CSS:
291
+ .field_error {
292
+ box-shadow: red 0 0 .5em inset !important;
293
+ }
294
+ -->
295
+
296
+ </section>
297
+
298
+ <section>
299
+ <h2>Beispiel: Formular (mit individueller Selectbox)<h2>
300
+
301
+ <form action="/f/[HIER_MUSS_DIE_ID_EINGESETZT_WERDEN]/send" method="post" class="form_validation">
302
+ <div class="form-row">
303
+ <label for="name">Name</label>
304
+ <input type="text" name="f[name]" id="name" required="">
305
+ </div>
306
+ <div class="form-row">
307
+ <label for="mail">E-Mail</label>
308
+ <input type="email" name="f[mail]" id="mail" required="">
309
+ </div>
310
+ <div class="form-row">
311
+ <label for="mail">E-Mail</label>
312
+ <select id="selectboxit" name="f[month]" required>
313
+ <option value="please-choose">Monat wählen*</option>
314
+ <option value="januar">Januar</option>
315
+ <option value="februar">Februar</option>
316
+ </select>
317
+ </div>
318
+ <div class="form-row">
319
+ <label for="nachricht">Nachricht</label>
320
+ <textarea name="f[nachricht]" id="nachricht" required=""></textarea>
321
+ </div>
322
+ <div class="form-row">
323
+ <input type="submit" id="button" value="Senden">
324
+ </div>
325
+
326
+
327
+ <!-- CSS:
328
+ <link href="lib/selectBoxIt/jquery.selectBoxIt.css" rel="stylesheet">
329
+ -->
330
+
331
+ <!-- JS:
332
+ <script src="http://code.smooster.com/libs/jquery/1.9.1/jquery.js" type="text/javascript"></script>
333
+ <script src="http://code.smooster.com/libs/jquery-ui/1.10.3/js/jquery-ui.min.js" type="text/javascript"></script>
334
+ <script src="lib/selectBoxIt/jquery.selectBoxIt.js" type="text/javascript"></script>
335
+ -->
336
+
337
+
338
+ </form>
339
+
340
+ </section>
341
+
342
+ <section>
343
+
344
+ <div class="row">
345
+ <div class="col-1-3">
346
+ <div class="picture">
347
+ <div data-mercury="full" id="pic1-1">
348
+ <img src="http://dummyimage.com/300x200/000/fff">
349
+ </div>
350
+ </div>
351
+ <h3 data-mercury="simple" id="hl1-1">Lorem ipsum dolor sit amet</h3>
352
+ <div class="teaser" data-mercury="full" id="teaser1-1">
353
+ <p>
354
+ <span class="s1">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cra
355
+ <a href="http://www.deerberg-dental.de/vollkeramik" rel="">&gt;&gt;</a>
356
+ </span>
357
+ </p>
358
+ </div>
359
+ </div>
360
+ <div class="col-2-3">
361
+ <div class="picture">
362
+ <div data-mercury="full" id="pic1-2">
363
+ <img src="http://dummyimage.com/300x200/000/fff">
364
+ </div>
365
+ </div>
366
+ <h3 data-mercury="simple" id="hl1-2">Lorem ipsum dolor sit amet</h3>
367
+ <div class="teaser" data-mercury="full" id="teaser1-2">
368
+ <p>
369
+ <span class="s1">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cra
370
+ <a href="http://www.deerberg-dental.de/vollkeramik" rel="">&gt;&gt;</a>
371
+ </span>
372
+ </p>
373
+ </div>
374
+ </div>
375
+ <div class="col-3-3">
376
+ <div class="picture">
377
+ <div data-mercury="full" id="pic1-3">
378
+ <img src="http://dummyimage.com/300x200/000/fff">
379
+ </div>
380
+ </div>
381
+ <h3 data-mercury="simple" id="hl1-3">Lorem ipsum dolor sit amet</h3>
382
+ <div class="teaser" data-mercury="full" id="teaser1-3">
383
+ <p>
384
+ <span class="s1">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cra
385
+ <a href="http://www.deerberg-dental.de/vollkeramik" rel="">&gt;&gt;</a>
386
+ </span>
387
+ </p>
388
+ </div>
389
+ </div>
390
+ </div>
391
+
392
+ <!-- LESS:
393
+ .row{
394
+ .clearfix();
395
+
396
+ .col-1-3, .col-2-3, .col-3-3{
397
+ width: 33.3%;
398
+ float: left;
399
+ }
400
+
401
+ }
402
+ -->
403
+
404
+ </section>
405
+
406
+
407
+
408
+ </main>
409
+
410
+ <footer>
411
+ </footer>
412
+ </div>
413
+
414
+ <script src="http://code.smooster.com/libs/jquery/1.9.1/jquery.js" type="text/javascript"></script>
415
+ <!-- Optional scripts - delete what you don't need (DONT FORGET TO: Fix path if you keep it!)-->
416
+ <script src="http://code.smooster.com/libs/jquery-ui/1.10.3/js/jquery-ui.min.js" type="text/javascript"></script>
417
+
418
+ <script src="http://code.smooster.com/libs/jquery.glide/1.0.6/jquery.glide.min.js" type="text/javascript"></script>
419
+
420
+ <script src="lib/selectBoxIt/jquery.selectBoxIt.js" type="text/javascript"></script>
421
+ <!-- END -->
422
+ <script src="http://code.smooster.com/libs/jquery.nivo.lightbox/1.0/nivo-lightbox.min.js" type="text/javascript"></script>
423
+ <script src="http://code.smooster.com/libs/jquery.nivo.lightbox/1.0/nivo-lightbox.start.js" type="text/javascript"></script>
424
+ <script src="media/js/functions.js" type="text/javascript"></script>
425
+ </body>
426
+ </html>
@@ -1 +1,8 @@
1
- require 'smooster'
1
+ require 'smooster'
2
+
3
+
4
+ RSpec.configure do |config|
5
+ config.before(:each) do
6
+ allow(Smooster::Application.instance).to receive(:base_dir) { File.expand_path('../smooster/example', __FILE__) }
7
+ end
8
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smooster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Maier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-13 00:00:00.000000000 Z
11
+ date: 2015-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -24,6 +24,118 @@ dependencies:
24
24
  - - ! '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
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: activemodel
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
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: rest-client
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: colorize
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: nokogiri
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '1.5'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '1.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
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: pry-debugger
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry-stack_explorer
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
27
139
  - !ruby/object:Gem::Dependency
28
140
  name: bundler
29
141
  requirement: !ruby/object:Gem::Requirement
@@ -83,9 +195,19 @@ files:
83
195
  - Rakefile
84
196
  - bin/smooster
85
197
  - lib/smooster.rb
198
+ - lib/smooster/application.rb
86
199
  - lib/smooster/cli/executable.rb
200
+ - lib/smooster/deploy/media_asset.rb
201
+ - lib/smooster/deploy/media_assets.rb
202
+ - lib/smooster/deploy/site_template.rb
203
+ - lib/smooster/deploy/site_templates.rb
204
+ - lib/smooster/rest-client/rest-client-purge.rb
205
+ - lib/smooster/templates/configure.yml
87
206
  - lib/smooster/version.rb
207
+ - logs/application.log
88
208
  - smooster.gemspec
209
+ - spec/smooster/deploy/site_template_spec.rb
210
+ - spec/smooster/example/html/index.html
89
211
  - spec/smooster/smooster_spec.rb
90
212
  - spec/spec_helper.rb
91
213
  homepage: http://www.smooster.com
@@ -108,10 +230,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
230
  version: '0'
109
231
  requirements: []
110
232
  rubyforge_project:
111
- rubygems_version: 2.0.6
233
+ rubygems_version: 2.4.5
112
234
  signing_key:
113
235
  specification_version: 4
114
236
  summary: smooster command line tool writen in ruby.
115
237
  test_files:
238
+ - spec/smooster/deploy/site_template_spec.rb
239
+ - spec/smooster/example/html/index.html
116
240
  - spec/smooster/smooster_spec.rb
117
241
  - spec/spec_helper.rb