totem 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c7dd860951dbcc374badc7017f380f07a8aa36d1
4
+ data.tar.gz: 5e81108d1c625256ddefe12d65b312ba7035d33c
5
+ SHA512:
6
+ metadata.gz: 3f0a3b77364746a25eb863f7238401c67a0c850520084bf81a0c4d5eac1f3cbb8020624864c32f982a788f9eb8766fa798347bdd9202ff1ac4d3b3c5e0ed46d3
7
+ data.tar.gz: 2bdba58062c6acea84cb16b5a636a8872d5c67a92ad55b8bc6701b245415044c9f24150e34d46e1bc1aeed096f01eddbf3c16f6f71d867c04a62aeede8347527
data/.gitignore CHANGED
@@ -17,3 +17,5 @@ test/version_tmp
17
17
  tmp
18
18
  *.swp
19
19
  .rvmrc
20
+ .ruby-version
21
+ .ruby-gemset
data/README.md CHANGED
@@ -1,14 +1,18 @@
1
1
  # Totem
2
2
 
3
- Totem is a framework for writing actor model based servers using the Ruby language.
4
- Currently it is in an experimental state, but you are welcome to play with it.
3
+ Totem is a framework for creating Ruby projects.
4
+ It's like having a Rails project folder without the Rails dependency.
5
5
 
6
6
  Features:
7
7
  - Ruby on Rails inspired folder structure.
8
- - Includes Active Record and Active Support.
9
- - Generators for database migrations.
8
+ - Lightweight and simple code.
10
9
  - Integrated console.
10
+ - Uses built in Ruby classes and avoids depending on 3rd party gems.
11
11
  - Designed for MRI and JRuby.
12
+ - Easily extensible through gems or directly in your project.
13
+ - ActiveRecord (coming soon).
14
+ - Tribe (coming soon).
15
+ - Designed for multi-threaded applications.
12
16
 
13
17
  ## Installation
14
18
 
data/Rakefile CHANGED
@@ -1,13 +1,10 @@
1
1
  require 'bundler/gem_tasks'
2
2
 
3
- desc 'Start an IRB console with Workers loaded'
3
+ desc 'Start a Totem interactive console'
4
4
  task :console do
5
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
6
6
 
7
7
  require 'totem'
8
- require 'irb'
9
8
 
10
- ARGV.clear
11
-
12
- IRB.start
9
+ Totem::Shell.new([:console]).run
13
10
  end
data/bin/totem ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'totem'
4
+
5
+ Totem::Shell.new(ARGV).run
data/lib/totem.rb CHANGED
@@ -1,13 +1,10 @@
1
- require 'tribe'
2
- require 'tribe_em'
1
+ require 'logger'
3
2
 
4
3
  require 'totem/version'
5
- require 'totem/tasks/console'
6
- require 'totem/tasks/database'
7
- require 'totem/tasks/generator'
8
- require 'totem/actable'
9
- require 'totem/connection'
10
- require 'totem/tcp_server'
4
+ require 'totem/shell'
5
+ require 'totem/shell_cmds/base'
6
+ require 'totem/shell_cmds/console'
7
+ require 'totem/shell_cmds/new'
11
8
 
12
9
  module Totem
13
10
  def self.initialize(root)
@@ -15,10 +12,8 @@ module Totem
15
12
 
16
13
  @setup = true
17
14
  @root = root
18
-
19
15
  Bundler.require(Totem.env.to_sym)
20
- Time.zone = 'UTC'
21
- db_connect
16
+ $LOAD_PATH.unshift(root + '/app')
22
17
  load_app
23
18
 
24
19
  return true
@@ -29,79 +24,19 @@ module Totem
29
24
  end
30
25
 
31
26
  def self.env
