grass 0.0.1
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 +7 -0
- data/.gitignore +17 -0
- data/.sass-cache/e3d4c2039fc7a8446e752aad5ac08f85d7457f92/(__TEMPLATE__)c +0 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +10 -0
- data/bin/grass +89 -0
- data/config/grass.rb +27 -0
- data/db/migrate/1_create_grass_sources.rb +24 -0
- data/grass.gemspec +43 -0
- data/lib/grass.rb +68 -0
- data/lib/grass/cache.rb +52 -0
- data/lib/grass/core_ext/kernel.rb +8 -0
- data/lib/grass/endpoints/api.rb +70 -0
- data/lib/grass/endpoints/front.rb +122 -0
- data/lib/grass/file_sync.rb +70 -0
- data/lib/grass/goliath/rack/auth_barrier.rb +109 -0
- data/lib/grass/goliath/rack/cache.rb +37 -0
- data/lib/grass/goliath/rack/cors.rb +45 -0
- data/lib/grass/goliath/rack/secure_headers.rb +20 -0
- data/lib/grass/goliath/rack/validator.rb +52 -0
- data/lib/grass/helpers/i18n_helper.rb +91 -0
- data/lib/grass/helpers/render_helper.rb +35 -0
- data/lib/grass/key.rb +137 -0
- data/lib/grass/render.rb +27 -0
- data/lib/grass/render/layout.rb +11 -0
- data/lib/grass/render/page.rb +31 -0
- data/lib/grass/render/renderer.rb +35 -0
- data/lib/grass/render/script.rb +27 -0
- data/lib/grass/render/stylesheet.rb +13 -0
- data/lib/grass/render/text.rb +11 -0
- data/lib/grass/render/view.rb +34 -0
- data/lib/grass/render/yui_renderer.rb +27 -0
- data/lib/grass/source.rb +107 -0
- data/lib/grass/tasks/db.rake +67 -0
- data/lib/grass/version.rb +3 -0
- data/lib/templates/app/Gemfile +9 -0
- data/lib/templates/app/Procfile +3 -0
- data/lib/templates/app/Rakefile +7 -0
- data/lib/templates/app/app/assets/scripts/application.en.js.coffee +1 -0
- data/lib/templates/app/app/assets/stylesheets/application.en.css.scss +4 -0
- data/lib/templates/app/app/content/pages/about.en.html.erb +3 -0
- data/lib/templates/app/app/content/pages/index.en.md.erb +5 -0
- data/lib/templates/app/app/views/layouts/application.en.html.erb +14 -0
- data/lib/templates/app/app/views/pages/show.en.html.erb +4 -0
- data/lib/templates/app/app/views/shared.en.html.erb +9 -0
- data/lib/templates/app/config/cache.yml +20 -0
- data/lib/templates/app/config/database.yml +35 -0
- data/lib/templates/app/config/grass.rb +27 -0
- data/lib/templates/app/db/migrate/1_create_grass_sources.rb +24 -0
- data/lib/templates/app/haproxy.cfg +43 -0
- data/lib/templates/app/public/favicon.ico +0 -0
- data/lib/templates/app/public/robots.txt +2 -0
- data/lib/templates/app/server.rb +7 -0
- data/test/dummy/app/content/texts/testapi.en.txt +1 -0
- data/test/dummy/config/cache.yml +23 -0
- data/test/dummy/config/database.yml +35 -0
- data/test/dummy/config/dummy.rb +1 -0
- data/test/dummy/config/haproxy.cfg +37 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/robots.txt +2 -0
- data/test/minitest_helper.rb +38 -0
- data/test/support/grass.rb +21 -0
- data/test/support/test.jpg +0 -0
- data/test/test_api.rb +74 -0
- data/test/test_front.rb +52 -0
- data/test/test_key.rb +118 -0
- data/test/test_source.rb +51 -0
- data/test/test_source_file.rb +47 -0
- data/test/test_source_render.rb +54 -0
- data/vendor/yuicompressor-2.4.8.jar +0 -0
- metadata +399 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
require "yui/compressor"
|
2
|
+
require 'grass/render/renderer'
|
3
|
+
module Grass
|
4
|
+
module Render
|
5
|
+
module YuiRenderer
|
6
|
+
|
7
|
+
include Renderer
|
8
|
+
|
9
|
+
YUI_JAR_FILE = "#{Grass.gem_root}/vendor/yuicompressor-2.4.8.jar"
|
10
|
+
CSS = YUI::CssCompressor.new({jar_file: YUI_JAR_FILE})
|
11
|
+
JS = YUI::JavaScriptCompressor.new({jar_file: YUI_JAR_FILE, munge: true})
|
12
|
+
|
13
|
+
def render
|
14
|
+
compress(super)
|
15
|
+
end
|
16
|
+
|
17
|
+
def compress source
|
18
|
+
compressor.compress(source)
|
19
|
+
end
|
20
|
+
|
21
|
+
def compressor
|
22
|
+
raise NotImplementedError
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/grass/source.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'grass/key'
|
3
|
+
require 'grass/file_sync'
|
4
|
+
require 'grass/render'
|
5
|
+
require 'grass/cache'
|
6
|
+
require 'mime/types'
|
7
|
+
|
8
|
+
module Grass
|
9
|
+
|
10
|
+
|
11
|
+
##
|
12
|
+
# Source is smallest data object
|
13
|
+
|
14
|
+
class Source < ActiveRecord::Base
|
15
|
+
|
16
|
+
MIMES = {
|
17
|
+
'text' => 'text/plain',
|
18
|
+
'view' => 'text/html',
|
19
|
+
'layout' => 'text/html',
|
20
|
+
'page' => 'text/html',
|
21
|
+
'script' => 'application/javascript',
|
22
|
+
'stylesheet' => 'text/css'
|
23
|
+
}
|
24
|
+
|
25
|
+
cattr_accessor :fallback
|
26
|
+
|
27
|
+
self.fallback = true
|
28
|
+
self.primary_key = :keyid
|
29
|
+
self.table_name = :grass_sources
|
30
|
+
|
31
|
+
attr_accessor :key
|
32
|
+
|
33
|
+
after_initialize :convert_key
|
34
|
+
|
35
|
+
def self.[](*keys)
|
36
|
+
keys.flatten.map{|key|
|
37
|
+
|
38
|
+
key = Key.new(id: key.dup)
|
39
|
+
|
40
|
+
file = self.find_by(locale: key.locale, dir: key.dir, path: key.path)
|
41
|
+
if file.nil? && self.fallback
|
42
|
+
file = self.find_by(locale: I18n.default_locale, dir: key.dir, path: key.path)
|
43
|
+
end
|
44
|
+
file
|
45
|
+
|
46
|
+
}.compact
|
47
|
+
end
|
48
|
+
|
49
|
+
scope :locale, -> (locale) { unscoped.where(locale: locale.to_s) }
|
50
|
+
default_scope -> { where(hidden: false) }
|
51
|
+
|
52
|
+
include FileSync
|
53
|
+
include Render
|
54
|
+
include Cache
|
55
|
+
|
56
|
+
attr_reader :data
|
57
|
+
|
58
|
+
serialize :pairs, Array
|
59
|
+
|
60
|
+
after_initialize :set_mime_type
|
61
|
+
before_save :set_mime_type
|
62
|
+
|
63
|
+
def read
|
64
|
+
self.binary || self.result || self.raw
|
65
|
+
end
|
66
|
+
|
67
|
+
def write value
|
68
|
+
# self.file.write(value)
|
69
|
+
self.update(raw: value)
|
70
|
+
end
|
71
|
+
|
72
|
+
def type
|
73
|
+
@type ||= self.key.dir.split("/").last.singularize
|
74
|
+
end
|
75
|
+
|
76
|
+
def hide!
|
77
|
+
self.update!(hidden: true)
|
78
|
+
end
|
79
|
+
|
80
|
+
def show!
|
81
|
+
self.update!(hidden: false)
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def set_mime_type
|
87
|
+
self.mime_type ||= MIMES[self.type] || MIME::Types.type_for(self.binary.nil? ? self.format : self.filepath).first.to_s
|
88
|
+
end
|
89
|
+
|
90
|
+
def convert_key
|
91
|
+
if self.key.nil?
|
92
|
+
self.key = self.filepath ? Key.new(filepath: self.filepath) : Key.new(id: self.keyid)
|
93
|
+
elsif self.key.is_a? String
|
94
|
+
self.key = Key.new(id: self.key)
|
95
|
+
end
|
96
|
+
|
97
|
+
Key::ATTR_TYPES.each do |attr|
|
98
|
+
unless attr == :id
|
99
|
+
write_attribute(attr,self.key.public_send(attr))
|
100
|
+
end
|
101
|
+
end
|
102
|
+
self.keyid = self.key.id
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'pg'
|
2
|
+
require 'erb'
|
3
|
+
require 'active_record'
|
4
|
+
require 'yaml'
|
5
|
+
require 'active_support/core_ext/hash'
|
6
|
+
|
7
|
+
namespace :db do
|
8
|
+
|
9
|
+
desc "erases and rewinds all dbs"
|
10
|
+
task :rewind do
|
11
|
+
%w(development test).each do |env|
|
12
|
+
ENV['RACK_ENV']=env
|
13
|
+
Rake::Task["db:drop"].reenable
|
14
|
+
Rake::Task["db:create"].reenable
|
15
|
+
Rake::Task["db:migrate"].reenable
|
16
|
+
Rake::Task["db:drop"].invoke
|
17
|
+
Rake::Task["db:create"].invoke
|
18
|
+
Rake::Task["db:migrate"].invoke
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "loads database configuration in for other tasks to run"
|
23
|
+
task :load_config do
|
24
|
+
|
25
|
+
# ActiveRecord::Base.configurations = db_conf
|
26
|
+
|
27
|
+
# drop and create need to be performed with a connection to the 'postgres' (system) database
|
28
|
+
ActiveRecord::Base.establish_connection db_conf.merge('database' => 'postgres',
|
29
|
+
'schema_search_path' => 'public')
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "creates and migrates your database"
|
33
|
+
task :setup => :load_config do
|
34
|
+
Rake::Task["db:create"].invoke
|
35
|
+
Rake::Task["db:migrate"].invoke
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "migrate your database"
|
39
|
+
task :migrate do
|
40
|
+
ActiveRecord::Base.establish_connection db_conf
|
41
|
+
|
42
|
+
ActiveRecord::Migrator.migrate(
|
43
|
+
ActiveRecord::Migrator.migrations_paths,
|
44
|
+
ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
desc 'Drops the database'
|
49
|
+
task :drop => :load_config do
|
50
|
+
ActiveRecord::Base.connection.drop_database db_conf['database']
|
51
|
+
end
|
52
|
+
|
53
|
+
desc 'Creates the database'
|
54
|
+
task :create => :load_config do
|
55
|
+
ActiveRecord::Base.connection.create_database db_conf['database']
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def db_conf
|
60
|
+
config = YAML.load(ERB.new(File.read("config/database.yml")).result)[env]
|
61
|
+
end
|
62
|
+
|
63
|
+
def env
|
64
|
+
ENV['RACK_ENV'] ||= "development"
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
console.log "hello from Grass!"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Grass</title>
|
5
|
+
<link rel="stylesheet" href="/stylesheets/application.css" type="text/css" media="screen" title="no title" charset="utf-8">
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
|
9
|
+
<!-- START/layouts/application.erb.html -->
|
10
|
+
<%= yield %>
|
11
|
+
<!-- END/layouts/application.erb.html -->
|
12
|
+
|
13
|
+
<script type="text/javascript" charset="utf-8" src="/scripts/application.js"></script>
|
14
|
+
</body>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
development:
|
2
|
+
compress: true
|
3
|
+
threadsafe: true
|
4
|
+
namespace: grass:$app_development
|
5
|
+
servers: localhost:11211
|
6
|
+
async: true
|
7
|
+
test:
|
8
|
+
compress: true
|
9
|
+
threadsafe: true
|
10
|
+
namespace: grass:$app_test
|
11
|
+
servers: localhost:11211
|
12
|
+
async: true
|
13
|
+
production:
|
14
|
+
compress: true
|
15
|
+
threadsafe: true
|
16
|
+
namespace: grass:$app
|
17
|
+
servers: <%= ENV['MEMCACHIER_SERVERS'] %>
|
18
|
+
password: <%= ENV['MEMCACHIER_PASSWORD'] %>
|
19
|
+
username: <%= ENV['MEMCACHIER_USERNAME'] %>
|
20
|
+
async: true
|
@@ -0,0 +1,35 @@
|
|
1
|
+
development:
|
2
|
+
adapter: postgresql
|
3
|
+
encoding: unicode
|
4
|
+
database: $app_development
|
5
|
+
username: $username
|
6
|
+
password:
|
7
|
+
host: localhost
|
8
|
+
port: 5432
|
9
|
+
# pool: 5
|
10
|
+
# connections: 20
|
11
|
+
|
12
|
+
test:
|
13
|
+
adapter: postgresql
|
14
|
+
encoding: unicode
|
15
|
+
database: $app_test
|
16
|
+
username: $username
|
17
|
+
password:
|
18
|
+
host: localhost
|
19
|
+
port: 5432
|
20
|
+
# pool: 5
|
21
|
+
# connections: 20
|
22
|
+
|
23
|
+
production:
|
24
|
+
<% if db = URI.parse(ENV['DATABASE_URL']) rescue nil %>
|
25
|
+
adapter: <%= db.scheme == "postgres" ? "postgresql" : db.scheme %>
|
26
|
+
encoding: unicode
|
27
|
+
database: <%= db.path[1..-1] %>
|
28
|
+
username: <%= db.user %>
|
29
|
+
password: <%= db.password %>
|
30
|
+
host: <%= db.host %>
|
31
|
+
port: <%= db.port %>
|
32
|
+
pool: <%= ENV['DB_POOL'] || 5 %>
|
33
|
+
connections: <%= ENV['DB_CONNECTIONS'] || 20 %>
|
34
|
+
reaping_frequency: <%= ENV['DB_REAP_FREQ'] || 10 %>
|
35
|
+
<% end %>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
require 'grass'
|
3
|
+
require 'ip_country'
|
4
|
+
require 'active_record'
|
5
|
+
|
6
|
+
Time.zone = ENV['TIME_ZONE'] || "London"
|
7
|
+
I18n.load_path << Dir.glob("#{Grass.root}/config/locales/**/*.yml")
|
8
|
+
I18n.enforce_available_locales = false
|
9
|
+
I18n.backend.class.send(:include, I18n::Backend::Fallbacks)
|
10
|
+
I18n.default_locale = ENV['DEFAULT_LOCALE'] ? ENV['DEFAULT_LOCALE'].to_sym : :en
|
11
|
+
I18n.available_locales = ENV['AVAILABLE_LOCALES'] ? ENV['AVAILABLE_LOCALES'].split(",").map(&:to_sym) : [:en]
|
12
|
+
|
13
|
+
ActiveRecord::Base.establish_connection Grass.load_config('database')
|
14
|
+
|
15
|
+
if respond_to?(:config)
|
16
|
+
|
17
|
+
# config['enable_cache_for_development'] = true
|
18
|
+
|
19
|
+
ENV['GEOIP_FILE'] ||= "#{Grass.root}/db/geo_ip.dat"
|
20
|
+
if ::File.exists?(ENV['GEOIP_FILE'])
|
21
|
+
IPCountry.init ENV['GEOIP_FILE']
|
22
|
+
config['ip_country'] = IPCountry
|
23
|
+
end
|
24
|
+
|
25
|
+
config['dalli'] = Grass.cache
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class CreateGrassSources < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :grass_sources, id: false do |t|
|
4
|
+
t.column :keyid, :string, null: false, index: true, primary: true
|
5
|
+
t.column :dir, :string
|
6
|
+
t.column :path, :string
|
7
|
+
t.column :locale, :string
|
8
|
+
t.column :format, :string
|
9
|
+
t.column :handler, :string
|
10
|
+
t.column :filepath, :string
|
11
|
+
|
12
|
+
t.column :raw, :text
|
13
|
+
t.column :result, :text
|
14
|
+
t.column :binary, :oid, limit: 2147483648 #:binary
|
15
|
+
|
16
|
+
t.column :pairs, :string, default: []
|
17
|
+
t.column :hidden, :boolean, default: false
|
18
|
+
t.column :mime_type, :string
|
19
|
+
|
20
|
+
t.timestamps
|
21
|
+
end
|
22
|
+
add_index :grass_sources, [:locale,:dir,:path], unique: true
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
global
|
2
|
+
pidfile /var/run/haproxy.pid
|
3
|
+
log 127.0.0.1 local0 info
|
4
|
+
user root
|
5
|
+
|
6
|
+
defaults
|
7
|
+
mode http
|
8
|
+
|
9
|
+
clitimeout 600000 # maximum inactivity time on the client side
|
10
|
+
srvtimeout 600000 # maximum inactivity time on the server side
|
11
|
+
timeout connect 8000 # maximum time to wait for a connection attempt to a server to succeed
|
12
|
+
|
13
|
+
stats enable
|
14
|
+
stats auth admin:password
|
15
|
+
stats uri /monitor
|
16
|
+
stats refresh 5s
|
17
|
+
retries 5
|
18
|
+
option httpchk GET /status
|
19
|
+
option redispatch
|
20
|
+
option httpclose
|
21
|
+
option abortonclose
|
22
|
+
option forwardfor
|
23
|
+
|
24
|
+
balance roundrobin # each server is used in turns, according to assigned weight
|
25
|
+
|
26
|
+
frontend http
|
27
|
+
bind :5000
|
28
|
+
monitor-uri /haproxy # end point to monitor HAProxy status (returns 200)
|
29
|
+
|
30
|
+
acl acl_api hdr_beg(host) -i api
|
31
|
+
use_backend backend_api if acl_api
|
32
|
+
|
33
|
+
acl acl_front path_reg ^/?
|
34
|
+
use_backend backend_front if acl_front
|
35
|
+
|
36
|
+
default_backend backend_front
|
37
|
+
|
38
|
+
backend backend_front
|
39
|
+
server srv_index 127.0.0.1:4000
|
40
|
+
|
41
|
+
backend backend_api
|
42
|
+
server srv_donors 127.0.0.1:4001
|
43
|
+
|
Binary file
|