spontaneous 0.2.0.alpha4 → 0.2.0.alpha5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/bin/spot CHANGED
@@ -3,21 +3,31 @@
3
3
  require 'rubygems' unless defined?(Gem) # Useful only on --dev mode
4
4
  require 'bundler'
5
5
 
6
- begin
7
- Bundler.setup(:default)
8
- rescue Bundler::GemfileNotFound
9
- # We're operating outside of a site dir, probably generating a site
10
- # so load the Spontaneous gem Gemfile
11
- ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
12
- retry
13
- rescue Bundler::GemNotFound => e
14
- STDERR.puts e.message
15
- STDERR.puts "Try running `bundle install`."
16
- exit!
6
+ # Are we in the root of a Spontaneous site?
7
+ # If so then we want to use the bundled version of Spontaneous and its
8
+ # dependencies
9
+ if File.exist?("config/schema.yml")
10
+ begin
11
+ Bundler.setup(:default)
12
+ rescue Bundler::GemfileNotFound
13
+ # We're operating outside of a site dir, probably generating a site
14
+ # so load the Spontaneous gem Gemfile
15
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
16
+ retry
17
+ rescue Bundler::GemNotFound => e
18
+ STDERR.puts e.message
19
+ STDERR.puts "Try running `bundle install`."
20
+ exit!
21
+ end
22
+ else
23
+ # If spot is being run outside of a site, then we want to use the global
24
+ # gem files
25
+ spot_path = File.expand_path('../../lib', __FILE__)
26
+ if File.directory?(spot_path) && !$:.include?(spot_path)
27
+ $:.unshift(spot_path)
28
+ end
17
29
  end
18
30
 
19
- spot_path = File.expand_path('../../lib', __FILE__)
20
- $:.unshift(spot_path) if File.directory?(spot_path) && !$:.include?(spot_path)
31
+ require 'spontaneous'
21
32
 
22
- require 'spontaneous/cli'
23
- Spontaneous::Cli::Runner.start(ARGV)
33
+ Spontaneous::Cli::Root.start(ARGV)
@@ -29,7 +29,7 @@ Capistrano::Configuration.instance(:must_exist).load do
29
29
  end
30
30
 
31
31
  task :bundle_assets do
32
- run "cd #{release_path} && bundle exec spot assets:compile --destination=#{release_path}"
32
+ run "cd #{release_path} && ./bin/spot assets compile --destination=#{release_path}"
33
33
  end
34
34
  end
35
35
 
@@ -1,17 +1,16 @@
1
1
  module Spontaneous
2
2
  module Cli
3
- class Assets < ::Spontaneous::Cli::Thor
4
- Spontaneous = ::Spontaneous
3
+ class Assets < ::Thor
4
+ include Spontaneous::Cli::TaskUtils
5
+
5
6
  namespace :assets
6
7
  default_task :compile
7
8
 
8
9
 
9
- # class Up < SyncTask
10
- # desc "Syncs up"
11
- # end
10
+ desc "compile", "Compiles assets for the Spontaneous UI"
12
11
 
13
- desc "#{namespace}:compile", "Compiles assets for the Spontaneous UI"
14
12
  method_option :destination, :type => :string, :aliases => "-d", :required => true, :desc => "Compile assets into DESTINATION"
13
+
15
14
  def compile
16
15
  prepare(:compile)
17
16
  # options[:mode] = :console
@@ -20,7 +19,7 @@ module Spontaneous
20
19
  spec = Bundler.load.specs.find{|s| s.name == "spontaneous" }
21
20
  p spec.full_gem_path
22
21
 
23
- compiler = Spontaneous::Asset::AppCompiler.new(spec.full_gem_path, options.destination)
22
+ compiler = ::Spontaneous::Asset::AppCompiler.new(spec.full_gem_path, options.destination)
24
23
  compiler.compile
25
24
  end
26
25
  end
@@ -2,34 +2,26 @@
2
2
 
3
3
  # require 'watchr'
4
4
 
5
- module Spontaneous::Cli
6
- class Console < ::Spontaneous::Cli::Thor
7
- Spontaneous = ::Spontaneous
5
+ module ::Spontaneous::Cli
6
+ class Console < ::Thor
7
+ include Spontaneous::Cli::TaskUtils
8
8
  include Thor::Actions
9
- namespace :console
10
9
 
10
+ namespace :console
11
11
  default_task :open
12
12
 
13
- desc "#{namespace}:open", "Gives you console access to the current site"
13
+ desc "open", "Gives you console access to the current site"
14
14
  def open
15
- # script = Watchr::Script.new
16
- # script.watch('(lib|schema)/.*\\.rb') { puts 'reload!' } # doesn't block
17
- # Thread.new do
18
- # Watchr::Controller.new(script, Watchr.handler.new).run
19
- # end
15
+ prepare! :console
20
16
 
21
-
22
- ENV["SPOT_MODE"] = "console"
23
- prepare :console
24
17
  ARGV.clear
25
18
  ARGV.concat [ "--readline", "--prompt-mode", "simple" ]
26
- require 'irb'
27
- boot!
28
19
 
20
+ require 'irb'
29
21
  require 'irb/completion'
30
22
  require 'irb/ext/save-history'
31
23
 