32
- return (@env ||= (ENV['GAME_SRV_ENV'] || 'development'))
33
- end
34
-
35
- def self.settings
36
- return @settings if @settings
37
-
38
- begin
39
- @settings = Fiona::Settings.new do |s|
40
- eval(File.read(File.join(root, 'config', 'settings.rb')))
41
- end
42
- rescue Exception => e
43
- puts "Failed to initialize settings: #{e.message}\n#{e.backtrace.join("\n")}"
44
- end
45
-
46
- return @settings
47
- end
48
-
49
- def self.db_config
50
- return (@db_config ||= YAML.load_file(File.join(root, 'config', 'database.yml'))[env])
51
- end
52
-
53
- def self.db_connect
54
- return false if db_connected?
55
-
56
- begin
57
- ActiveRecord::Base.establish_connection(Totem.db_config)
58
- rescue Exception => e
59
- puts "Failed to establish DB connection: #{e.message}\n#{e.backtrace.join("\n")}"
60
- return false
61
- end
62
-
63
- return true
64
- end
65
-
66
- def self.db_disconnect
67
- return false unless db_connected?
68
-
69
- ActiveRecord::Base.connection_pool.disconnect!
70
-
71
- return true
72
- end
73
-
74
- def self.db_reconnect
75
- db_disconnect
76
- db_connect
77
-
78
- return true
79
- end
80
-
81
- def self.db_connected?
82
- return !!ActiveRecord::Base.connected?
27
+ return (@env ||= (ENV['TOTEM_ENV'] || 'development'))
83
28
  end
84
29
 
85
30
  def self.load_app
86
- Dir.chdir("#{Totem.root}/app")
87
- load("loader.rb")
88
- Dir.chdir(Totem.root)
31
+ require "#{Totem.root}/app/loader.rb"
89
32
  end
90
33
 
91
34
  def self.component
92
- return @component || 'default'
93
- end
94
-
95
- def self.component=(val)
96
- return @component = val
35
+ return @component ||= ENV['TOTEM_COMPONENT']
97
36
  end
98
37
 
99
38
  def self.instance
100
- return @instance || 0
101
- end
102
-
103
- def self.instance=(val)
104
- return @instance = val
39
+ return @instance || ENV['TOTEM_INSTANCE']
105
40
  end
106
41
 
107
42
  def self.logger=(val)
@@ -111,14 +46,7 @@ module Totem
111
46
  def self.logger
112
47
  return @logger if @logger
113
48
 
114
- case env
115
- when 'development'
116
- log_to_stdout
117
- when 'production'
118
- log_to_file
119
- else
120
- log_to_stdout
121
- end
49
+ log_to_file
122
50
 
123
51
  return @logger
124
52
  end
@@ -129,15 +57,25 @@ module Totem
129
57
  return nil
130
58
  end
131
59
 
60
+ def self.log_file_path
61
+ name = env
62
+ name << "_#{component}" if component && component.length > 0
63
+ name << "_#{instance}" if instance && instance.length > 0
64
+ name << '.log'
65
+
66
+ return File.join(root, 'log', name)
67
+ end
68
+
132
69
  def self.log_to_file
133
- init_logger(File.join(root, 'log', "#{env}_#{component}_#{instance}.log"))
70
+ init_logger(log_file_path)
134
71
 
135
72
  return nil
136
73
  end
137
74
 
138
75
  def self.init_logger(output)
139
- @logger = Logger.new(output)
76
+ raise 'Logger is already initialized' if @logger
140
77
 
78
+ @logger = Logger.new(output)
141
79
  @logger.formatter = proc do |severity, datetime, progname, msg|
142
80
  "#{datetime} :: #{msg}\n"
143
81
  end
