northpass 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.pairs +16 -0
  4. data/.rspec +2 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.ocra +7 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +100 -0
  9. data/Rakefile +36 -0
  10. data/bin/sk +10 -0
  11. data/bin/sk_gui +8 -0
  12. data/circle.yml +8 -0
  13. data/config/ca-bundle.crt +3894 -0
  14. data/config/color_scheme.css.erb +91 -0
  15. data/config/fixtures.yml +255 -0
  16. data/config/learning.html.erb +43 -0
  17. data/config/learning_color_scheme.css.erb +70 -0
  18. data/config/locale.yml +110 -0
  19. data/config/school_website.html.erb +37 -0
  20. data/lib/schoolkeep.rb +16 -0
  21. data/lib/schoolkeep/cli.rb +135 -0
  22. data/lib/schoolkeep/client.rb +54 -0
  23. data/lib/schoolkeep/fixture.rb +130 -0
  24. data/lib/schoolkeep/fixture/stubs.rb +106 -0
  25. data/lib/schoolkeep/gui_client.rb +99 -0
  26. data/lib/schoolkeep/scribble.rb +480 -0
  27. data/lib/schoolkeep/scribble/methods/app.rb +17 -0
  28. data/lib/schoolkeep/scribble/methods/collection_each.rb +3 -0
  29. data/lib/schoolkeep/scribble/methods/display_search_form.rb +28 -0
  30. data/lib/schoolkeep/scribble/methods/filter_parameter_value.rb +11 -0
  31. data/lib/schoolkeep/scribble/methods/hide_search_box.rb +17 -0
  32. data/lib/schoolkeep/scribble/methods/l.rb +13 -0
  33. data/lib/schoolkeep/scribble/methods/limit.rb +11 -0
  34. data/lib/schoolkeep/scribble/methods/no_filter_selected_class.rb +19 -0
  35. data/lib/schoolkeep/scribble/methods/pluralize.rb +32 -0
  36. data/lib/schoolkeep/scribble/methods/query_parameter_value.rb +11 -0
  37. data/lib/schoolkeep/scribble/methods/script.rb +45 -0
  38. data/lib/schoolkeep/scribble/methods/t.rb +25 -0
  39. data/lib/schoolkeep/server.rb +132 -0
  40. data/lib/schoolkeep/template.rb +67 -0
  41. data/lib/schoolkeep/template_names.rb +24 -0
  42. data/lib/schoolkeep/version.rb +3 -0
  43. data/lib/schoolkeep/views/asset_cache.rb +34 -0
  44. data/lib/schoolkeep/views/color_scheme.rb +19 -0
  45. data/lib/schoolkeep/views/layout.rb +72 -0
  46. data/media/schoolkeep.ico +0 -0
  47. data/media/sk-144.gif +0 -0
  48. data/media/sk-16.gif +0 -0
  49. data/media/sk-57.gif +0 -0
  50. data/media/sk-72.gif +0 -0
  51. data/schoolkeep.gemspec +28 -0
  52. data/spec/cli_spec.rb +70 -0
  53. data/spec/features/cli_spec.rb +51 -0
  54. data/spec/features/client_spec.rb +48 -0
  55. data/spec/fixture_spec.rb +68 -0
  56. data/spec/methods/filter_parameter_value_spec.rb +28 -0
  57. data/spec/methods/pluralize_spec.rb +41 -0
  58. data/spec/methods/query_parameter_value_spec.rb +26 -0
  59. data/spec/methods/script_spec.rb +52 -0
  60. data/spec/methods/t_spec.rb +33 -0
  61. data/spec/server_spec.rb +81 -0
  62. data/spec/spec_helper.rb +48 -0
  63. data/spec/views/asset_cache_spec.rb +24 -0
  64. data/spec/views/color_scheme_spec.rb +15 -0
  65. metadata +223 -0
