webface_rails 0.1.6

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 (45) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +37 -0
  4. data/Rakefile +7 -0
  5. data/app/controllers/webface_error_report_controller.rb +12 -0
  6. data/app/helpers/webface_component_helper.rb +248 -0
  7. data/app/helpers/webface_form.rb +161 -0
  8. data/app/views/webface_component_templates/_button.html.haml +2 -0
  9. data/app/views/webface_component_templates/_dialog_window.html.haml +6 -0
  10. data/app/views/webface_component_templates/_modal_window.html.haml +5 -0
  11. data/app/views/webface_component_templates/_simple_notification.html.haml +4 -0
  12. data/app/views/webface_components/_button.html.haml +11 -0
  13. data/app/views/webface_components/_checkbox.html.haml +21 -0
  14. data/app/views/webface_components/_editable_select.html.haml +8 -0
  15. data/app/views/webface_components/_field_hints.html.haml +7 -0
  16. data/app/views/webface_components/_hidden_form_field.html.haml +1 -0
  17. data/app/views/webface_components/_hint.html.haml +9 -0
  18. data/app/views/webface_components/_hint_trigger.html.haml +15 -0
  19. data/app/views/webface_components/_numeric_form_field.html.haml +13 -0
  20. data/app/views/webface_components/_password_form_field.html.haml +12 -0
  21. data/app/views/webface_components/_post_button_link.html.haml +4 -0
  22. data/app/views/webface_components/_radio.html.haml +18 -0
  23. data/app/views/webface_components/_select.html.haml +34 -0
  24. data/app/views/webface_components/_text_form_field.html.haml +12 -0
  25. data/app/views/webface_components/_text_form_field_with_validation.html.haml +6 -0
  26. data/app/views/webface_components/_textarea_form_field.html.haml +11 -0
  27. data/app/views/webface_components/shared/_editable_select_base.html.haml +34 -0
  28. data/lib/generators/templates/application.js +53 -0
  29. data/lib/generators/templates/mocha.css +10 -0
  30. data/lib/generators/templates/mocha.pug +15 -0
  31. data/lib/generators/templates/my_component.test.js +15 -0
  32. data/lib/generators/templates/run_webface_test +11 -0
  33. data/lib/generators/templates/test_animator.js +66 -0
  34. data/lib/generators/templates/test_utils.js +6 -0
  35. data/lib/generators/templates/webface.test.js +2 -0
  36. data/lib/generators/templates/webface_init.js +10 -0
  37. data/lib/generators/templates/webface_test_server.js +68 -0
  38. data/lib/generators/webface_generator.rb +81 -0
  39. data/lib/tasks/webface_rails_tasks.rake +3 -0
  40. data/lib/webface_rails.rb +11 -0
  41. data/lib/webface_rails/version.rb +3 -0
  42. data/spec/helpers/webface_component_helper_spec.rb +133 -0
  43. data/spec/helpers/webface_form_spec.rb +58 -0
  44. data/spec/spec_helper.rb +15 -0
  45. metadata +147 -0
