spontaneous 0.2.0.alpha4 → 0.2.0.alpha5

Sign up to get free protection for your applications and to get access to all the features.
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
-