@@ -0,0 +1,41 @@
1
+ require "scribble"
2
+ require "schoolkeep/scribble/methods/pluralize"
3
+ require "active_support/core_ext/string/inflections"
4
+
5
+ module Scribble::Methods
6
+ RSpec.describe Pluralize do
7
+ describe "#pluralize" do
8
+ after do
9
+ I18n.locale = I18n.default_locale
10
+ ActiveSupport::Inflector.inflections(:es) do |inflect|
11
+ inflect.clear
12
+ end
13
+ end
14
+
15
+ it "uses locale to pluralize string if none specified" do
16
+ ActiveSupport::Inflector.inflections(:es) do |inflect|
17
+ inflect.clear
18
+
19
+ inflect.plural(/$/, 's')
20
+ inflect.plural(/([^aeéiou])$/i, '\1es')
21
+ end
22
+
23
+ I18n.locale = :es
24
+
25
+ expect(render("{{pluralize(0, 'ley')}}")).to eq "leyes"
26
+ expect(render("{{pluralize(1, 'ley')}}")).to eq "ley"
27
+ expect(render("{{pluralize(2, 'ley')}}")).to eq "leyes"
28
+ end
29
+
30
+ it "uses specified attribute to pluralize string" do
31
+ expect(render("{{pluralize(0, 'one', 'many')}}")).to eq "many"
32
+ expect(render("{{pluralize(1, 'one', 'many')}}")).to eq "one"
33
+ expect(render("{{pluralize(2, 'one', 'many')}}")).to eq "many"
34
+ end
35
+ end
36
+
37
+ def render(source)
38
+ Scribble::Template.new(source).render
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,26 @@
1
+ require "scribble"
2
+ require "schoolkeep/scribble/methods/query_parameter_value"
3
+
4
+ module Scribble::Methods
5
+ RSpec.describe QueryParameterValue do
6
+ describe "#query_parameter_value" do
7
+ it "escapes HTML" do
8
+ rendered = render("<input value='{{ query_parameter_value }}>'", "test_template")
9
+
10
+ expect(rendered).to eq \
11
+ "<input value='&#39;&gt;&lt;script&gt;alert(&#39;HAXXX&#39;)&lt;/script&gt;>'"
12
+ end
13
+ end
14
+
15
+ def render(source, template_name, locale = :en)
16
+ Scribble::Template.new(source).render(
17
+ variables: {
18
+ template_name: template_name,
19
+ params: {
20
+ q: "'><script>alert('HAXXX')</script>"
21
+ }
22
+ }
23
+ )
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,52 @@
1
+ require "scribble"
2
+ require "schoolkeep/scribble/methods/script"
3
+
4
+ module Scribble::Methods
5
+ RSpec.describe Script do
6
+ describe "#script" do
7
+ it "renders a script tag for the fingerprinted asset" do
8
+ rendered = render("{{ script('hello') }}", "test_template")
9
+
10
+ expect(rendered).to eq "<script src='/custom_assets/abc123/hello-zxy987.js'></script>"
11
+ end
12
+
13
+ context "when there is an asset host" do
14
+ it "renders the host" do
15
+ rendered = render(
16
+ "{{ script('hello') }}",
17
+ "test_template",
18
+ asset_host: "foo.com"
19
+ )
20
+
21
+ expect(rendered).to eq \
22
+ "<script src='foo.com/custom_assets/abc123/hello-zxy987.js'></script>"
23
+ end
24
+ end
25
+ end
26
+
27
+ def render(source, template_name, locale: :en, asset_host: nil)
28
+ url_helpers = double(:url_helpers)
29
+ routes = double(:routes, url_helpers: url_helpers)
30
+ school = double(:school, uuid: "abc123", routes: routes)
31
+ template = double(:template, fingerprint: "zxy987")
32
+ custom_templates = double(:custom_templates, find_by!: template)
33
+ allow(url_helpers).to receive(:custom_asset_url) do |school_uuid, asset|
34
+ [
35
+ asset_host,
36
+ "custom_assets",
37
+ school_uuid,
38
+ asset
39
+ ].join("/")
40
+ end
41
+
42
+ Scribble::Template.new(source).render(
43
+ variables: {
44
+ asset_host: asset_host,
45
+ custom_templates: custom_templates,
46
+ current_school: school,
47
+ template_name: template_name
48
+ }
49
+ )
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,33 @@
1
+ require "scribble"
2
+ require "schoolkeep/scribble/methods/t"
3
+
4
+ module Scribble::Methods
5
+ RSpec.describe T do
6
+ describe "#t" do
7
+ it "delegates to I18n and allows for short keys" do
8
+ foo_rendered = render("{{t('.foo')}}", "test_template")
9
+ bar_rendered = render("{{t('bar')}}", "test_template")
10
+
11
+ expect(foo_rendered).to eq "bar"
12
+ expect(bar_rendered).to eq "baz"
13
+ end
14
+
15
+ context "when the template name has a locale suffix" do
16
+ it "renders the correct translation" do
17
+ foo_rendered = render("{{t('.foo')}}", "test_template.es", :es)
18
+ bar_rendered = render("{{t('bar')}}", "test_template.es", :es)
19
+
20
+ expect(foo_rendered).to eq "el_bar"
21
+ expect(bar_rendered).to eq "el_baz"
22
+ end
23
+ end
24
+ end
25
+
26
+ def render(source, template_name, locale = :en)
27
+ I18n.locale = locale
28
+ Scribble::Template.new(source).render(
29
+ variables: {template_name: template_name}
30
+ )
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,81 @@
1
+ require "schoolkeep/server"
2
+ require "faraday"
3
+
4
+ module Schoolkeep
5
+ RSpec.describe Server do
6
+ describe "#server" do
7
+ it "serves the templates locally" do
8
+ I18n.locale = :en
9
+ Dir.mktmpdir do |dir|
10
+ Dir.mkdir "#{dir}/templates"
11
+ File.write "#{dir}/templates/_head.html.sktl", "<!-- HTML_HEAD -->"
12
+ File.write "#{dir}/templates/_header.html.sktl", "HEADER {{t('.courses')}}"
13
+ File.write "#{dir}/templates/_footer.html.sktl", "FOOTER {{t('.connect')}}"
14
+ File.write "#{dir}/templates/custom_page.html.sktl", "BODY {{custom_page.page_title}}"
15
+ Dir.mkdir "#{dir}/config"
16
+ File.write "#{dir}/config/fixtures.yml", fixtures.to_yaml
17
+
18
+ port = find_available_port
19
+
20
+ @server_thread = Thread.new do
21
+ Server.new(dir: dir, port: port, quiet: true).start
22
+ end
23
+
24
+ Timeout.timeout(60) { @server_thread.join(0.1) until responsive?(port) }
25
+
26
+ response = Faraday.get("http://localhost:#{port}/custom_page.html.sktl")
27
+
28
+ expect(response.body).to include "HTML_HEAD"
29
+ expect(response.body).to include "HEADER"
30
+ expect(response.body).to include "school_website-custom_pages school_website-custom_pages-show"
31
+ expect(response.body).to include I18n.t("custom_templates._header.courses")
32
+ expect(response.body).to include "BODY"
33
+ expect(response.body).to include page_title
34
+ expect(response.body).to include "FOOTER"
35
+ expect(response.body).to include I18n.t("custom_templates._footer.connect")
36
+ end
37
+ end
38
+
39
+ after do
40
+ @server_thread.exit
41
+ end
42
+
43
+ def responsive?(port)
44
+ return false if @server_thread && @server_thread.join(0)
45
+
46
+ res = Faraday.get("http://localhost:#{port}/")
47
+
48
+ if res.success?
49
+ return res.body.include?("custom_page.html.sktl")
50
+ end
51
+ rescue Faraday::ConnectionFailed
52
+ return false
53
+ end
54
+
55
+ def port
56
+ @port ||= find_available_port
57
+ end
58
+
59
+ def fixtures
60
+ {
61
+ "templates" => {
62
+ "custom_page.html.sktl" => {
63
+ custom_page: { page_title: page_title}
64
+ }
65
+ }
66
+ }
67
+ end
68
+
69
+ def page_title
70
+ @page_title ||= "This is an awesome title"
71
+ end
72
+
73
+ def find_available_port
74
+ server = TCPServer.new('127.0.0.1', 0)
75
+ server.addr[1]
76
+ ensure
77
+ server.close if server
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,48 @@
1
+ require 'delegate'
2
+
3
+ module Support
4
+ GEM_ROOT = File.expand_path("../../", __FILE__)
5
+ class WarningFilter < DelegateClass(IO)
6
+ def write(line)
7
+ super if line.start_with?(GEM_ROOT)
8
+ end
9
+ end
10
+ end
11
+
12
+ $stderr = Support::WarningFilter.new($stderr)
13
+
14
+ require "pry"
15
+ require "i18n"
16
+
17
+ RSpec.configure do |config|
18
+ config.filter_run_excluding schoolkeep_client: true
19
+
20
+ config.expect_with :rspec do |expectations|
21
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
22
+ end
23
+
24
+ config.mock_with :rspec do |mocks|
25
+ mocks.verify_partial_doubles = true
26
+ end
27
+
28
+ config.filter_run :focus
29
+ config.run_all_when_everything_filtered = true
30
+
31
+ config.disable_monkey_patching!
32
+
33
+ config.warnings = true
34
+
35
+ if config.files_to_run.one?
36
+ config.default_formatter = 'doc'
37
+ end
38
+
39
+ config.profile_examples = 10
40
+
41
+ config.order = :random
42
+
43
+ Kernel.srand config.seed
44
+ end
45
+
46
+ I18n.available_locales = [:en, :es]
47
+ I18n.backend.store_translations(:en, {bar: "baz", custom_templates: { test_template: { foo: "bar" }}})
48
+ I18n.backend.store_translations(:es, {bar: "el_baz", custom_templates: { test_template: { foo: "el_bar" }}})
@@ -0,0 +1,24 @@
1
+ require "schoolkeep/views/asset_cache"
2
+
3
+ module Schoolkeep
4
+ module Views
5
+ RSpec.describe AssetCache do
6
+ it "retreives full asset urls and only calls get once" do
7
+ asset_cache = AssetCache.new("https://app.northpass.com")
8
+ allow(asset_cache).to receive(:get) { "https://app.northpass.com/assets/sk-favicon.ico" }
9
+
10
+ asset_url = asset_cache["/assets/sk-favicon.ico"]
11
+
12
+ expect(asset_url).to eq("https://app.northpass.com/assets/sk-favicon.ico")
13
+ expect(asset_cache["/assets/sk-favicon.ico"]).to eq asset_url
14
+ expect(asset_cache).to have_received(:get).once
15
+ end
16
+
17
+ it "returns the asset path of an asset that is not found" do
18
+ asset_cache = AssetCache.new("https://app.northpass.com")
19
+ asset_url = asset_cache["/assets/not-found-image-test.png"]
20
+ expect(asset_url).to eq "/assets/not-found-image-test.png"
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ require "schoolkeep/views/color_scheme"
2
+
3
+ module Schoolkeep
4
+ module Views
5
+ RSpec.describe ColorScheme do
6
+ describe "#render" do
7
+ it "renders color scheme properly" do
8
+ color_scheme = Fixture.for("styles.css.sktl")[:color_palette]
9
+ color_scheme_css = ColorScheme.new("color_scheme").render
10
+ expect(color_scheme_css).to include color_scheme.button_color
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
metadata ADDED
@@ -0,0 +1,223 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: northpass
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Ong
8
+ - SchoolKeep Developers
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2018-03-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: thor
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 0.19.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 0.19.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: faraday
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '0.9'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '0.9'
42
+ - !ruby/object:Gem::Dependency
43
+ name: scribble
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: i18n
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: bundler
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '1.7'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '1.7'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rake
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '10.0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '10.0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rspec
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: 3.1.0
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 3.1.0
112
+ - !ruby/object:Gem::Dependency
113
+ name: activesupport
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description:
127
+ email:
128
+ - ryan@northpass.com
129
+ - dev@northpass.com
130
+ executables:
131
+ - sk
132
+ - sk_gui
133
+ extensions: []
134
+ extra_rdoc_files: []
135
+ files:
136
+ - ".gitignore"
137
+ - ".pairs"
138
+ - ".rspec"
139
+ - Gemfile
140
+ - Gemfile.ocra
141
+ - LICENSE.txt
142
+ - README.md
143
+ - Rakefile
144
+ - bin/sk
145
+ - bin/sk_gui
146
+ - circle.yml
147
+ - config/ca-bundle.crt
148
+ - config/color_scheme.css.erb
149
+ - config/fixtures.yml
150
+ - config/learning.html.erb
151
+ - config/learning_color_scheme.css.erb
152
+ - config/locale.yml
153
+ - config/school_website.html.erb
154
+ - lib/schoolkeep.rb
155
+ - lib/schoolkeep/cli.rb
156
+ - lib/schoolkeep/client.rb
157
+ - lib/schoolkeep/fixture.rb
158
+ - lib/schoolkeep/fixture/stubs.rb
159
+ - lib/schoolkeep/gui_client.rb
160
+ - lib/schoolkeep/scribble.rb
161
+ - lib/schoolkeep/scribble/methods/app.rb
162
+ - lib/schoolkeep/scribble/methods/collection_each.rb
163
+ - lib/schoolkeep/scribble/methods/display_search_form.rb
164
+ - lib/schoolkeep/scribble/methods/filter_parameter_value.rb
165
+ - lib/schoolkeep/scribble/methods/hide_search_box.rb
166
+ - lib/schoolkeep/scribble/methods/l.rb
167
+ - lib/schoolkeep/scribble/methods/limit.rb
168
+ - lib/schoolkeep/scribble/methods/no_filter_selected_class.rb
169
+ - lib/schoolkeep/scribble/methods/pluralize.rb
170
+ - lib/schoolkeep/scribble/methods/query_parameter_value.rb
171
+ - lib/schoolkeep/scribble/methods/script.rb
172
+ - lib/schoolkeep/scribble/methods/t.rb
173
+ - lib/schoolkeep/server.rb
174
+ - lib/schoolkeep/template.rb
175
+ - lib/schoolkeep/template_names.rb
176
+ - lib/schoolkeep/version.rb
177
+ - lib/schoolkeep/views/asset_cache.rb
178
+ - lib/schoolkeep/views/color_scheme.rb
179
+ - lib/schoolkeep/views/layout.rb
180
+ - media/schoolkeep.ico
181
+ - media/sk-144.gif
182
+ - media/sk-16.gif
183
+ - media/sk-57.gif
184
+ - media/sk-72.gif
185
+ - schoolkeep.gemspec
186
+ - spec/cli_spec.rb
187
+ - spec/features/cli_spec.rb
188
+ - spec/features/client_spec.rb
189
+ - spec/fixture_spec.rb
190
+ - spec/methods/filter_parameter_value_spec.rb
191
+ - spec/methods/pluralize_spec.rb
192
+ - spec/methods/query_parameter_value_spec.rb
193
+ - spec/methods/script_spec.rb
194
+ - spec/methods/t_spec.rb
195
+ - spec/server_spec.rb
196
+ - spec/spec_helper.rb
197
+ - spec/views/asset_cache_spec.rb
198
+ - spec/views/color_scheme_spec.rb
199
+ homepage: https://github.com/SchoolKeep/schoolkeep-ruby
200
+ licenses:
201
+ - MIT
202
+ metadata: {}
203
+ post_install_message:
204
+ rdoc_options: []
205
+ require_paths:
206
+ - lib
207
+ required_ruby_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
212
+ required_rubygems_version: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ requirements: []
218
+ rubyforge_project:
219
+ rubygems_version: 2.6.11
220
+ signing_key:
221
+ specification_version: 4
222
+ summary: A cli to develop custom templates for and upload to SchoolKeep.
223
+ test_files: []