glib-web 0.3.6 → 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/concerns/application/json/ui.rb +1 -1
- data/app/helpers/glib/dynamic_texts_helper.rb +12 -0
- data/app/helpers/glib/json_ui/view_builder/panels.rb +0 -2
- data/app/models/glib/dynamic_text_record.rb +6 -0
- data/app/models/glib/text.rb +35 -0
- data/app/views/json_ui/garage/home/blank.json.jbuilder +1 -1
- data/lib/generators/glib/install_generator.rb +18 -0
- data/lib/generators/templates/20191017062519_create_texts.rb +12 -0
- data/lib/generators/templates/20191024063257_add_scope_to_texts.rb +7 -0
- data/lib/generators/templates/database.yml +107 -0
- data/lib/generators/templates/dynamic_text.rb +2 -0
- data/lib/glib/json_crawler/http.rb +61 -49
- metadata +9 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a318fa9377a19b89642be242b820ee9e2670f0bff29e6a346806b76f8906b16f
|
4
|
+
data.tar.gz: 8797bfd1ab030db735284adcf8c9ddf86441dbd0b189273ca8e7cd0f4d8cdd57
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfe9421dcc2b4897220d5a7cea9ef1e258bbfbd9a4667b5a5c40e0a39876f7cc666b40b4b0f0efe4d3efb8020d888542d1757d625cf83b3cabcb53a6a27787e6
|
7
|
+
data.tar.gz: 3f6abcd4c53f2abd78b7a96c539c59dec16559147502b28ba3d4fb80f2bdea756a3e51f887082429043d8322bba4d75bb318fcaef27a1ffac121708aa4012d6e
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Glib
|
2
|
+
module DynamicTextsHelper
|
3
|
+
def dt(key, default_value = '', scope = 'itinerarybuilder')
|
4
|
+
new_key = key
|
5
|
+
if key.starts_with?('.')
|
6
|
+
new_key = "#{controller_name}.#{action_name}#{key}"
|
7
|
+
end
|
8
|
+
|
9
|
+
Glib::Text.get_content(scope, new_key, default_value)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -76,8 +76,6 @@ class Glib::JsonUi::ViewBuilder
|
|
76
76
|
json.view 'fields/hidden-v1'
|
77
77
|
json.name 'authenticity_token'
|
78
78
|
json.value page.context.form_authenticity_token
|
79
|
-
# Produce consistent token for predictible test results
|
80
|
-
# json.value Rails.env.test? ? 'test_token' : page.context.form_authenticity_token
|
81
79
|
end
|
82
80
|
end
|
83
81
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Glib
|
2
|
+
class Text < Glib::DynamicTextRecord
|
3
|
+
validates :scope, presence: true
|
4
|
+
validates :key, presence: true, uniqueness: { scope: :scope }
|
5
|
+
validates :content, presence: true
|
6
|
+
|
7
|
+
after_save :update_to_redis
|
8
|
+
|
9
|
+
def self.get_content(scope, key, default_value)
|
10
|
+
scope_key = "#{scope}.#{key}"
|
11
|
+
|
12
|
+
unless content = $dt_redis.get(scope_key)
|
13
|
+
if text = find_by(scope: scope, key: key)
|
14
|
+
update_content(scope_key, text.content)
|
15
|
+
content = text.content
|
16
|
+
else
|
17
|
+
create(scope: scope, key: key, content: default_value)
|
18
|
+
update_content(scope_key, default_value)
|
19
|
+
content = default_value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
content
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def self.update_content(scope_key, content)
|
28
|
+
$dt_redis.set(scope_key, content)
|
29
|
+
end
|
30
|
+
|
31
|
+
def update_to_redis
|
32
|
+
Glib::Text.update_content("#{scope}.#{key}", content)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -3,7 +3,7 @@ sleep 0.5
|
|
3
3
|
json.title 'Menu'
|
4
4
|
|
5
5
|
json_ui_page json do |page|
|
6
|
-
render "#{@path_prefix}/nav_menu", json: json, page: page, top_nav:
|
6
|
+
render "#{@path_prefix}/nav_menu", json: json, page: page, top_nav: false
|
7
7
|
|
8
8
|
page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
|
9
9
|
scroll.label text: 'Blank page'
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Glib
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../../templates', __FILE__)
|
5
|
+
|
6
|
+
class_option :redis_env_key, type: :string, default: 'DT_REDIS_URL'
|
7
|
+
class_option :database_env_key, type: :string, default: 'DT_DATABASE_URL'
|
8
|
+
class_option :app_name, type: :string, default: Rails.application.class.parent_name
|
9
|
+
|
10
|
+
def copy_initializer
|
11
|
+
template '20191017062519_create_texts.rb', 'db/dynamic_text_migrate/20191017062519_create_texts.rb'
|
12
|
+
template '20191024063257_add_scope_to_texts.rb', 'db/dynamic_text_migrate/20191024063257_add_scope_to_texts.rb'
|
13
|
+
template 'dynamic_text.rb', 'config/initializers/dynamic_text.rb'
|
14
|
+
template 'database.yml', 'config/database.yml'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# PostgreSQL. Versions 9.1 and up are supported.
|
2
|
+
#
|
3
|
+
# Install the pg driver:
|
4
|
+
# gem install pg
|
5
|
+
# On OS X with Homebrew:
|
6
|
+
# gem install pg -- --with-pg-config=/usr/local/bin/pg_config
|
7
|
+
# On OS X with MacPorts:
|
8
|
+
# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
|
9
|
+
# On Windows:
|
10
|
+
# gem install pg
|
11
|
+
# Choose the win32 build.
|
12
|
+
# Install PostgreSQL and put its /bin directory on your path.
|
13
|
+
#
|
14
|
+
# Configure Using Gemfile
|
15
|
+
# gem 'pg'
|
16
|
+
#
|
17
|
+
default: &default
|
18
|
+
adapter: postgresql
|
19
|
+
encoding: unicode
|
20
|
+
# For details on connection pooling, see Rails configuration guide
|
21
|
+
# http://guides.rubyonrails.org/configuring.html#database-pooling
|
22
|
+
pool: <%= "\<\%\= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } \%\>" %>
|
23
|
+
host: <%= "\<\%\= ENV.fetch(\"DATABASE_HOST\") {} \%\>" %>
|
24
|
+
username: <%= "\<\%\= ENV.fetch(\"DATABASE_USER\") {} \%\>" %>
|
25
|
+
password: <%= "\<\%\= ENV.fetch(\"DATABASE_PASSWORD\") {} \%\>" %>
|
26
|
+
|
27
|
+
development:
|
28
|
+
primary:
|
29
|
+
<<: *default
|
30
|
+
database: <%= "\<\%\= ENV.fetch(\"DATABASE_NAME\") { \"#{options[:app_name]}\" } + \"_development\" \%\>" %>
|
31
|
+
dynamic_text:
|
32
|
+
<<: *default
|
33
|
+
migrations_paths: db/dynamic_text_migrate
|
34
|
+
database: <%= "\<\%\= ENV.fetch(\"DT_DATABASE_NAME\") { \"DynamicText\" } + \"_development\" \%\>" %>
|
35
|
+
|
36
|
+
# The specified database role being used to connect to postgres.
|
37
|
+
# To create additional roles in postgres see `$ createuser --help`.
|
38
|
+
# When left blank, postgres will use the default role. This is
|
39
|
+
# the same name as the operating system user that initialized the database.
|
40
|
+
#username: ItineraryBuilder
|
41
|
+
|
42
|
+
# The password associated with the postgres role (username).
|
43
|
+
#password:
|
44
|
+
|
45
|
+
# Connect on a TCP socket. Omitted by default since the client uses a
|
46
|
+
# domain socket that doesn't need configuration. Windows does not have
|
47
|
+
# domain sockets, so uncomment these lines.
|
48
|
+
#host: localhost
|
49
|
+
|
50
|
+
# The TCP port the server listens on. Defaults to 5432.
|
51
|
+
# If your server runs on a different port number, change accordingly.
|
52
|
+
#port: 5432
|
53
|
+
|
54
|
+
# Schema search path. The server defaults to $user,public
|
55
|
+
#schema_search_path: myapp,sharedapp,public
|
56
|
+
|
57
|
+
# Minimum log levels, in increasing order:
|
58
|
+
# debug5, debug4, debug3, debug2, debug1,
|
59
|
+
# log, notice, warning, error, fatal, and panic
|
60
|
+
# Defaults to warning.
|
61
|
+
#min_messages: notice
|
62
|
+
|
63
|
+
# Warning: The database defined as "test" will be erased and
|
64
|
+
# re-generated from your development database when you run "rake".
|
65
|
+
# Do not set this db to the same as development or production.
|
66
|
+
test:
|
67
|
+
primary:
|
68
|
+
<<: *default
|
69
|
+
database: <%= "\<\%\= ENV.fetch(\"DATABASE_NAME\") { \"#{options[:app_name]}\" } + \"_test\" \%\>" %>
|
70
|
+
dynamic_text:
|
71
|
+
<<: *default
|
72
|
+
migrations_paths: db/dynamic_text_migrate
|
73
|
+
database: <%= "\<\%\= ENV.fetch(\"DT_DATABASE_NAME\") { \"DynamicText\" } + \"_test\" \%\>" %>
|
74
|
+
|
75
|
+
# As with config/secrets.yml, you never want to store sensitive information,
|
76
|
+
# like your database password, in your source code. If your source code is
|
77
|
+
# ever seen by anyone, they now have access to your database.
|
78
|
+
#
|
79
|
+
# Instead, provide the password as a unix environment variable when you boot
|
80
|
+
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
|
81
|
+
# for a full rundown on how to provide these environment variables in a
|
82
|
+
# production deployment.
|
83
|
+
#
|
84
|
+
# On Heroku and other platform providers, you may have a full connection URL
|
85
|
+
# available as an environment variable. For example:
|
86
|
+
#
|
87
|
+
# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
|
88
|
+
#
|
89
|
+
# You can use this database configuration with:
|
90
|
+
#
|
91
|
+
# production:
|
92
|
+
# url: <%= "\<\%\= ENV[\'DATABASE_URL\'] \%\>" %>
|
93
|
+
#
|
94
|
+
|
95
|
+
production_default: &production_default
|
96
|
+
adapter: postgresql
|
97
|
+
encoding: unicode
|
98
|
+
pool: <%= "\<\%\= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } \%\>" %>
|
99
|
+
|
100
|
+
production:
|
101
|
+
primary:
|
102
|
+
<<: *production_default
|
103
|
+
url: <%= "\<\%\= ENV[\"DATABASE_URL\"] \%\>" %>
|
104
|
+
dynamic_text:
|
105
|
+
<<: *production_default
|
106
|
+
migrations_paths: db/dynamic_text_migrate
|
107
|
+
url: <%= "\<\%\= ENV[\"#{options[:database_env_key]}\"] \%\>" %>
|
@@ -20,39 +20,38 @@ module Glib
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def get(url, controller)
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
#
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
55
|
-
|
23
|
+
fetch(:get, url, controller)
|
24
|
+
|
25
|
+
# http_header = {
|
26
|
+
# 'Client-DeviceOS' => user[:device],
|
27
|
+
# 'Client-Version' => user[:version],
|
28
|
+
# }
|
29
|
+
|
30
|
+
# # Allow repeating urls because excluding them makes the test results really hard to analyze.
|
31
|
+
# # if history.include?(url)
|
32
|
+
|
33
|
+
# if url.blank?
|
34
|
+
# nil
|
35
|
+
# else
|
36
|
+
# @context.assert_match URI_REGEXP, url
|
37
|
+
# history << url
|
38
|
+
# @context.get url, params: {}, headers: http_header
|
39
|
+
# response = @context.response
|
40
|
+
# JsonCrawler::Router.log controller, url, response
|
41
|
+
# if (code = response.code.to_i) == 302
|
42
|
+
# redirect_uri = URI(response.headers['Location'])
|
43
|
+
# redirect_uri.query = [redirect_uri.query, "format=json"].compact.join('&')
|
44
|
+
# return get redirect_uri.to_s, controller
|
45
|
+
# else
|
46
|
+
# response_times << response.headers['X-Runtime'].to_f
|
47
|
+
# @context.assert_includes VALID_RESPONSE_CODES, code, "Expected a valid response but was [#{response.code}] #{Rack::Utils::HTTP_STATUS_CODES[response.code.to_i]}:\n#{url}"
|
48
|
+
# if response.content_type == 'application/json'
|
49
|
+
# JSON.parse(response.body)
|
50
|
+
# else
|
51
|
+
# nil
|
52
|
+
# end
|
53
|
+
# end
|
54
|
+
# end
|
56
55
|
end
|
57
56
|
|
58
57
|
def post(url, controller, params)
|
@@ -73,24 +72,37 @@ module Glib
|
|
73
72
|
|
74
73
|
private
|
75
74
|
def fetch(method, url, controller, params = {})
|
76
|
-
if url.blank?
|
77
|
-
nil
|
78
|
-
else
|
79
|
-
# history << url
|
80
|
-
@context.assert_match(URI_REGEXP, url)
|
75
|
+
return nil if url.blank?
|
81
76
|
|
82
|
-
|
83
|
-
|
84
|
-
'Client-Version' => user[:version],
|
85
|
-
'X-CSRF-Token' => user[:token]
|
86
|
-
}
|
77
|
+
if method == :get
|
78
|
+
return nil if history.include?(url)
|
87
79
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
80
|
+
history << url
|
81
|
+
end
|
82
|
+
|
83
|
+
@context.assert_match(URI_REGEXP, url)
|
84
|
+
|
85
|
+
http_header = {
|
86
|
+
'Client-DeviceOS' => user[:device],
|
87
|
+
'Client-Version' => user[:version],
|
88
|
+
'X-CSRF-Token' => user[:token]
|
89
|
+
}
|
90
|
+
|
91
|
+
params.each do |name, value|
|
92
|
+
params[name] = "" if value.is_a?(Array) && value.size == 0
|
93
|
+
end
|
93
94
|
|
95
|
+
@context.send(method, url, params: params, headers: http_header)
|
96
|
+
response = @context.response
|
97
|
+
JsonCrawler::Router.log(controller, url, response)
|
98
|
+
|
99
|
+
if (code = response.code.to_i) == 302
|
100
|
+
redirect_uri = URI(response.headers['Location'])
|
101
|
+
redirect_uri.query = [redirect_uri.query, "format=json"].compact.join('&')
|
102
|
+
return get redirect_uri.to_s, controller
|
103
|
+
else
|
104
|
+
response_times << response.headers['X-Runtime'].to_f
|
105
|
+
@context.assert_includes VALID_RESPONSE_CODES, code, "Expected a valid response but was [#{response.code}] #{Rack::Utils::HTTP_STATUS_CODES[response.code.to_i]}:\n#{url}"
|
94
106
|
if response.media_type == 'application/json'
|
95
107
|
JSON.parse(response.body)
|
96
108
|
else
|
@@ -100,4 +112,4 @@ module Glib
|
|
100
112
|
end
|
101
113
|
end
|
102
114
|
end
|
103
|
-
end
|
115
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glib-web
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ''
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- app/controllers/concerns/application/json/ui.rb
|
36
36
|
- app/controllers/concerns/application/json/validation.rb
|
37
37
|
- app/controllers/glib/home_controller.rb
|
38
|
+
- app/helpers/glib/dynamic_texts_helper.rb
|
38
39
|
- app/helpers/glib/json_ui/abstract_builder.rb
|
39
40
|
- app/helpers/glib/json_ui/action_builder.rb
|
40
41
|
- app/helpers/glib/json_ui/list_builders.rb
|
@@ -48,6 +49,8 @@ files:
|
|
48
49
|
- app/helpers/glib/json_ui/view_builder/banners.rb
|
49
50
|
- app/helpers/glib/json_ui/view_builder/fields.rb
|
50
51
|
- app/helpers/glib/json_ui/view_builder/panels.rb
|
52
|
+
- app/models/glib/dynamic_text_record.rb
|
53
|
+
- app/models/glib/text.rb
|
51
54
|
- app/views/app/views/json_ui/vue/renderer.html.erb
|
52
55
|
- app/views/json_ui/garage/_nav_menu.json.jbuilder
|
53
56
|
- app/views/json_ui/garage/actions/index.json.jbuilder
|
@@ -111,6 +114,11 @@ files:
|
|
111
114
|
- app/views/json_ui/garage/views/misc.json.jbuilder
|
112
115
|
- app/views/json_ui/garage/views/texts.json.jbuilder
|
113
116
|
- config/routes.rb
|
117
|
+
- lib/generators/glib/install_generator.rb
|
118
|
+
- lib/generators/templates/20191017062519_create_texts.rb
|
119
|
+
- lib/generators/templates/20191024063257_add_scope_to_texts.rb
|
120
|
+
- lib/generators/templates/database.yml
|
121
|
+
- lib/generators/templates/dynamic_text.rb
|
114
122
|
- lib/glib-web.rb
|
115
123
|
- lib/glib/engine.rb
|
116
124
|
- lib/glib/json_crawler.rb
|