@@ -0,0 +1,36 @@
1
+ module Totem
2
+ class Shell
3
+ @cmds = {}
4
+
5
+ def self.register_cmd(cmd, klass)
6
+ @cmds[cmd.to_sym] = klass
7
+
8
+ return nil
9
+ end
10
+
11
+ def initialize(args)
12
+ @args = args
13
+ end
14
+
15
+ def run
16
+ if @args[0].nil?
17
+ puts "Usage:\n totem <command>"
18
+ puts
19
+ puts "Commands:\n #{self.class.cmds.keys.join(', ')}"
20
+ return
21
+ end
22
+
23
+ cmd_to_class(@args[0]).new(@args[1..-1]).run
24
+ end
25
+
26
+ private
27
+
28
+ def self.cmds
29
+ return @cmds
30
+ end
31
+
32
+ def cmd_to_class(cmd)
33
+ return self.class.cmds[cmd.to_sym] || raise("Unknown cmd: #{cmd}")
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,13 @@
1
+ module Totem
2
+ module ShellCmds
3
+ class Base
4
+ def initialize(args)
5
+ @args = args
6
+ end
7
+
8
+ def run
9
+ raise 'You must implement this method in a subclass.'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ require 'irb'
2
+
3
+ module Totem
4
+ module ShellCmds
5
+ class Console < Totem::ShellCmds::Base
6
+ def run
7
+ ARGV.clear
8
+ IRB.start
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ Totem::Shell.register_cmd(:console, Totem::ShellCmds::Console)
@@ -0,0 +1,52 @@
1
+ require 'erb'
2
+
3
+ module Totem
4
+ module ShellCmds
5
+ class New < Totem::ShellCmds::Base
6
+ def run
7
+ if @args[0].nil?
8
+ puts "You must provide a name for the new project."
9
+ return
10
+ end
11
+
12
+ root_path = @args[0]
13
+
14
+ puts 'Creating project root directory...'
15
+ Dir.mkdir(root_path)
16
+ puts
17
+
18
+ puts 'Creating sub-directories...'
19
+ %w(app config log tmp).each do |dir|
20
+ puts " #{dir}..."
21
+ Dir.mkdir(root_path + '/' + dir)
22
+ end
23
+ puts
24
+
25
+ template_path = File.expand_path(File.dirname(__FILE__) + '/../../../templates')
26
+
27
+ puts 'Creating Gemfile...'
28
+ input = File.read(template_path + '/Gemfile.erb')
29
+ output = ERB.new(input).result(binding)
30
+ File.open(root_path + '/Gemfile', 'w') { |f| f.write(output) }
31
+ puts
32
+
33
+ puts 'Creating config/environment.rb...'
34
+ input = File.read(template_path + '/config/environment.rb.erb')
35
+ output = ERB.new(input).result(binding)
36
+ File.open(root_path + '/config/environment.rb', 'w') { |f| f.write(output) }
37
+ puts
38
+
39
+ puts 'Creating app/loader.rb...'
40
+ input = File.read(template_path + '/app/loader.rb.erb')
41
+ output = ERB.new(input).result(binding)
42
+ File.open(root_path + '/app/loader.rb', 'w') { |f| f.write(output) }
43
+ puts
44
+
45
+ puts 'Finished! You must now run "bundle update" inside your project directory.'
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+
52
+ Totem::Shell.register_cmd(:new, Totem::ShellCmds::New)
data/lib/totem/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Totem
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.3'
3
3
  end
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'totem', :git => 'https://github.com/chadrem/totem.git'
@@ -0,0 +1,2 @@
1
+ # Manually require your application classes here.
2
+ # Example: require 'my_class'
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.setup
5
+ Bundler.require(:default)
6
+
7
+ Totem.initialize(File.expand_path(File.dirname(__FILE__) + '/../'))
data/totem.gemspec CHANGED
@@ -8,15 +8,12 @@ Gem::Specification.new do |gem|
8
8
  gem.version = Totem::VERSION
9
9
  gem.authors = ['Chad Remesch']
10
10
  gem.email = ['chad@remesch.com']
