northpass 0.0.2

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.
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: []