@@ -0,0 +1,6 @@
1
+ export async function fetch_dom(path) {
2
+ var response = await fetch('http://localhost:8080/' + path);
3
+ var body;
4
+ await response.text().then((t) => body = t);
5
+ return new DOMParser().parseFromString(body, "text/html").documentElement.querySelector("body");
6
+ }
@@ -0,0 +1,2 @@
1
+ // Here you import the *.test.js files, path is relative to the current dir
2
+ import "./components/my_component.test.js";
@@ -0,0 +1,10 @@
1
+ import { Logmaster } from './webface_source/logmaster.js'
2
+ import { TestAnimator } from './test_animator.js' // required to make some unit tests dependent on animation pass
3
+
4
+ window.webface = {
5
+ "component_classes" : {},
6
+ "logger" : new Logmaster({test_env: true}),
7
+ "substitute_classes": { "Animator": TestAnimator }
8
+ };
9
+
10
+ window.webface.logmaster_print_spy = chai.spy.on(window.webface.logger, "_print");
@@ -0,0 +1,68 @@
1
+ const express = require('express')
2
+ var bodyParser = require('body-parser');
3
+ const fs = require('fs');
4
+ const app = express();
5
+ app.use(bodyParser.urlencoded({ extended: true }));
6
+ app.use(bodyParser.json());
7
+ app.set('view engine', 'pug')
8
+
9
+ // This is the main page where all tests are loaded and mocha is plugged in
10
+ app.get("/", function (req, res) {
11
+ var file = req.query.file;
12
+ if(file == "" || file == null)
13
+ file = "webface.test.js";
14
+ else if(file.startsWith("test"))
15
+ file = file.replace("test", "");
16
+
17
+ fs.readFile(`mocha.html`, 'utf8', function(err, contents) {
18
+ res.render(__dirname + "/mocha.pug", { file: file });
19
+ });
20
+ })
21
+
22
+ // These ones are needed in case you need to test an ajax_request
23
+ app.post("/ajax_test", function (req, res, next) {
24
+ res.type("application/json");
25
+ res.end(JSON.stringify(req.body));
26
+ });
27
+ app.get("/ajax_test", function (req, res, next) {
28
+ res.type("application/json");
29
+ res.end(JSON.stringify(req.query));
30
+ });
31
+
32
+
33
+ // This one is in charge of loading additional files required for the tests, such as: js, css, html, images.
34
+ app.get(/.+/, function (req, res) {
35
+ var fn = req.path.substring(1);
36
+ if(fn.endsWith("/")) fn = fn.slice(0, -1);
37
+
38
+ var fn_splitted = fn.split("/");
39
+ var fn_last_part = fn_splitted[fn_splitted.length - 1]
40
+
41
+
42
+ if(/^[^.]+$/.test(fn_last_part))
43
+ fn = fn + "/index.html";
44
+
45
+ fn = __dirname + "/" + fn;
46
+
47
+ if(fs.existsSync(fn)) {
48
+ fs.readFile(fn, 'utf8', function(err, contents) {
49
+ if(fn.endsWith(".js"))
50
+ res.type("application/javascript");
51
+ else if(fn.endsWith(".svg")) {
52
+ res.type("image/svg+xml");
53
+ }
54
+ else if(fn.endsWith(".css"))
55
+ res.type("text/css");
56
+ else
57
+ res.type("text/html");
58
+ res.end(contents);
59
+ });
60
+ }
61
+ else {
62
+ res.status(404).send("Not found");
63
+ }
64
+
65
+
66
+ })
67
+
68
+ app.listen(8080, () => console.log('Test server for Webface.js running on port 8080.'))
@@ -0,0 +1,81 @@
1
+ class WebfaceGenerator < Rails::Generators::Base
2
+
3
+ source_root File.expand_path('templates', __dir__)
4
+ class_option :root_path, type: :string
5
+
6
+ def add_webface
7
+ @root_path = options["root_path"].present? ? options["root_path"] : Rails.root
8
+
9
+ # We'll later change this to fetching webface.js as a node_module, but not now.
10
+ gitmodules = File.readlines("#{@root_path}/.gitmodules") if File.file?("#{@root_path}/.gitmodules")
11
+
12
+ if gitmodules.nil? || !gitmodules.join("\n").include?("webface.js.git")
13
+ `rm -rf #{@root_path}/.git/modules/app/assets/javascripts/webface.js`
14
+ `cd #{@root_path}/app/assets/javascripts/ && git submodule add git@gitlab.com:hodl/webface.js.git`
15
+ gitmodules = File.readlines("#{@root_path}/.gitmodules") if File.file?("#{@root_path}/.gitmodules")
16
+ end
17
+
18
+ gitmodules.each do |line|
19
+ if line.include?("webface") && line.include?("path =")
20
+ @webface_path = line.strip.sub(/\Apath = /, "")
21
+ end
22
+ end
23
+ puts "Webface path is #{@webface_path}"
24
+ end
25
+
26
+ def create_webface_unit_test_dir
27
+ `mkdir -p #{@root_path}/spec/webface/`
28
+ `mkdir -p #{@root_path}/spec/webface/components/`
29
+ end
30
+
31
+ def copy_unit_test_server
32
+ copy_file "webface_test_server.js", "spec/webface/test_server.js"
33
+ copy_file "run_webface_test", "spec/webface/run_test"
34
+ `chmod +x #{@root_path}/spec/webface/run_test`
35
+ copy_file "mocha.css", "spec/webface/mocha.css"
36
+ copy_file "mocha.pug", "spec/webface/mocha.pug"
37
+ copy_file "test_utils.js", "spec/webface/test_utils.js"
38
+ copy_file "webface.test.js", "spec/webface/webface.test.js"
39
+ copy_file "webface_init.js", "spec/webface/webface_init.js"
40
+ copy_file "test_animator.js", "spec/webface/test_animator.js"
41
+ copy_file "my_component.test.js", "spec/webface/components/my_component.test.js"
42
+
43
+ copy_file "application.js", "app/assets/javascripts/application.js"
44
+ gsub_file "app/assets/javascripts/application.js", "path_to_webface", @webface_path.sub(/\A.*app\/assets\/javascripts\//, "") + "/lib"
45
+ end
46
+
47
+ def add_node_modules_to_gitignore
48
+ `echo "spec/webface/node_modules" >> #{@root_path}/.gitignore` unless File.read("#{@root_path}/.gitignore").include?("spec/webface/node_modules")
49
+ `echo "app/assets/javascripts/node_modules" >> #{@root_path}/.gitignore` unless File.read("#{@root_path}/.gitignore").include?("app/assets/javascripts/node_modules")
50
+ end
51
+
52
+ def copy_package_json
53
+ copy_file "#{@root_path}/#{@webface_path}/package.json", "app/assets/javascripts/package.json"
54
+ copy_file "#{@root_path}/#{@webface_path}/package-lock.json", "app/assets/javascripts/package-lock.json"
55
+ end
56
+
57
+ def create_symlinks
58
+ create_symlink("#{@root_path}/app/assets/javascripts", "#{@root_path}/spec/webface/source")
59
+ create_symlink("#{@root_path}/app/assets/javascripts/node_modules", "#{@root_path}/spec/webface/node_modules")
60
+ create_symlink("#{@root_path}/#{@webface_path}", "#{@root_path}/spec/webface/webface_source")
61
+ create_symlink "#{@root_path}/app/assets/javascripts/package.json", "#{@root_path}/spec/webface/package.json"
62
+ create_symlink "#{@root_path}/app/assets/javascripts/package-lock.json", "#{@root_path}/spec/webface/package-lock.json"
63
+ end
64
+
65
+ def install_node_modules
66
+ puts `cd #{@root_path}/app/assets/javascripts && npm i`
67
+ end
68
+
69
+ private
70
+
71
+ def create_symlink(from, to)
72
+ files = "#{from} #{to}"
73
+ unless File.exist?(to)
74
+ puts " Symlinking ".colorize(:green) + from + " -> " + to
75
+ `ln -s #{files}`
76
+ else
77
+ puts " Symlink already exists ".colorize(:light_blue) + to
78
+ end
79
+ end
80
+
81
+ end
@@ -0,0 +1,3 @@
1
+ desc "Run Webface javascripts unit tests"
2
+ task :webface_spec do
3
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "../app/helpers/webface_component_helper"
2
+ require_relative "../app/helpers/webface_form"
3
+
4
+ module WebfaceRails
5
+
6
+ if defined?(Rails)
7
+ class Engine < Rails::Engine
8
+ end
9
+ end
10
+
11
+ end
@@ -0,0 +1,3 @@
1
+ module WebfaceRails
2
+ VERSION = '0.1.6'
3
+ end
@@ -0,0 +1,133 @@
1
+ require 'spec_helper'
2
+ require 'active_support/all'
3
+
4
+ # Dummy class
5
+ class Offer;end
6
+
7
+ RSpec.describe WebfaceComponentHelper do
8
+
9
+ before(:each) do
10
+ @model = double("model")
11
+ @model_with_collection = double("model with collection")
12
+ @target_model = double("target_model")
13
+ @dummy = double("dummy")
14
+ allow(@dummy).to receive(:id).and_return(nil)
15
+ allow(@target_model).to receive(:id).and_return(5)
16
+ @options = { name: "model[association1][association2][][field_name]", field_counter: 5, model_name: "model", nested_field: [[:association1, :has_one], [:association2, :has_many]], attr_name: "field_name", model: @model }
17
+ end
18
+
19
+ include WebfaceComponentHelper
20
+
21
+ # This is a dummy method so we don't need to import I18n from rails
22
+ def t(key)
23
+ key.include?("no_value") ? "[no value]" : key
24
+ end
25
+
26
+ it "breaks down associations chain used in field name into an array" do
27
+ field_1 = { model: Offer.new, nested_field: [[:association1, :has_one], [:association2, :has_many, 1]] }
28
+ field_2 = { model: Offer.new, nested_field: [[:association1, :has_many, 1], [:association2, :has_many, 2]] }
29
+ field_3 = { model: Offer.new, nested_field: [[:association1, :has_many], [:association2, :has_many]] }
30
+ field_4 = { model: Offer.new, nested_field: [[:association1, :has_many], [:association2, :has_one]] }
31
+ expect(get_field_names_chain_from_nested_field_param_and_model(field_1)).to eq(
32
+ ["offer", :association1, [:association2, 1]]
33
+ )
34
+ expect(get_field_names_chain_from_nested_field_param_and_model(field_2)).to eq(
35
+ ["offer", [:association1,1], [:association2, 2]]
36
+ )
37
+ expect(get_field_names_chain_from_nested_field_param_and_model(field_3)).to eq(
38
+ ["offer", [:association1,nil], [:association2, nil]]
39
+ )
40
+ expect(get_field_names_chain_from_nested_field_param_and_model(field_4)).to eq(
41
+ ["offer", [:association1,nil], :association2]
42
+ )
43
+ end
44
+
45
+ describe "getting value from a model" do
46
+
47
+ it "gets value for the field from the model when model is not saved" do
48
+ allow(@target_model).to receive(:id).and_return(nil)
49
+ expect(@target_model).to receive(:field_name).and_return("value")
50
+ expect(@model_with_collection).to receive(:association2).and_return([@dummy,@dummy,@dummy,@dummy,@dummy,@target_model])
51
+ expect(@model).to receive(:association1).and_return(@model_with_collection)
52
+ expect(get_value_for_field_name(@options)).to eq("value")
53
+ end
54
+
55
+ it "uses a different field_name for the model if specified" do
56
+ allow(@target_model).to receive(:id).and_return(nil)
57
+ expect(@target_model).to receive(:attr_name).and_return("value")
58
+ expect(@model_with_collection).to receive(:association2).and_return([@dummy,@dummy,@dummy,@dummy,@dummy,@target_model])
59
+ expect(@model).to receive(:association1).and_return(@model_with_collection)
60
+ expect(get_value_for_field_name(@options.merge(model_field_name: "attr_name"))).to eq("value")
61
+ end
62
+
63
+ it "gets value for an existing model (with id) in a has_many association" do
64
+ @options[:nested_field] = [[:association1, :has_one], [:association2, :has_many, 5]]
65
+ allow(@target_model).to receive(:id).and_return(5)
66
+ expect(@target_model).to receive(:attr_name).and_return("value")
67
+ expect(@model_with_collection).to receive(:association2).and_return([@dummy,@target_model])
68
+ expect(@model).to receive(:association1).and_return(@model_with_collection)
69
+ expect(get_value_for_field_name(@options.merge(model_field_name: "attr_name"))).to eq("value")
70
+ end
71
+
72
+ end
73
+
74
+ describe "getting value from a serialized Hash stored in a field" do
75
+
76
+ it "gets value from a single level serialized hash" do
77
+ allow(@model).to receive(:serialized_field).and_return({ hello: "world" })
78
+ expect(get_value_for_field_name({name: "model[serialized_field][hello]", model_name: "model", attr_name: "serialized_field", model: @model })).to eq("world")
79
+ end
80
+
81
+ it "gets value from a multiple level serialized hash" do
82
+ allow(@model).to receive(:serialized_field).and_return({ hello: { hi: "world" }})
83
+ expect(get_value_for_field_name({name: "model[serialized_field][hello][hi]", model_name: "model", attr_name: "serialized_field", model: @model })).to eq("world")
84
+ end
85
+
86
+ it "gets value from a multiple level serialized hash with arrays" do
87
+ allow(@model).to receive(:serialized_field).and_return({ hello: { hi: ["whole", "wide", "world"] }})
88
+ expect(get_value_for_field_name({name: "model[serialized_field][hello][hi][2]", model_name: "model", attr_name: "serialized_field", model: @model })).to eq("world")
89
+ end
90
+
91
+ end
92
+
93
+ it "gets value for the field from params" do
94
+ @options[:model] = nil
95
+ expect(self).to receive(:params).and_return(HashWithIndifferentAccess.new({model: { association1_attributes: { association2_attributes: [0,0,0,0,0, { "field_name" => "value"}]}}}))
96
+ expect(get_value_for_field_name(@options)).to eq("value")
97
+ end
98
+
99
+ it "gets error message for the field from the model" do
100
+ @options[:nested_field] = [[:association1, :has_one], [:association2, :has_many, 5]]
101
+ expect(@target_model).to receive(:errors).and_return(HashWithIndifferentAccess.new({ field_name: "error message"}))
102
+ allow(@target_model).to receive(:id).and_return(5)
103
+ expect(@model_with_collection).to receive(:association2).and_return([@dummy,@target_model])
104
+ expect(@model).to receive(:association1).and_return(@model_with_collection)
105
+ expect(get_error_for_field_name(@options)).to eq("error message")
106
+ end
107
+
108
+ describe "SelectComponent helpers" do
109
+
110
+ it "prepares a collection of field names & values out of Hash" do
111
+ c = { key1: "value1", key2: "value2", key3: "value3" }
112
+ expect(prepare_select_collection(c)).to eq([["key1", "value1"], ["key2", "value2"], ["key3", "value3"]])
113
+ end
114
+
115
+ it "prepares a collection of field names & values out of Array" do
116
+ c = ["value1", "value2", "value3"]
117
+ expect(prepare_select_collection(c)).to eq([["value1", "value1"], ["value2", "value2"], ["value3", "value3"]])
118
+ end
119
+
120
+ it "prepares a collection of field names and includes an blank value first" do
121
+ c = ["value1", "value2", "value3"]
122
+ expect(prepare_select_collection(c, selected: "value1", blank_option: true)).to eq([["null", "[no value]"], ["value1", "value1"], ["value2", "value2"], ["value3", "value3"]])
123
+ end
124
+
125
+ it "returns selected value for the SelectComponent field" do
126
+ c = { key1: "value1", key2: "value2", key3: "value3" }
127
+ options = { selected: "key1", collection: c }
128
+ expect(select_component_get_selected_value(options, :display)).to eq("value1")
129
+ end
130
+
131
+ end
132
+
133
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ # Dummy class
4
+ class Offer;end
5
+
6
+ RSpec.describe WebfaceForm do
7
+
8
+ before(:each) do
9
+ @component_form = WebfaceForm.new(Offer.new, nil)
10
+ end
11
+
12
+ it "modifies field name for nested has_one association" do
13
+ field_name = "offer[payment_method_type]"
14
+ assoc_name = :payment_method
15
+ expect(@component_form.send(:modify_name_for_nested_has_one, field_name, assoc_name)).to eq(
16
+ "offer[payment_method_attributes][payment_method_type]"
17
+ )
18
+ field_name = "offer[payment_method_instructions_attributes][][name]"
19
+ expect(@component_form.send(:modify_name_for_nested_has_one, field_name, assoc_name)).to eq(
20
+ "offer[payment_method_instructions_attributes][][payment_method_attributes][name]"
21
+ )
22
+ end
23
+
24
+ it "modifies field name for nested has_many association" do
25
+ field_name = "offer[instructions]"
26
+ assoc_name = :payment_method_instructions
27
+ expect(@component_form.send(:modify_name_for_nested_has_many, field_name, assoc_name)).to eq(
28
+ "offer[payment_method_instructions_attributes][][instructions]"
29
+ )
30
+ end
31
+
32
+ it "modifies field name for multiple levels of associations" do
33
+ field_name = "offer[name]"
34
+ assoc_name = [[:payment_method_instructions, :has_many], [:payment_method, :has_one]]
35
+ expect(@component_form.send(:modify_name_for_nested_field, field_name, assoc_name)).to eq(
36
+ "offer[payment_method_instructions_attributes][][payment_method_attributes][name]"
37
+ )
38
+ end
39
+
40
+ it "modifies field name for serialized field hash" do
41
+ expect(@component_form.send(:modify_name_for_serialized_field, "offer[serialized_field[hello][]]")).to eq(
42
+ "offer[serialized_field][hello][]"
43
+ )
44
+
45
+ expect(@component_form.send(:modify_name_for_serialized_field, "offer[serialized_field[hello]]")).to eq(
46
+ "offer[serialized_field][hello]"
47
+ )
48
+
49
+ expect(@component_form.send(:modify_name_for_serialized_field, "offer[serialized_field[hello][hi]]")).to eq(
50
+ "offer[serialized_field][hello][hi]"
51
+ )
52
+
53
+ expect(@component_form.send(:modify_name_for_serialized_field, "quiz_question[question[ru]]")).to eq(
54
+ "quiz_question[question][ru]"
55
+ )
56
+ end
57
+
58
+ end
@@ -0,0 +1,15 @@
1
+ require "bundler/setup"
2
+ Bundler.setup
3
+ require "webface_rails"
4
+
5
+ RSpec.configure do |config|
6
+ # Enable flags like --only-failures and --next-failure
7
+ config.example_status_persistence_file_path = ".rspec_status"
8
+
9
+ # Disable RSpec exposing methods globally on `Module` and `main`
10
+ config.disable_monkey_patching!
11
+
12
+ config.expect_with :rspec do |c|
13
+ c.syntax = :expect
14
+ end
15
+ end
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webface_rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.6
5
+ platform: ruby
6
+ authors:
7
+ - Roman Snitko
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-05-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 5.2.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 5.2.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: colorize
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Provides view helpers for creating components, standard component views
70
+ and css, form builder and a unit test server
71
+ email:
72
+ - roman.snitko@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - MIT-LICENSE
78
+ - README.md
79
+ - Rakefile
80
+ - app/controllers/webface_error_report_controller.rb
81
+ - app/helpers/webface_component_helper.rb
82
+ - app/helpers/webface_form.rb
83
+ - app/views/webface_component_templates/_button.html.haml
84
+ - app/views/webface_component_templates/_dialog_window.html.haml
85
+ - app/views/webface_component_templates/_modal_window.html.haml
86
+ - app/views/webface_component_templates/_simple_notification.html.haml
87
+ - app/views/webface_components/_button.html.haml
88
+ - app/views/webface_components/_checkbox.html.haml
89
+ - app/views/webface_components/_editable_select.html.haml
90
+ - app/views/webface_components/_field_hints.html.haml
91
+ - app/views/webface_components/_hidden_form_field.html.haml
92
+ - app/views/webface_components/_hint.html.haml
93
+ - app/views/webface_components/_hint_trigger.html.haml
94
+ - app/views/webface_components/_numeric_form_field.html.haml
95
+ - app/views/webface_components/_password_form_field.html.haml
96
+ - app/views/webface_components/_post_button_link.html.haml
97
+ - app/views/webface_components/_radio.html.haml
98
+ - app/views/webface_components/_select.html.haml
99
+ - app/views/webface_components/_text_form_field.html.haml
100
+ - app/views/webface_components/_text_form_field_with_validation.html.haml
101
+ - app/views/webface_components/_textarea_form_field.html.haml
102
+ - app/views/webface_components/shared/_editable_select_base.html.haml
103
+ - lib/generators/templates/application.js
104
+ - lib/generators/templates/mocha.css
105
+ - lib/generators/templates/mocha.pug
106
+ - lib/generators/templates/my_component.test.js
107
+ - lib/generators/templates/run_webface_test
108
+ - lib/generators/templates/test_animator.js
109
+ - lib/generators/templates/test_utils.js
110
+ - lib/generators/templates/webface.test.js
111
+ - lib/generators/templates/webface_init.js
112
+ - lib/generators/templates/webface_test_server.js
113
+ - lib/generators/webface_generator.rb
114
+ - lib/tasks/webface_rails_tasks.rake
115
+ - lib/webface_rails.rb
116
+ - lib/webface_rails/version.rb
117
+ - spec/helpers/webface_component_helper_spec.rb
118
+ - spec/helpers/webface_form_spec.rb
119
+ - spec/spec_helper.rb
120
+ homepage: https://webfacejs.org
121
+ licenses:
122
+ - MIT
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubyforge_project:
140
+ rubygems_version: 2.7.6
141
+ signing_key:
142
+ specification_version: 4
143
+ summary: Webface.js integration for Ruby On Rails
144
+ test_files:
145
+ - spec/helpers/webface_form_spec.rb
146
+ - spec/helpers/webface_component_helper_spec.rb
147
+ - spec/spec_helper.rb