32
- history_file = Spontaneous.root / ".irb_history"
24
+ history_file = ::Spontaneous.root / ".irb_history"
33
25
 
34
26
  IRB.setup(nil)
35
27
  IRB.conf[:SAVE_HISTORY] = 100
@@ -38,8 +30,7 @@ module Spontaneous::Cli
38
30
  irb = IRB::Irb.new
39
31
  IRB.conf[:MAIN_CONTEXT] = irb.context
40
32
 
41
- irb.context.evaluate((<<-INIT), __LINE__)
42
-
33
+ irb.context.evaluate((<<-CONTEXT), __LINE__)
43
34
  module Readline
44
35
  module History
45
36
  def self.write_log(line)
@@ -57,16 +48,15 @@ module Spontaneous::Cli
57
48
  ln
58
49
  end
59
50
  end
60
-
61
-
62
- INIT
51
+ CONTEXT
63
52
 
64
53
  trap("SIGINT") do
65
54
  irb.signal_handle
66
55
  end
67
- catch(:IRB_EXIT) do
56
+
57
+ catch("IRB_EXIT") do
68
58
  irb.eval_input
69
59
  end
70
60
  end
71
61
  end # Console
72
- end # Spontaneous::Cli
62
+ end # ::Spontaneous::Cli
@@ -0,0 +1,30 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'public_suffix'
4
+
5
+ module Spontaneous::Cli
6
+ class Generate < ::Thor
7
+ include Spontaneous::Cli::TaskUtils
8
+ include Thor::Actions
9
+
10
+ namespace :generate
11
+
12
+ default_task :site
13
+
14
+ desc "site [DOMAIN]", "Generates a site skeleton. Usage: spot generate <site domain name>"
15
+ def site(*args)
16
+ require File.expand_path('../../../spontaneous', __FILE__)
17
+ ::Spontaneous::Generators::Site.start(args)
18
+ end
19
+
20
+ def method_missing(method, *args)
21
+ if PublicSuffix.valid?(method.to_s)
22
+ args.unshift(method.to_s)
23
+ self.send(:site, *args)
24
+ else
25
+ super
26
+ end
27
+ end
28
+ end # Generate
29
+ end # Spontaneous::Cli
30
+
@@ -0,0 +1,48 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Cli
4
+ class Init < ::Thor
5
+ include Spontaneous::Cli::TaskUtils
6
+ include Thor::Actions
7
+
8
+ namespace :init
9
+
10
+ default_task :init
11
+
12
+ desc :init, "Creates databases and initialises a new Spontaneous site"
13
+ def init
14
+ prepare :init
15
+ site = ::Spontaneous::Site.instantiate(Dir.pwd, options.environment, :back)
16
+ require File.expand_path('../../../spontaneous', __FILE__)
17
+ Sequel.extension :migration
18
+ connection_params = ::Spontaneous.db_settings
19
+ connection_params[:user] = 'root'
20
+ database = connection_params.delete(:database)
21
+ password = connection_params.delete(:password)
22
+ catch(:error) do
23
+ Sequel.connect(connection_params) do |connection|
24
+ ["", "_test"].map { |ext| "#{database}#{ext}"}.each do |db|
25
+ begin
26
+ say " >> Creating database `#{db}`"
27
+ connection.run("CREATE DATABASE `#{db}` CHARACTER SET UTF8")
28
+ rescue => e
29
+ say " >>> Unable to create #{connection_params[:adapter]} database `#{db}`:\n > #{e}", :red
30
+ # throw :error
31
+ end
32
+ begin
33
+ connection.run("USE `#{db}`")
34
+ connection.logger = nil
35
+ say " >> Running migrations..."
36
+ Sequel::Migrator.apply(connection, ::Spontaneous.gem_dir('db/migrations'))
37
+ say " >> Done"
38
+ rescue => e
39
+ say " >>> Error running migrations on database `#{db}`:\n > #{e}", :red
40
+ end
41
+ end
42
+ end
43
+ boot!
44
+ end
45
+ end
46
+
47
+ end # Init
48
+ end # Spontaneous::Cli
@@ -4,7 +4,7 @@ module Spontaneous
4
4
  class Media < ::Thor
5
5
  namespace :media
6
6
 
7
- desc "#{namespace}:cleanup", "Removes stale temp files"
7
+ desc "cleanup", "Removes stale temp files"
8
8
  def cleanup
9
9
  puts "CLEANING UP!!"
10
10
  end
@@ -0,0 +1,22 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Cli
4
+ class Migrate < ::Thor
5
+ include Spontaneous::Cli::TaskUtils
6
+ include Thor::Actions
7
+
8
+ namespace :migrate
9
+ default_task :apply
10
+
11
+ desc :apply, "Runs Spontaneous migrations"
12
+ def apply
13
+ prepare! :migrate
14
+ Sequel.extension :migration
15
+ connection_params = ::Spontaneous.db_settings
16
+ say " >> Running migrations..."
17
+ Sequel::Migrator.apply(Spontaneous.database, ::Spontaneous.gem_dir('db/migrations'))
18
+ say " >> Done"
19
+ end
20
+
21
+ end # Migrate
22
+ end # Spontaneous::Cli
@@ -1,31 +1,34 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'spontaneous'
3
+ # require 'spontaneous'
4
4
  require 'simultaneous'
5
5
  require 'foreman'