11
- gem.description = %q{The Totem framework.}
12
- gem.summary = %q{An actor model based framework for rapid server server side development.}
11
+ gem.description = %q{Totem is a framework for creating Ruby projects.}
12
+ gem.summary = %q{It's like having a Rails project folder without the Rails dependency.}
13
13
  gem.homepage = 'https://github.com/chadrem/totem'
14
14
 
15
15
  gem.files = `git ls-files`.split($/)
16
16
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
-
20
- gem.add_dependency('tribe', '0.0.8')
21
- gem.add_dependency('tribe_em', '0.0.2')
22
19
  end
metadata CHANGED
@@ -1,91 +1,60 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: totem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Chad Remesch
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-30 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: tribe
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - '='
20
- - !ruby/object:Gem::Version
21
- version: 0.0.8
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - '='
28
- - !ruby/object:Gem::Version
29
- version: 0.0.8
30
- - !ruby/object:Gem::Dependency
31
- name: tribe_em
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - '='
36
- - !ruby/object:Gem::Version
37
- version: 0.0.2
38
- type: :runtime
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - '='
44
- - !ruby/object:Gem::Version
45
- version: 0.0.2
46
- description: The Totem framework.
11
+ date: 2014-03-12 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Totem is a framework for creating Ruby projects.
47
14
  email:
48
15
  - chad@remesch.com
49
- executables: []
16
+ executables:
17
+ - totem
50
18
  extensions: []
51
19
  extra_rdoc_files: []
52
20
  files:
53
- - .gitignore
21
+ - ".gitignore"
54
22
  - Gemfile
55
23
  - LICENSE.txt
56
24
  - README.md
57
25
  - Rakefile
26
+ - bin/totem
58
27
  - lib/totem.rb
59
- - lib/totem/actable.rb
60
- - lib/totem/connection.rb
61
- - lib/totem/tasks/console.rb
62
- - lib/totem/tasks/database.rb
63
- - lib/totem/tasks/generator.rb
64
- - lib/totem/tcp_server.rb
28
+ - lib/totem/shell.rb
29
+ - lib/totem/shell_cmds/base.rb
30
+ - lib/totem/shell_cmds/console.rb
31
+ - lib/totem/shell_cmds/new.rb
65
32
  - lib/totem/version.rb
33
+ - templates/Gemfile.erb
34
+ - templates/app/loader.rb.erb
35
+ - templates/config/environment.rb.erb
66
36
  - totem.gemspec
67
37
  homepage: https://github.com/chadrem/totem
68
38
  licenses: []
39
+ metadata: {}
69
40
  post_install_message:
70
41
  rdoc_options: []
71
42
  require_paths:
72
43
  - lib
73
44
  required_ruby_version: !ruby/object:Gem::Requirement
74
- none: false
75
45
  requirements:
76
- - - ! '>='
46
+ - - ">="
77
47
  - !ruby/object:Gem::Version
78
48
  version: '0'
79
49
  required_rubygems_version: !ruby/object:Gem::Requirement
80
- none: false
81
50
  requirements:
82
- - - ! '>='
51
+ - - ">="
83
52
  - !ruby/object:Gem::Version
84
53
  version: '0'
85
54
  requirements: []
86
55
  rubyforge_project:
87
- rubygems_version: 1.8.24
56
+ rubygems_version: 2.2.2
88
57
  signing_key:
89
- specification_version: 3
90
- summary: An actor model based framework for rapid server server side development.
58
+ specification_version: 4
59
+ summary: It's like having a Rails project folder without the Rails dependency.
91
60
  test_files: []
data/lib/totem/actable.rb DELETED
@@ -1,9 +0,0 @@
1
- module Totem
2
- module Actable
3
- def process_event(event)
4
- ActiveRecord::Base.connection_pool.with_connection do
5
- super
6
- end
7
- end
8
- end
9
- end
@@ -1,13 +0,0 @@
1
- module Totem
2
- class Connection < Tribe::EM::Connection
3
- include Totem::Actable
4
-
5
- private
6
-
7
- def initialize(options = {})
8
- options[:logger] = Totem.logger
9
-
10
- super
11
- end
12
- end
13
- end
@@ -1,10 +0,0 @@
1
- module Totem
2
- module Tasks
3
- class Console
4
- def start
5
- ARGV.clear
6
- IRB.start
7
- end
8
- end
9
- end
10
- end
@@ -1,68 +0,0 @@
1
- module Totem
2
- module Tasks
3
- class Database
4
- def initialize
5
- @config = Totem.db_config.clone
6
- end
7
-
8
- def create
9
- options = { :charset => 'utf8', :collation => 'utf8_unicode_ci' }
10
-
11
- create_db = lambda do |config|
12
- ActiveRecord::Base.establish_connection(config.merge('database' => nil))
13
- ActiveRecord::Base.connection.create_database(config['database'], options)
14
- ActiveRecord::Base.establish_connection(config)
15
- end
16
-
17
- begin
18
- create_db.call(@config)
19
- rescue Mysql::Error => sqlerr
20
- if sqlerr.errno == 1405
21
- print "#{sqlerr.error}. \nPlease provide the root password for your mysql installation\n>"
22
- root_password = $stdin.gets.strip
23
-
24
- grant_statement = <<-SQL
25
- GRANT ALL PRIVILEGES ON #{config['database']}.*
26
- TO '#{config['username']}'@'localhost'
27
- IDENTIFIED BY '#{config['password']}' WITH GRANT OPTION;
28
- SQL
29
-
30
- create_db.call(@config.merge('database' => nil, 'username' => 'root', 'password' => root_password))
31
- else
32
- $stderr.puts sqlerr.error
33
- $stderr.puts "Couldn't create database for #{config.inspect}, charset: utf8, collation: utf8_unicode_ci"
34
- $stderr.puts "(if you set the charset manually, make sure you have a matching collation)" if config['charset']
35
- end
36
- end
37
-
38
- Totem.db_reconnect
39
-
40
- return true
41
- end
42
-
43
- def drop
44
- ActiveRecord::Base.connection.drop_database(@config['database'])
45
-
46
- return true
47
- end
48
-
49
- def migrate
50
- ActiveRecord::Migration.verbose = true
51
- ActiveRecord::Migrator.migrate('db/migrate', ENV['VERSION'] ? ENV['VERSION'].to_i : nil)
52
-
53
- Totem.db_reconnect
54
-
55
- return true
56
- end
57
-
58
- def rollback
59
- step = ENV['STEP'] ? ENV['STEP'].to_i : 1
60
- ActiveRecord::Migrator.rollback('db/migrate', step)
61
-
62
- Totem.db_reconnect
63
-
64
- return true
65
- end
66
- end
67
- end
68
- end
@@ -1,29 +0,0 @@
1
- module Totem
2
- module Tasks
3
- class Generator
4
- def migration(name)
5
- tstamp = Time.now.utc.strftime("%Y%m%d%H%M%S")
6
- fname = "#{tstamp}_#{name}.rb"
7
- path = File.join(Totem.root, 'db', 'migrate', fname)
8
-
9
- name || raise('You must specify a name')
10
-
11
- puts "Creating migration: #{path}"
12
-
13
- if File.exists?(path)
14
- puts 'ERROR: File already exists.'
15
- return
16
- end
17
-
18
- content = <<-EOS.unindent
19
- class #{name.camelize} < ActiveRecord::Migration
20
- end
21
- EOS
22
-
23
- File.open(path, 'w') { |f| f.write(content) }
24
-
25
- return nil
26
- end
27
- end
28
- end
29
- end
@@ -1,13 +0,0 @@
1
- module Totem
2
- class TcpServer < Tribe::EM::TcpServer
3
- include Totem::Actable
4
-
5
- private
6
-
7
- def initialize(ip, port, conn_class, options = {})
8
- options[:logger] = Totem.logger
9
-
10
- super
11
- end
12
- end
13
- end