northpass 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/.pairs +16 -0
- data/.rspec +2 -0
- data/Gemfile +6 -0
- data/Gemfile.ocra +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +100 -0
- data/Rakefile +36 -0
- data/bin/sk +10 -0
- data/bin/sk_gui +8 -0
- data/circle.yml +8 -0
- data/config/ca-bundle.crt +3894 -0
- data/config/color_scheme.css.erb +91 -0
- data/config/fixtures.yml +255 -0
- data/config/learning.html.erb +43 -0
- data/config/learning_color_scheme.css.erb +70 -0
- data/config/locale.yml +110 -0
- data/config/school_website.html.erb +37 -0
- data/lib/schoolkeep.rb +16 -0
- data/lib/schoolkeep/cli.rb +135 -0
- data/lib/schoolkeep/client.rb +54 -0
- data/lib/schoolkeep/fixture.rb +130 -0
- data/lib/schoolkeep/fixture/stubs.rb +106 -0
- data/lib/schoolkeep/gui_client.rb +99 -0
- data/lib/schoolkeep/scribble.rb +480 -0
- data/lib/schoolkeep/scribble/methods/app.rb +17 -0
- data/lib/schoolkeep/scribble/methods/collection_each.rb +3 -0
- data/lib/schoolkeep/scribble/methods/display_search_form.rb +28 -0
- data/lib/schoolkeep/scribble/methods/filter_parameter_value.rb +11 -0
- data/lib/schoolkeep/scribble/methods/hide_search_box.rb +17 -0
- data/lib/schoolkeep/scribble/methods/l.rb +13 -0
- data/lib/schoolkeep/scribble/methods/limit.rb +11 -0
- data/lib/schoolkeep/scribble/methods/no_filter_selected_class.rb +19 -0
- data/lib/schoolkeep/scribble/methods/pluralize.rb +32 -0
- data/lib/schoolkeep/scribble/methods/query_parameter_value.rb +11 -0
- data/lib/schoolkeep/scribble/methods/script.rb +45 -0
- data/lib/schoolkeep/scribble/methods/t.rb +25 -0
- data/lib/schoolkeep/server.rb +132 -0
- data/lib/schoolkeep/template.rb +67 -0
- data/lib/schoolkeep/template_names.rb +24 -0
- data/lib/schoolkeep/version.rb +3 -0
- data/lib/schoolkeep/views/asset_cache.rb +34 -0
- data/lib/schoolkeep/views/color_scheme.rb +19 -0
- data/lib/schoolkeep/views/layout.rb +72 -0
- data/media/schoolkeep.ico +0 -0
- data/media/sk-144.gif +0 -0
- data/media/sk-16.gif +0 -0
- data/media/sk-57.gif +0 -0
- data/media/sk-72.gif +0 -0
- data/schoolkeep.gemspec +28 -0
- data/spec/cli_spec.rb +70 -0
- data/spec/features/cli_spec.rb +51 -0
- data/spec/features/client_spec.rb +48 -0
- data/spec/fixture_spec.rb +68 -0
- data/spec/methods/filter_parameter_value_spec.rb +28 -0
- data/spec/methods/pluralize_spec.rb +41 -0
- data/spec/methods/query_parameter_value_spec.rb +26 -0
- data/spec/methods/script_spec.rb +52 -0
- data/spec/methods/t_spec.rb +33 -0
- data/spec/server_spec.rb +81 -0
- data/spec/spec_helper.rb +48 -0
- data/spec/views/asset_cache_spec.rb +24 -0
- data/spec/views/color_scheme_spec.rb +15 -0
- metadata +223 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
module Scribble
|
2
|
+
module Methods
|
3
|
+
class DisplaySearchCoursesForm < Method
|
4
|
+
MY_CONTENT_CONTROLLER_IDENTIFIER = "school_website/my_content"
|
5
|
+
SEARCH_CONTROLLER_IDENTIFIER = "school_website/search"
|
6
|
+
|
7
|
+
register :display_search_form
|
8
|
+
|
9
|
+
def display_search_form
|
10
|
+
@receiver.variables[:current_school].search_enabled? && (my_content? || course_results?)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def my_content?
|
16
|
+
!!controller_context[MY_CONTENT_CONTROLLER_IDENTIFIER]
|
17
|
+
end
|
18
|
+
|
19
|
+
def course_results?
|
20
|
+
!!controller_context[SEARCH_CONTROLLER_IDENTIFIER]
|
21
|
+
end
|
22
|
+
|
23
|
+
def controller_context
|
24
|
+
@current_controller ||= @receiver.variables[:params].fetch(:controller, "")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Scribble
|
2
|
+
module Methods
|
3
|
+
class FilterParameterValue < Method
|
4
|
+
register :filter_parameter_value
|
5
|
+
|
6
|
+
def filter_parameter_value
|
7
|
+
CGI::escape_html @receiver.variables[:params].fetch(:filter, {}).fetch(:category_name, nil).to_s
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Scribble
|
2
|
+
module Methods
|
3
|
+
class HideSearchBox < Method
|
4
|
+
register :hide_search_box
|
5
|
+
|
6
|
+
def hide_search_box
|
7
|
+
[params.fetch(:filter, nil), params.fetch(:q, nil)].none?
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def params
|
13
|
+
@receiver.variables[:params]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Scribble
|
2
|
+
module Methods
|
3
|
+
class NoFilterSelectedClass < Method
|
4
|
+
ACTIVE_CSS_CLASS = "uk-text-bold".freeze
|
5
|
+
|
6
|
+
register :no_filter_selected_class
|
7
|
+
|
8
|
+
def no_filter_selected_class
|
9
|
+
ACTIVE_CSS_CLASS unless filter_parameter
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def filter_parameter
|
15
|
+
@receiver.variables[:params].fetch(:filter, nil)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "i18n"
|
2
|
+
begin
|
3
|
+
gem "activesupport", ">= 4.2.0"
|
4
|
+
rescue Gem::LoadError
|
5
|
+
puts "activesupport is not installed, automatic pluralization will not work accurately"
|
6
|
+
|
7
|
+
module FakePluralize
|
8
|
+
def pluralize(locale)
|
9
|
+
self + "s"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
unless defined?(ActiveSupport::Inflector)
|
14
|
+
String.include(FakePluralize)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module Scribble
|
19
|
+
module Methods
|
20
|
+
class Pluralize < Method
|
21
|
+
register :pluralize, Fixnum, String, [String, 1]
|
22
|
+
|
23
|
+
def pluralize(count, singular, plural = nil)
|
24
|
+
if (count == 1 || count =~ /^1(\.0+)?$/)
|
25
|
+
singular
|
26
|
+
else
|
27
|
+
plural || singular.pluralize(I18n.locale)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Scribble
|
2
|
+
module Methods
|
3
|
+
class Script < Method
|
4
|
+
register :script, String
|
5
|
+
|
6
|
+
def script(asset_name)
|
7
|
+
"<script src='#{url(asset_name)}'></script>"
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def url(asset_name)
|
13
|
+
template = custom_templates.find_by!(name: "#{asset_name}.js")
|
14
|
+
|
15
|
+
school.routes.url_helpers.custom_asset_url(
|
16
|
+
school.uuid,
|
17
|
+
"#{asset_name}-#{template.fingerprint}.js",
|
18
|
+
options
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
def school
|
23
|
+
@receiver.variables[:current_school]
|
24
|
+
end
|
25
|
+
|
26
|
+
def custom_templates
|
27
|
+
@receiver.variables[:custom_templates]
|
28
|
+
end
|
29
|
+
|
30
|
+
def asset_host
|
31
|
+
@receiver.variables[:asset_host]
|
32
|
+
end
|
33
|
+
|
34
|
+
def asset_host_port
|
35
|
+
@receiver.variables[:asset_host_port]
|
36
|
+
end
|
37
|
+
|
38
|
+
def options
|
39
|
+
{ port: asset_host_port, protocol: false }.tap do |h|
|
40
|
+
h[:host] = asset_host if asset_host
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "i18n"
|
2
|
+
|
3
|
+
module Scribble
|
4
|
+
module Methods
|
5
|
+
class T < Method
|
6
|
+
register :t, String
|
7
|
+
|
8
|
+
def t key
|
9
|
+
if key[0] == '.'
|
10
|
+
key = "custom_templates.#{ template_name }#{ key }"
|
11
|
+
end
|
12
|
+
|
13
|
+
I18n.translate(key)
|
14
|
+
end
|
15
|
+
|
16
|
+
def template_name
|
17
|
+
name = (
|
18
|
+
@context.variables[:template_name] ||
|
19
|
+
@receiver.variables[:template_name]
|
20
|
+
)
|
21
|
+
name.split(".").first
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require "webrick"
|
2
|
+
require "schoolkeep"
|
3
|
+
require "schoolkeep/template"
|
4
|
+
require "schoolkeep/fixture"
|
5
|
+
require "schoolkeep/views/layout"
|
6
|
+
require "schoolkeep/views/color_scheme"
|
7
|
+
|
8
|
+
module Schoolkeep
|
9
|
+
class Server
|
10
|
+
attr_reader :templates_path, :port, :quiet
|
11
|
+
|
12
|
+
def initialize(dir: ".", port: 4000, quiet: false, asset_host: ASSET_HOST)
|
13
|
+
@templates_path = File.join(dir, "templates")
|
14
|
+
Template.path = templates_path
|
15
|
+
fixture_path = File.join(dir, "config/fixtures.yml")
|
16
|
+
unless File.exist?(fixture_path)
|
17
|
+
fixture_path = File.join(dir,"fixtures.yml")
|
18
|
+
end
|
19
|
+
Fixture.default_path = fixture_path
|
20
|
+
Views::Layout.asset_host = asset_host
|
21
|
+
@port = port
|
22
|
+
@quiet = quiet
|
23
|
+
|
24
|
+
webrick.mount_proc "/color_scheme.css" do |req, res|
|
25
|
+
res["content-type"] = "text/css"
|
26
|
+
res.body = Views::ColorScheme.new("color_scheme").render
|
27
|
+
end
|
28
|
+
|
29
|
+
webrick.mount_proc "/learning_color_scheme.css" do |req, res|
|
30
|
+
res["content-type"] = "text/css"
|
31
|
+
res.body = Views::ColorScheme.new("learning_color_scheme").render
|
32
|
+
end
|
33
|
+
|
34
|
+
webrick.mount_proc "/catalog/" do |req, res|
|
35
|
+
id = req.path.split("/")[2]
|
36
|
+
if id
|
37
|
+
template = Template.new("course_details.html.sktl")
|
38
|
+
|
39
|
+
res["content-type"] = template.type
|
40
|
+
res.body = Views::Layout.new(template).render(variables: { "course" => id.to_sym })
|
41
|
+
else
|
42
|
+
template = Template.new("course_index.html.sktl")
|
43
|
+
|
44
|
+
res["content-type"] = template.type
|
45
|
+
res.body = Views::Layout.new(template).render
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
webrick.mount_proc "/syllabus/" do |req, res|
|
50
|
+
id = req.path.split("/")[2]
|
51
|
+
template = Template.new("course_cover.html.sktl")
|
52
|
+
|
53
|
+
res["content-type"] = template.type
|
54
|
+
res.body = Views::Layout.new(template).render(variables: { "course" => id.to_sym })
|
55
|
+
end
|
56
|
+
|
57
|
+
webrick.mount_proc "/outline/" do |req, res|
|
58
|
+
id = req.path.split("/")[2]
|
59
|
+
|
60
|
+
template = Template.new("course_cover.html.sktl")
|
61
|
+
res["content-type"] = template.type
|
62
|
+
res.body = Views::Layout.new(template).render(variables: {
|
63
|
+
"course" => id.to_sym
|
64
|
+
})
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def start
|
69
|
+
webrick.start
|
70
|
+
end
|
71
|
+
|
72
|
+
def shutdown
|
73
|
+
webrick.shutdown
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def webrick
|
79
|
+
@webrick ||= WEBrick::HTTPServer.new config
|
80
|
+
end
|
81
|
+
|
82
|
+
def config
|
83
|
+
{
|
84
|
+
Port: port,
|
85
|
+
DocumentRoot: templates_path,
|
86
|
+
DocumentRootOptions: {
|
87
|
+
FancyIndexing: true,
|
88
|
+
HandlerTable: { "sktl" => SKTLHandler },
|
89
|
+
NondisclosureName: ["_*"]
|
90
|
+
}
|
91
|
+
}.tap do |c|
|
92
|
+
if quiet
|
93
|
+
c.merge!(
|
94
|
+
:AccessLog => [],
|
95
|
+
:Logger => WEBrick::Log::new(File::NULL, 7)
|
96
|
+
)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class SKTLHandler < WEBrick::HTTPServlet::AbstractServlet
|
102
|
+
def initialize(server, name)
|
103
|
+
super(server, name)
|
104
|
+
@script_filename = name
|
105
|
+
end
|
106
|
+
|
107
|
+
def do_GET(req, res)
|
108
|
+
begin
|
109
|
+
name = File.basename(@script_filename)
|
110
|
+
template = Template.new(name)
|
111
|
+
res["content-type"] = template.type
|
112
|
+
|
113
|
+
if template.type == Template::HTML_MIME
|
114
|
+
res.body = Views::Layout.new(template).render
|
115
|
+
else
|
116
|
+
res.body = template.render
|
117
|
+
end
|
118
|
+
rescue StandardError
|
119
|
+
raise
|
120
|
+
rescue Exception => ex
|
121
|
+
@logger.error(ex)
|
122
|
+
raise HTTPStatus::InternalServerError, ex.message
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
##
|
127
|
+
# Handles POST requests
|
128
|
+
|
129
|
+
alias do_POST do_GET
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "i18n"
|
2
|
+
require "scribble"
|
3
|
+
require "schoolkeep"
|
4
|
+
require "schoolkeep/fixture"
|
5
|
+
|
6
|
+
module Schoolkeep
|
7
|
+
I18n.load_path << File.join(GEM_ROOT, "config/locale.yml")
|
8
|
+
|
9
|
+
class Template
|
10
|
+
CSS_MIME = "text/css"
|
11
|
+
HTML_MIME = "text/html"
|
12
|
+
|
13
|
+
class << self
|
14
|
+
attr_accessor :path
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :name
|
18
|
+
|
19
|
+
def initialize(name)
|
20
|
+
@name = name
|
21
|
+
@partial_loader = PartialLoader.new(self.class.path)
|
22
|
+
end
|
23
|
+
|
24
|
+
def source
|
25
|
+
@source ||= File.read(
|
26
|
+
File.join(self.class.path, name)
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def render(variables: {})
|
31
|
+
template.render(
|
32
|
+
variables: Fixture.for(name, overrides: variables)
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def type
|
37
|
+
@type ||= case name
|
38
|
+
when /\.css\.sktl$/
|
39
|
+
CSS_MIME
|
40
|
+
when /\.html\.sktl$/
|
41
|
+
HTML_MIME
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def template
|
48
|
+
@template ||= ::Scribble::Template.new(
|
49
|
+
source,
|
50
|
+
loader: @partial_loader
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
class PartialLoader
|
55
|
+
attr_reader :path
|
56
|
+
def initialize(path)
|
57
|
+
@path = path
|
58
|
+
end
|
59
|
+
|
60
|
+
def load(name)
|
61
|
+
name = "_#{name}.html.sktl"
|
62
|
+
partial_path = File.join(path, name)
|
63
|
+
::Scribble::Partial.new File.read(partial_path)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|