6
6
  require 'foreman/engine'
7
7
 
8
8
  module Spontaneous
9
9
  module Cli
10
- class Server < ::Spontaneous::Cli::Thor
11
- namespace :server
10
+ class Server < ::Thor
11
+ include Spontaneous::Cli::TaskUtils
12
+
13
+ namespace :server
12
14
  default_task :start
13
15
 
14
16
  class_option :no_browser, :type => :boolean, :default => false, :aliases => "-b", :desc => "Don't launch browser"
15
17
 
16
- desc "#{namespace}:start", "Starts Spontaneous in development mode"
18
+ desc "start", "Starts Spontaneous in development mode"
17
19
  def start
20
+ # I can do this programatically in the latest version of Foreman
18
21
  File.open(".Procfile", 'wb') do |procfile|
19
- procfile.write(%(back: #{binary} server:back --root=#{options.site}\n))
20
- procfile.write(%(front: #{binary} server:front --root=#{options.site}\n))
21
- procfile.write(%(simultaneous: #{binary} server:simultaneous --root=#{options.site}\n))
22
+ procfile.write(%(back: #{binary} server back --root=#{options.site}\n))
23
+ procfile.write(%(front: #{binary} server front --root=#{options.site}\n))
24
+ procfile.write(%(simultaneous: #{binary} server simultaneous --root=#{options.site}\n))
22
25
  procfile.flush
23
26
  engine = ::Foreman::Engine.new(procfile.path)
24
27
  engine.start
25
28
  end
26
29
  end
27
30
 
28
- desc "#{namespace}:front", "Starts Spontaneous in front/public mode"
31
+ desc "front", "Starts Spontaneous in front/public mode"
29
32
  # method_option :adapter, :type => :string, :aliases => "-a", :desc => "Rack Handler (default: autodetect)"
30
33
  method_option :host, :type => :string, :aliases => "-h", :desc => "Bind to HOST address"
31
34
  method_option :port, :type => :numeric, :aliases => "-p", :desc => "Use PORT"
@@ -33,7 +36,7 @@ module Spontaneous
33
36
  start_server(:front)
34
37
  end
35
38
 
36
- desc "#{namespace}:back", "Starts Spontaneous in back/CMS mode"
39
+ desc "back", "Starts Spontaneous in back/CMS mode"
37
40
  # method_option :adapter, :type => :string, :aliases => "-a", :desc => "Rack Handler (default: autodetect)"
38
41
  method_option :host, :type => :string, :aliases => "-h", :desc => "Bind to HOST address"
39
42
  method_option :port, :type => :numeric, :aliases => "-p", :desc => "Use PORT"
@@ -41,11 +44,10 @@ module Spontaneous
41
44
  start_server(:back)
42
45
  end
43
46
 
44
- desc "#{namespace}:simultaneous", "Launches the Simultaneous server"
47
+ desc "simultaneous", "Launches the Simultaneous server"
45
48
  method_option :connection, :type => :string, :aliases => "-c", :desc => "Use CONNECTION"
46
49
  def simultaneous
47
- prepare(:start)
48
- boot!
50
+ prepare! :start
49
51
  connection = options[:connection] || ::Spontaneous.config.simultaneous_connection
50
52
  fork {
51
53
  ENV.delete("BUNDLE_GEMFILE")
@@ -63,11 +65,8 @@ module Spontaneous
63
65
  end
64
66
 
65
67
  def start_server(mode)
66
- prepare mode.to_sym
67
- ENV["SPOT_MODE"] = mode.to_s
68
- require File.expand_path(File.dirname(__FILE__) + "/adapter")
69
- boot!
70
- Spontaneous::Cli::Adapter.start(options)
68
+ prepare! :server, mode
69
+ Spontaneous::Server.run!(options)
71
70
  end
72
71
 
73
72
  end
@@ -2,7 +2,8 @@ require 'spontaneous/cli'
2
2
 
3
3
  module Spontaneous
4
4
  module Cli
5
- class Site < ::Spontaneous::Cli::Thor
5
+ class Site < ::Thor
6
+ include Spontaneous::Cli::TaskUtils
6
7
  namespace :site
7
8
 
8
9
  default_task :browse
@@ -98,26 +99,23 @@ module Spontaneous
98
99
  end
99
100
  end
100
101
 
101
- desc "#{namespace}:dump", "Dumps the current site to an archive on the local machine"
102
+ desc "dump", "Dumps the current site to an archive on the local machine"
102
103
  def dump
103
- prepare :dump
104
- boot!
104
+ prepare! :dump
105
105
  Dump.start
106
106
  end
107
107
 
108
- desc "#{namespace}:load", "Uploads a dump of the current site to a remote server"
108
+ desc "load", "Uploads a dump of the current site to a remote server"
109
109
  def load
110
- prepare :load
111
- boot!
110
+ prepare! :load
112
111
  Load.start
113
112
  end
114
113
 
115
- desc "#{namespace}:publish", "Publishes the site"
114
+ desc "publish", "Publishes the site"
116
115
  method_option :pages, :type => :array, :desc => "List of pages to publish"
117
116
  method_option :logfile, :type => :string, :desc => "Location of logfile"
118
117
  def publish
119
- prepare :publish
120
- boot!
118
+ prepare! :publish
121
119
  ::Site.publishing_method = :immediate
122
120
  ::Spontaneous::Logger.setup(:logfile => options.logfile) if options.logfile
123
121
  say "Creating revision #{::Site.revision}", :green, true
@@ -130,22 +128,20 @@ module Spontaneous
130
128
  end
131
129
  end
132
130
 
133
- desc "#{namespace}:render", "Re-renders the current content"
131
+ desc "render", "Re-renders the current content"
134
132
  def render
135
- prepare :render
136
- boot!
133
+ prepare! :render
137
134
  ::Site.publishing_method = :immediate
138
135
  ::Site.rerender
139
136
  end
140
137
 
141
- desc "#{namespace}:revision", "Shows the site status"
138
+ desc "revision", "Shows the site status"
142
139
  def revision
143
- prepare :revision
144
- boot!
140
+ prepare! :revision
145
141
  say "Site is at revision #{::Site.revision}", :green
146
142
  end
147
143
 
148
- desc "#{namespace}:browse", "Launces a browser pointing to the current development CMS"
144
+ desc "browse", "Launces a browser pointing to the current development CMS"
149
145
  def browse
150
146
  prepare :browse
151
147
  require 'launchy'
@@ -1,8 +1,9 @@
1
1
 
2
2
  module Spontaneous
3
3
  module Cli
4
- class Sync < ::Spontaneous::Cli::Thor
5
- Spontaneous = ::Spontaneous
4
+ class Sync < ::Thor
5
+ include Spontaneous::Cli::TaskUtils
6
+
6
7
  namespace :sync
7
8
  default_task :down
8
9
 
@@ -28,12 +29,12 @@ module Spontaneous
28
29
  desc "Syncs up"
29
30
  end
30
31
 
31
- desc "#{namespace}:down", "Makes the local copy a clone of the live server"
32
+ desc "down", "Makes the local copy a clone of the production server"
32
33
  def down
33
34
  Down.start
34
35
  end
35
36
 
36
- desc "#{namespace}:up", "Makes the local copy a clone of the live server"
37
+ desc "up", "Makes the local copy a clone of the production server"
37
38
  def up
38
39
  Down.start
39
40
  end
@@ -1,9 +1,9 @@
1
1
 
2
- module Spontaneous
2
+ module ::Spontaneous
3
3
  module Cli
4
- class User < ::Spontaneous::Cli::Thor
5
- Spontaneous = ::Spontaneous
6
- namespace :user
4
+ class User < ::Thor
5
+ include Spontaneous::Cli::TaskUtils
6
+ # namespace :user
7
7
 
8
8
  default_task :add
9
9
 
@@ -23,11 +23,11 @@ module Spontaneous
23
23
  def add
24
24
  prepare :adduser, :console
25
25
  boot!
26
- users = Spontaneous::Permissions::User.count
26
+ users = ::Spontaneous::Permissions::User.count
27
27
  attrs = {}
28
28
  width = 14
29
29
  valid_login = /^[a-z0-9_]{3,}$/
30
- levels = Spontaneous::Permissions::UserLevel.all.map(&:to_s)
30
+ levels = ::Spontaneous::Permissions::UserLevel.all.map(&:to_s)
31
31
  level = nil
32
32
 
33
33
  say("\nAll fields are required:\n", :green)
@@ -88,7 +88,7 @@ module Spontaneous
88
88
  end
89
89
  end
90
90
 
91
- user = Spontaneous::Permissions::User.new(attrs)
91
+ user = ::Spontaneous::Permissions::User.new(attrs)
92
92
 
93
93
  if user.save
94
94
  user.update(:level => level)
@@ -1,25 +1,26 @@
1
1
  require 'thor'
2
- require 'thor/runner'
2
+ require 'thor/group'
3
3
 
4
4
  module Spontaneous
5
5
  module Cli
6
- class Thor < ::Thor
6
+ module TaskUtils
7
+ # include Thor::Actions
7
8
 
8
- class_option :site, :type => :string, :aliases => ["-s", "--root"], :desc => "Site root dir"
9
- class_option :environment, :type => :string, :aliases => "-e", :required => true, :default => :development, :desc => "Spontaneous Environment"
10
- class_option :mode, :type => :string, :aliases => "-m", :default => :back, :desc => "Spontaneous mode ('front' or 'back')"
11
- class_option :help, :type => :boolean, :desc => "Show help usage"
12
-
13
- protected
14
-
15
- def boot!
16
- begin
17
- require File.expand_path('config/boot.rb')
18
- rescue Spontaneous::SchemaModificationError => error
19
- fix_schema(error)
9
+ def self.included(base)
10
+ base.class_eval do
11
+ def self.banner(task, namespace = true, subcommand = false)
12
+ "#{basename} #{task.formatted_usage(self, true, subcommand)}"
13
+ end
20
14
  end
15
+ base.class_option :site, :type => :string, :aliases => ["-s", "--root"], :desc => "Site root dir"
16
+ base.class_option :environment, :type => :string, :aliases => "-e", :required => true, :default => :development, :desc => "Spontaneous Environment"
17
+ base.class_option :mode, :type => :string, :aliases => "-m", :default => :back, :desc => "Spontaneous mode ('front' or 'back')"
18
+ base.class_option :help, :type => :boolean, :desc => "Show help usage"
21
19
  end
22
20
 
21
+
22
+ protected
23
+
23
24
  def fix_schema(error)
24
25
  modification = error.modification
25
26
  actions = modification.actions
@@ -42,14 +43,14 @@ module Spontaneous
42
43
  end
43
44
  end
44
45
 
45
- def prepare(task, mode = nil)
46
+ def prepare(task, mode = "console")
46
47
  if options.help?
47
48
  help(task.to_s)
48
49
  raise SystemExit
49
50
  end
50
- ENV["SPOT_ENV"] ||= options.environment.to_s
51
+ ENV["SPOT_ENV"] ||= options.environment.to_s ||
51
52
  ENV["RACK_ENV"] = ENV["SPOT_ENV"] # Also set this for middleware
52
- ENV["SPOT_MODE"] = mode.to_s unless mode.nil?
53
+ ENV["SPOT_MODE"] = mode.to_s
53
54
  chdir(options.site)
54
55
  unless File.exist?('config/boot.rb')
55
56
  puts "=> Could not find boot file in: #{options.chdir}/config/boot.rb\n=> Are you sure this is a Spontaneous site?"
@@ -57,6 +58,19 @@ module Spontaneous
57
58
  end
58
59
  end
59
60
 
61
+ def prepare!(task, mode = "console")
62
+ prepare(task, mode)
63
+ boot!
64
+ end
65
+
66
+ def boot!
67
+ begin
68
+ require File.expand_path('config/boot.rb')
69
+ rescue Spontaneous::SchemaModificationError => error
70
+ fix_schema(error)
71
+ end
72
+ end
73
+
60
74
  def chdir(dir)
61
75
  return unless dir
62
76
  begin
@@ -69,116 +83,41 @@ module Spontaneous
69
83
  end
70
84
  end
71
85
 
72
- class Runner < ::Thor
73
- namespace "default"
74
-
75
- remove_task :help
76
-
77
- map %w(-T) => :list, %w(--version -v) => :version
86
+ autoload :Console, "spontaneous/cli/console"
87
+ autoload :Site, "spontaneous/cli/site"
88
+ autoload :Init, "spontaneous/cli/init"
89
+ autoload :User, "spontaneous/cli/user"
90
+ autoload :Generate, "spontaneous/cli/generate"
91
+ autoload :Server, "spontaneous/cli/server"
92
+ autoload :Media, "spontaneous/cli/media"
93
+ autoload :Sync, "spontaneous/cli/sync"
94
+ autoload :Migrate, "spontaneous/cli/migrate"
95
+ autoload :Assets, "spontaneous/cli/assets"
96
+
97
+ class Root < ::Thor
98
+ register Spontaneous::Cli::Console, "console", "console", "Gives you console access to the current site"
99
+ register Spontaneous::Cli::User, "user", "user [ACTION]", "Administer site users"
100
+ register Spontaneous::Cli::Generate, "generate", "generate [OBJECT]", "Generates things"
101
+ register Spontaneous::Cli::Site, "site", "site [ACTION]", "Run site-wide actions"
102
+ register Spontaneous::Cli::Init, "init", "init", "Creates databases and initialises a new Spontaneous site"
103
+ register Spontaneous::Cli::Server, "server", "server [ACTION]", "Launch development server(s)"
104
+ register Spontaneous::Cli::Media, "media", "media [ACTION]", "Manage site media"
105
+ register Spontaneous::Cli::Sync, "sync", "sync [DIRECTION]", "Sync database and media to and from the production server"
106
+ register Spontaneous::Cli::Migrate, "migrate", "migrate", "Runs Spontaneous migrations"
107
+ register Spontaneous::Cli::Assets, "assets", "assets [ACTION]", "Manage Spontaneous assets"
108
+
109
+ desc :browse, "Launces a browser pointing to the current development CMS"
110
+ def browse
111
+ prepare! :browse
112
+ require 'launchy'
113
+ ::Launchy.open("http://localhost:#{::Spontaneous::Site.config.port}/@spontaneous")
114
+ end
78
115
 
79
- desc "version", "Show Spontaneous version"
116
+ desc :version, "Show the version of Spontaneous in use"
80
117
  def version
81
- require 'spontaneous/version'
118
+ require "spontaneous/version"
82
119
  say "Spontaneous #{Spontaneous::VERSION}"
83
120
  end
84
-
85
- desc "list [SEARCH]", "List the available tasks (--substring means .*SEARCH)"
86
- method_options :substring => :boolean, :group => :string, :all => :boolean, :debug => :boolean
87
- def list(search="")
88
- initialize_thorfiles
89
-
90
- search = ".*#{search}" if options["substring"]
91
- search = /^#{search}.*/i
92
- group = options[:group] || "standard"
93
-
94
- klasses = Thor::Base.subclasses.select do |k|
95
- (options[:all] || k.group == group) && k.namespace =~ search
96
- end
97
-
98
- display_klasses(false, false, klasses)
99
- end
100
-
101
- # Override Thor#help so it can give information about any class and any method.
102
- #
103
- desc "help [TASK]", "Describe available tasks or one specific task"
104
- def help(task = nil, subcommand = false)
105
- task ? self.class.task_help(shell, task) : self.class.help(shell, subcommand)
106
- end
107
-
108
-
109
- # Override Thor#help so it can give information about any class and any method.
110
- #
111
- def help(meth = nil)
112
- if meth && !self.respond_to?(meth)
113
- initialize_thorfiles(meth)
114
- klass, task = Thor::Util.find_class_and_task_by_namespace(meth)
115
- klass.start(["-h", task].compact, :shell => self.shell)
116
- else
117
- list
118
- end
119
- end
120
-
121
- # If a task is not found on Thor::Runner, method missing is invoked and
122
- # Thor::Runner is then responsable for finding the task in all classes.
123
- #
124
- def method_missing(meth, *args)
125
- meth = meth.to_s
126
- initialize_thorfiles(meth)
127
- klass, task = Thor::Util.find_class_and_task_by_namespace(meth)
128
- args.unshift(task) if task
129
- klass.start(args, :shell => self.shell)
130
- end
131
-
132
- private
133
-
134
- # Display information about the given klasses. If with_module is given,
135
- # it shows a table with information extracted from the yaml file.
136
- #
137
- def display_klasses(with_modules=false, show_internal=false, klasses=Thor::Base.subclasses)
138
- klasses -= [Thor, Thor::Runner, Thor::Group] unless show_internal
139
-
140
- raise Error, "No tasks available" if klasses.empty?
141
- show_modules if with_modules && !thor_yaml.empty?
142
-
143
- list = Hash.new { |h,k| h[k] = [] }
144
- groups = klasses.select { |k| k.ancestors.include?(Thor::Group) }
145
-
146
- # Get classes which inherit from Thor
147
- (klasses - groups).each { |k| list[k.namespace.split(":").first] += k.printable_tasks(false) }
148
-
149
- list.delete("thor")
150
-
151
- # Order namespaces with default coming first
152
- list = list.sort{ |a,b| a[0].sub(/^default/, '') <=> b[0].sub(/^default/, '') }
153
- list.each { |n, tasks| display_tasks(n, tasks) unless tasks.empty? }
154
- end
155
-
156
- def display_tasks(namespace, list) #:nodoc:
157
- list.sort!{ |a,b| a[0] <=> b[0] }
158
-
159
- say shell.set_color(namespace, :blue, true)
160
- say "-" * namespace.size
161
-
162
- print_table(list, :truncate => true)
163
- say
164
- end
165
-
166
- def initialize_thorfiles(relevant_to=nil, skip_lookup=false)
167
- thorfiles(relevant_to, skip_lookup).each do |f|
168
- Thor::Util.load_thorfile(f, nil, options[:debug]) unless Thor::Base.subclass_files.keys.include?(File.expand_path(f))
169
- end
170
- end
171
-
172
- def thorfiles(*args)
173
- task_dir = File.expand_path('../cli', __FILE__)
174
- Dir["#{task_dir}/*.rb"]
175
- end
176
121
  end
177
-
178
- autoload :Adapter, "spontaneous/cli/adapter"
179
- autoload :Base, "spontaneous/cli/base"
180
- autoload :Site, "spontaneous/cli/site"
181
- autoload :User, "spontaneous/cli/user"
182
122
  end
183
123
  end
184
-
@@ -1,8 +1,8 @@
1
1
  source :rubygems
2
2
 
3
3
  ## choose your poison:
4
- # gem 'pg', '~> 0.9.0'
5
- gem 'mysql2', '~> 0.2'
4
+ # gem 'pg', '~> 0.14.0'
5
+ gem 'mysql2', '~> 0.3'
6
6
 
7
7
  # Deploy with Capistrano
8
8
  gem 'capistrano', '~> 2.9'
@@ -19,10 +19,10 @@ gem 'capistrano', '~> 2.9'
19
19
  gem 'spontaneous', :git => "git://github.com/SpontaneousCMS/spontaneous.git"
20
20
  gem 'simultaneous', :git => "git://github.com/SpontaneousCMS/simultaneous.git"
21
21
 
22
- group :production do
23
- gem 'thin', '~> 1.3.1'
24
- gem 'unicorn', '~> 4.2'
25
- end
22
+ # group :production do
23
+ # gem 'thin', '~> 1.3.1'
24
+ # gem 'unicorn', '~> 4.2'
25
+ # end
26
26
 
27
27
 
28
28
  # source gemfiles from Plugins & Features
@@ -0,0 +1,2 @@
1
+ # Maps database IDs to content classes
2
+ # Will be automatically generated & maintained
@@ -68,7 +68,10 @@ module Spontaneous
68
68
  2. bundle install
69
69
  3. spot init
70
70
 
71
- Then go to http://spontaneouscms.org/docs
71
+ Then go to
72
+
73
+ http://spontaneous.io/documentation
74
+
72
75
  and read the many useful guides to getting started with Spontaneous.
73
76
 
74
77
  MSG
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Spontaneous
4
- VERSION = "0.2.0.alpha4"
4
+ VERSION = "0.2.0.alpha5"
5
5
  GEM = false
6
6
  end
data/spontaneous.gemspec CHANGED
@@ -14,8 +14,8 @@ Gem::Specification.new do |s|
14
14
  ## If your rubyforge_project name is different, then edit it and comment out
15
15
  ## the sub! line in the Rakefile
16
16
  s.name = 'spontaneous'
17
- s.version = '0.2.0.alpha4'
18
- s.date = '2012-10-15'
17
+ s.version = '0.2.0.alpha5'
18
+ s.date = '2012-10-16'
19
19
  s.rubyforge_project = 'spontaneous'
20
20
 
21
21
  ## Make sure your summary is short. The description may be as long
@@ -75,7 +75,7 @@ Gem::Specification.new do |s|
75
75
  s.add_dependency('stringex', ["= 1.3"])
76
76
  s.add_dependency('therubyracer', ['~> 0.9.10'])
77
77
  s.add_dependency('thin', ["~> 1.2"])
78
- s.add_dependency('thor', ["~> 0.14.6"])
78
+ s.add_dependency('thor', ["~> 0.16.0"])
79
79
  s.add_dependency('uglifier', ["~> 1.3.0"])
80
80
  s.add_dependency('oj', ["~> 1.4"])
81
81
 
@@ -286,15 +286,15 @@ Gem::Specification.new do |s|
286
286
  lib/spontaneous/capistrano/sync.rb
287
287
  lib/spontaneous/change.rb
288
288
  lib/spontaneous/cli.rb
289
- lib/spontaneous/cli/adapter.rb
290
289
  lib/spontaneous/cli/assets.rb
291
- lib/spontaneous/cli/base.rb
292
290
  lib/spontaneous/cli/console.rb
291
+ lib/spontaneous/cli/generate.rb
292
+ lib/spontaneous/cli/init.rb
293
293
  lib/spontaneous/cli/media.rb
294
+ lib/spontaneous/cli/migrate.rb
294
295
  lib/spontaneous/cli/server.rb
295
296
  lib/spontaneous/cli/site.rb
296
297
  lib/spontaneous/cli/sync.rb
297
- lib/spontaneous/cli/tasks.rb
298
298
  lib/spontaneous/cli/user.rb
299
299
  lib/spontaneous/collections/box_set.rb
300
300
  lib/spontaneous/collections/change_set.rb
@@ -349,6 +349,7 @@ Gem::Specification.new do |s|
349
349
  lib/spontaneous/generators/site/config/environments/production.rb.tt
350
350
  lib/spontaneous/generators/site/config/front.ru
351
351
  lib/spontaneous/generators/site/config/indexes.rb.tt
352
+ lib/spontaneous/generators/site/config/schema.yml
352
353
  lib/spontaneous/generators/site/config/user_levels.yml
353
354
  lib/spontaneous/generators/site/lib/site.rb.tt
354
355
  lib/spontaneous/generators/site/lib/tasks/site.rake.tt
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spontaneous
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.alpha4
4
+ version: 0.2.0.alpha5
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-15 00:00:00.000000000 Z
12
+ date: 2012-10-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -450,7 +450,7 @@ dependencies:
450
450
  requirements:
451
451
  - - ~>
452
452
  - !ruby/object:Gem::Version
453
- version: 0.14.6
453
+ version: 0.16.0
454
454
  type: :runtime
455
455
  prerelease: false
456
456
  version_requirements: !ruby/object:Gem::Requirement
@@ -458,7 +458,7 @@ dependencies:
458
458
  requirements:
459
459
  - - ~>
460
460
  - !ruby/object:Gem::Version
461
- version: 0.14.6
461
+ version: 0.16.0
462
462
  - !ruby/object:Gem::Dependency
463
463
  name: uglifier
464
464
  requirement: !ruby/object:Gem::Requirement
@@ -864,15 +864,15 @@ files:
864
864
  - lib/spontaneous/capistrano/sync.rb
865
865
  - lib/spontaneous/change.rb
866
866
  - lib/spontaneous/cli.rb
867
- - lib/spontaneous/cli/adapter.rb
868
867
  - lib/spontaneous/cli/assets.rb
869
- - lib/spontaneous/cli/base.rb
870
868
  - lib/spontaneous/cli/console.rb
869
+ - lib/spontaneous/cli/generate.rb
870
+ - lib/spontaneous/cli/init.rb
871
871
  - lib/spontaneous/cli/media.rb
872
+ - lib/spontaneous/cli/migrate.rb
872
873
  - lib/spontaneous/cli/server.rb
873
874
  - lib/spontaneous/cli/site.rb
874
875
  - lib/spontaneous/cli/sync.rb
875
- - lib/spontaneous/cli/tasks.rb
876
876
  - lib/spontaneous/cli/user.rb
877
877
  - lib/spontaneous/collections/box_set.rb
878
878
  - lib/spontaneous/collections/change_set.rb
@@ -927,6 +927,7 @@ files:
927
927
  - lib/spontaneous/generators/site/config/environments/production.rb.tt
928
928
  - lib/spontaneous/generators/site/config/front.ru
929
929
  - lib/spontaneous/generators/site/config/indexes.rb.tt
930
+ - lib/spontaneous/generators/site/config/schema.yml
930
931
  - lib/spontaneous/generators/site/config/user_levels.yml
931
932
  - lib/spontaneous/generators/site/lib/site.rb.tt
932
933
  - lib/spontaneous/generators/site/lib/tasks/site.rake.tt
@@ -1385,7 +1386,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1385
1386
  version: 1.3.1
1386
1387
  requirements: []
1387
1388
  rubyforge_project: spontaneous
1388
- rubygems_version: 1.8.21
1389
+ rubygems_version: 1.8.24
1389
1390
  signing_key:
1390
1391
  specification_version: 2
1391
1392
  summary: Spontaneous is a next-generation Ruby CMS
@@ -1,13 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Spontaneous
4
- module Cli
5
- module Adapter
6
- class << self
7
- def start(options)
8
- ::Spontaneous::Server.run!(options)
9
- end
10
- end
11
- end # Adapter
12
- end # Cli
13
- end # Spontaneous
@@ -1,144 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'thor'
4
-
5
- module Spontaneous
6
- module Cli
7
- class Base < ::Spontaneous::Cli::Thor
8
- Spontaneous = ::Spontaneous
9
- include Thor::Actions
10
- namespace :default
11
-
12
- class InvalidGenerator < Error
13
- attr_reader :name
14
- def initialize(name)
15
- @name = name
16
- super()
17
- end
18
- end
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
- desc :console, "Gives you console access to the current site"
27
- def console
28
- ENV["SPOT_MODE"] = "console"
29
- prepare :console
30
- ARGV.clear
31
- require 'irb'
32
- boot!
33
- IRB.setup(nil)
34
- irb = IRB::Irb.new
35
- IRB.conf[:MAIN_CONTEXT] = irb.context
36
- irb.context.evaluate("require 'irb/completion'", 0)
37
- irb.context.evaluate("require '#{File.expand_path(File.dirname(__FILE__) + '/console')}'", 0)
38
- # irb.context.evaluate("include Spontaneous", 0)
39
- trap("SIGINT") do
40
- irb.signal_handle
41
- end
42
- catch(:IRB_EXIT) do
43
- irb.eval_input
44
- end
45
- end
46
-
47
- desc :generate, "Executes the Spontaneous generator with given options."
48
- def generate(*args)
49
- require File.expand_path('../../../spontaneous', __FILE__)
50
- ARGV.shift
51
- generator_name = ARGV.shift
52
- generator = nil
53
- d = Spontaneous::Generators
54
- case generator_name
55
- when ''
56
- raise InvalidGenerator.new(generator_name)
57
- when 'site'
58
- generator = d::Site
59
- when 'page'
60
- prepare(:generator)
61
- boot!
62
- generator = d::Page
63
- when /[a-zA-Z0-9-]+(\.[a-z]+)+/
64
- # generator called as 'spot generate domain.com'
65
- ARGV.unshift(generator_name)
66
- generator = d::Site
67
- else
68
- raise InvalidGenerator.new(generator_name)
69
- end
70
- generator.start(ARGV) if generator
71
- rescue InvalidGenerator => e
72
- say "Unrecognised generator '#{e.name}'. Available options are:\n\n #{available_generators.join("\n ")}\n"
73
- end
74
-
75
- desc :browse, "Launces a browser pointing to the current development CMS"
76
- def browse
77
- prepare :browse
78
- require 'launchy'
79
- boot!
80
- ::Launchy.open("http://localhost:#{Site.config.port}/@spontaneous")
81
- end
82
-
83
-
84
- desc :init, "Creates databases and initialises a new Spontaneous site"
85
- def init
86
- prepare :init
87
- site = Spontaneous::Site.instantiate(Dir.pwd, options.environment, :back)
88
- require File.expand_path('../../../spontaneous', __FILE__)
89
- Sequel.extension :migration
90
- connection_params = Spontaneous.db_settings
91
- connection_params[:user] = 'root'
92
- database = connection_params.delete(:database)
93
- password = connection_params.delete(:password)
94
- catch(:error) do
95
- Sequel.connect(connection_params) do |connection|
96
- ["", "_test"].map { |ext| "#{database}#{ext}"}.each do |db|
97
- begin
98
- say " >> Creating database `#{db}`"
99
- connection.run("CREATE DATABASE `#{db}` CHARACTER SET UTF8")
100
- rescue => e
101
- say " >>> Unable to create #{connection_params[:adapter]} database `#{db}`:\n > #{e}", :red
102
- # throw :error
103
- end
104
- begin
105
- connection.run("USE `#{db}`")
106
- connection.logger = nil
107
- say " >> Running migrations..."
108
- Sequel::Migrator.apply(connection, Spontaneous.gem_dir('db/migrations'))
109
- say " >> Done"
110
- rescue => e
111
- say " >>> Error running migrations on database `#{db}`:\n > #{e}", :red
112
- end
113
- end
114
- end
115
- boot!
116
- end
117
- end
118
-
119
- desc :migrate, "Runs migrations"
120
- def migrate
121
- prepare :init
122
- boot!
123
- Sequel.extension :migration
124
- connection_params = Spontaneous.db_settings
125
- say " >> Running migrations..."
126
- Sequel::Migrator.apply(Spontaneous.database, Spontaneous.gem_dir('db/migrations'))
127
- say " >> Done"
128
- end
129
-
130
- private
131
-
132
-
133
- def available_generators
134
- Spontaneous::Generators.available.map do |g|
135
- g.name.demodulize.underscore
136
- end
137
- end
138
-
139
-
140
-
141
-
142
- end # Base
143
- end # Cli
144
- end # Spontaneous
@@ -1,9 +0,0 @@
1
- require 'thor'
2
-
3
- module Spontaneous
4
- # class Cli
5
- # module Tasks
6
- # end
7
- # end
8
- end
9
-