minirails 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/README.md +53 -12
- data/lib/minirails.rb +105 -36
- data/lib/minirails/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cb8f20cc209da625d6cf79ab1332e44f38451a3
|
4
|
+
data.tar.gz: cc5c4ca139366812a8f6db09a6fcc63f1092e192
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 555a831b642c9459d4bdd7536cc1149d86762fbb6b2f8cba23716bd43021ac19370a0c4a9b568c2cf712ead864231a6bfe5fdeb2c02bb7ee171ae624aeeada42
|
7
|
+
data.tar.gz: b5d49462ea1025d0a5c910180e6db6eea8483bd682f6a1b77bcb6d5513f274cde6c0c26a7ddec7f4aea8016c542bf60341dd9e1a8d3d2f4eee8b3aae968c261d
|
data/README.md
CHANGED
@@ -23,7 +23,7 @@ Create a file `myapp.rb` with the following content
|
|
23
23
|
```ruby
|
24
24
|
# myapp.rb
|
25
25
|
define do |app|
|
26
|
-
class
|
26
|
+
class MainController < ActionController::Base
|
27
27
|
def index
|
28
28
|
render text: "Hello"
|
29
29
|
end
|
@@ -79,18 +79,14 @@ define "source" do |app|
|
|
79
79
|
ENV["DATABASE_URL"] = "postgresql://localhost/minirails_test"
|
80
80
|
|
81
81
|
# Migrations
|
82
|
-
class
|
82
|
+
class Migrations < ActiveRecord::Migration
|
83
83
|
def change
|
84
84
|
create_table :users do |t|
|
85
85
|
t.string :name
|
86
86
|
t.string :email
|
87
87
|
end
|
88
|
-
end
|
89
|
-
end
|
90
88
|
|
91
|
-
|
92
|
-
class CreateSomeUsersToStartWith < ActiveRecord::Migration
|
93
|
-
def change
|
89
|
+
# Seeds
|
94
90
|
User.create! [
|
95
91
|
{name: "Jon", email: "jon@example.com"},
|
96
92
|
{name: "Hodor", email: "hodor@example.com"}
|
@@ -117,16 +113,61 @@ define "source" do |app|
|
|
117
113
|
end
|
118
114
|
```
|
119
115
|
|
120
|
-
## FAQ
|
121
116
|
|
122
|
-
-
|
117
|
+
### Non-rails apps
|
123
118
|
|
124
|
-
|
119
|
+
You can start any rack compatible web app inside define block
|
120
|
+
or even generic worker process (sidekiq, clock, whatever)
|
121
|
+
by specifying `:type` option.
|
122
|
+
|
123
|
+
```ruby
|
124
|
+
# file: types.rb
|
125
|
+
# usage: $ minirails types.rb
|
126
|
+
|
127
|
+
# this is rails app
|
128
|
+
define "rails" do |app|
|
129
|
+
app.routes.draw do
|
130
|
+
get "/", to: proc {|*| [200, {}, "Hello from Rails".lines] }
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# with type: :rack you need to return Rack-compatible app
|
135
|
+
define "rack", type: :rack do
|
136
|
+
proc {|*| [200, {}, "Hello from Rack".lines] }
|
137
|
+
end
|
138
|
+
|
139
|
+
# with type: :blank you can run anything
|
140
|
+
define "worker", type: :blank do
|
141
|
+
loop do
|
142
|
+
$stderr.puts "Hello from worker"
|
143
|
+
sleep 1
|
144
|
+
end
|
145
|
+
end
|
146
|
+
```
|
125
147
|
|
148
|
+
### Running worker with Rails env loaded
|
149
|
+
```ruby
|
150
|
+
define "my-rails-app" do |app|
|
151
|
+
app.routes.draw do
|
152
|
+
get "/", to: proc {|*| [200, {}, "Hello from Rails".lines] }
|
153
|
+
end
|
154
|
+
end
|
126
155
|
|
127
|
-
|
156
|
+
# you can use :initialize option to load rails (or some rack)
|
157
|
+
# before loading worker code (similar to `rake environment`)
|
158
|
+
define "worker", type: :blank, initialize: "my-rails-app" do
|
159
|
+
loop do
|
160
|
+
Rails.logger.debug "Hello from worker with Rails env"
|
161
|
+
sleep 1
|
162
|
+
end
|
163
|
+
end
|
164
|
+
```
|
165
|
+
|
166
|
+
## FAQ
|
128
167
|
|
129
|
-
|
168
|
+
- **How to speed up loading?**
|
169
|
+
|
170
|
+
Run `$ minirails --fast` and then use `bin/minirails myapp.rb` instead
|
130
171
|
|
131
172
|
|
132
173
|
## Contributing
|
data/lib/minirails.rb
CHANGED
@@ -53,46 +53,38 @@ OPTIONS:
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def start(specfile, num = nil)
|
56
|
-
builder = Builder.new(specfile)
|
56
|
+
self.builder = Builder.new(specfile)
|
57
57
|
num ? builder.start(num.to_i) : builder.spawn
|
58
58
|
end
|
59
|
+
|
60
|
+
attr_accessor :builder
|
59
61
|
end
|
60
62
|
|
61
63
|
|
62
64
|
class Builder < Struct.new(:specfile)
|
65
|
+
|
63
66
|
# DSL API
|
64
|
-
def define(name = nil, &block)
|
65
|
-
|
67
|
+
def define(name = nil, opts = {}, &block)
|
68
|
+
type = opts[:type] || :rails
|
69
|
+
klazz = {
|
70
|
+
rails: RailsApp,
|
71
|
+
rack: RackApp,
|
72
|
+
blank: App
|
73
|
+
}[type]
|
74
|
+
|
75
|
+
if opts[:initialize]
|
76
|
+
parent = apps.find {|a| a.name == opts[:initialize] }
|
77
|
+
apps << WrappedApp.new(klazz.new(name, block), parent)
|
78
|
+
else
|
79
|
+
apps << klazz.new(name, block)
|
80
|
+
end
|
66
81
|
end
|
67
82
|
|
68
83
|
# internals
|
69
84
|
def start(num)
|
70
85
|
boot
|
71
|
-
|
72
|
-
|
73
|
-
require "action_controller"
|
74
|
-
require "rails"
|
75
|
-
$stderr.puts "--> loading app"
|
76
|
-
|
77
|
-
Rack::Handler::WEBrick.run(endpoint(num), :Port => ENV["PORT"])
|
78
|
-
end
|
79
|
-
|
80
|
-
def endpoint(num)
|
81
|
-
apps[num].endpoint
|
82
|
-
rescue NameError => e
|
83
|
-
# autoloading has some crazy weird error
|
84
|
-
# and we can't just require activerecord upfront
|
85
|
-
# because if app is not using it there will
|
86
|
-
# be no database configuration
|
87
|
-
case e.message
|
88
|
-
when /uninitialized constant.*ActiveRecord/
|
89
|
-
$stderr.puts "--> loading activerecord"
|
90
|
-
require "active_record/railtie"
|
91
|
-
else
|
92
|
-
raise e
|
93
|
-
end
|
94
|
-
|
95
|
-
endpoint(num)
|
86
|
+
apps[num].init
|
87
|
+
apps[num].call
|
96
88
|
end
|
97
89
|
|
98
90
|
def spawn
|
@@ -119,11 +111,62 @@ OPTIONS:
|
|
119
111
|
end
|
120
112
|
|
121
113
|
def boot
|
122
|
-
|
114
|
+
load specfile
|
123
115
|
end
|
124
116
|
end
|
125
117
|
|
126
118
|
class App < Struct.new(:name, :block)
|
119
|
+
def init
|
120
|
+
end
|
121
|
+
|
122
|
+
def call
|
123
|
+
block.call
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
class WrappedApp < Struct.new(:app, :parent)
|
128
|
+
def name
|
129
|
+
app.name
|
130
|
+
end
|
131
|
+
|
132
|
+
def init
|
133
|
+
parent.init
|
134
|
+
app.init
|
135
|
+
end
|
136
|
+
|
137
|
+
def call
|
138
|
+
app.call
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
class RackApp < App
|
143
|
+
def init
|
144
|
+
require "rack"
|
145
|
+
@endpoint = block.call
|
146
|
+
end
|
147
|
+
|
148
|
+
def call
|
149
|
+
Rack::Handler::WEBrick.run(@endpoint, :Port => ENV["PORT"])
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
class RailsApp < RackApp
|
154
|
+
def init
|
155
|
+
$stderr.puts "--> loading rails"
|
156
|
+
require "action_controller"
|
157
|
+
require "rails"
|
158
|
+
$stderr.puts "--> loading app"
|
159
|
+
|
160
|
+
@endpoint = endpoint
|
161
|
+
end
|
162
|
+
|
163
|
+
def call
|
164
|
+
migrate
|
165
|
+
super
|
166
|
+
end
|
167
|
+
|
168
|
+
protected
|
169
|
+
|
127
170
|
def build
|
128
171
|
# basic rails app bootstrap
|
129
172
|
app = Class.new(Rails::Application) do
|
@@ -143,23 +186,49 @@ OPTIONS:
|
|
143
186
|
# execute 'define' block
|
144
187
|
block.call(app)
|
145
188
|
|
189
|
+
# and finally return app object
|
190
|
+
app
|
191
|
+
end
|
192
|
+
|
193
|
+
def migrate
|
146
194
|
# ActiveRecord post functions
|
147
|
-
if
|
195
|
+
if @endpoint.config.respond_to?(:active_record)
|
148
196
|
# load rake tasks
|
149
|
-
|
197
|
+
@endpoint.load_tasks
|
150
198
|
|
151
199
|
# create and migrate database
|
152
200
|
Rake::Task["db:drop"].invoke
|
153
201
|
Rake::Task["db:create"].invoke
|
154
|
-
|
202
|
+
# run migrations in order they were defined in source file
|
203
|
+
ActiveRecord::Migration.descendants.sort_by {|c|
|
204
|
+
c.instance_methods(false).map {|m|
|
205
|
+
c.instance_method(m).source_location.last
|
206
|
+
}.min
|
207
|
+
}.each {|e| e.migrate :up }
|
155
208
|
end
|
156
|
-
|
157
|
-
# and finally return app object
|
158
|
-
app
|
159
209
|
end
|
160
210
|
|
161
211
|
def endpoint
|
162
|
-
|
212
|
+
build
|
213
|
+
rescue NameError => e
|
214
|
+
# autoloading has some crazy weird error
|
215
|
+
# and we can't just require activerecord upfront
|
216
|
+
# because if app is not using it there will
|
217
|
+
# be no database configuration
|
218
|
+
case e.message
|
219
|
+
when /uninitialized constant.*ActiveRecord/
|
220
|
+
$stderr.puts "--> loading activerecord"
|
221
|
+
require "active_record/railtie"
|
222
|
+
else
|
223
|
+
raise e
|
224
|
+
end
|
225
|
+
|
226
|
+
endpoint
|
163
227
|
end
|
164
228
|
end
|
165
229
|
end
|
230
|
+
|
231
|
+
# Public DSL API
|
232
|
+
def define(*args, &block)
|
233
|
+
Minirails.builder.define(*args, &block)
|
234
|
+
end
|
data/lib/minirails/version.rb
CHANGED