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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +37 -0
- data/Rakefile +7 -0
- data/app/controllers/webface_error_report_controller.rb +12 -0
- data/app/helpers/webface_component_helper.rb +248 -0
- data/app/helpers/webface_form.rb +161 -0
- data/app/views/webface_component_templates/_button.html.haml +2 -0
- data/app/views/webface_component_templates/_dialog_window.html.haml +6 -0
- data/app/views/webface_component_templates/_modal_window.html.haml +5 -0
- data/app/views/webface_component_templates/_simple_notification.html.haml +4 -0
- data/app/views/webface_components/_button.html.haml +11 -0
- data/app/views/webface_components/_checkbox.html.haml +21 -0
- data/app/views/webface_components/_editable_select.html.haml +8 -0
- data/app/views/webface_components/_field_hints.html.haml +7 -0
- data/app/views/webface_components/_hidden_form_field.html.haml +1 -0
- data/app/views/webface_components/_hint.html.haml +9 -0
- data/app/views/webface_components/_hint_trigger.html.haml +15 -0
- data/app/views/webface_components/_numeric_form_field.html.haml +13 -0
- data/app/views/webface_components/_password_form_field.html.haml +12 -0
- data/app/views/webface_components/_post_button_link.html.haml +4 -0
- data/app/views/webface_components/_radio.html.haml +18 -0
- data/app/views/webface_components/_select.html.haml +34 -0
- data/app/views/webface_components/_text_form_field.html.haml +12 -0
- data/app/views/webface_components/_text_form_field_with_validation.html.haml +6 -0
- data/app/views/webface_components/_textarea_form_field.html.haml +11 -0
- data/app/views/webface_components/shared/_editable_select_base.html.haml +34 -0
- data/lib/generators/templates/application.js +53 -0
- data/lib/generators/templates/mocha.css +10 -0
- data/lib/generators/templates/mocha.pug +15 -0
- data/lib/generators/templates/my_component.test.js +15 -0
- data/lib/generators/templates/run_webface_test +11 -0
- data/lib/generators/templates/test_animator.js +66 -0
- data/lib/generators/templates/test_utils.js +6 -0
- data/lib/generators/templates/webface.test.js +2 -0
- data/lib/generators/templates/webface_init.js +10 -0
- data/lib/generators/templates/webface_test_server.js +68 -0
- data/lib/generators/webface_generator.rb +81 -0
- data/lib/tasks/webface_rails_tasks.rake +3 -0
- data/lib/webface_rails.rb +11 -0
- data/lib/webface_rails/version.rb +3 -0
- data/spec/helpers/webface_component_helper_spec.rb +133 -0
- data/spec/helpers/webface_form_spec.rb +58 -0
- data/spec/spec_helper.rb +15 -0
- metadata +147 -0
@@ -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,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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|