glib-web 0.5.43 → 0.5.44

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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/glib/analytics/funnel.rb +61 -61
  3. data/app/controllers/concerns/glib/auth/policy.rb +148 -148
  4. data/app/controllers/concerns/glib/json/dynamic_text.rb +126 -126
  5. data/app/controllers/concerns/glib/json/libs.rb +144 -144
  6. data/app/controllers/concerns/glib/json/new_dynamic_text.rb +122 -122
  7. data/app/controllers/concerns/glib/json/transformation.rb +11 -11
  8. data/app/controllers/concerns/glib/json/traversal.rb +87 -87
  9. data/app/controllers/concerns/glib/json/ui.rb +88 -88
  10. data/app/controllers/concerns/glib/json/validation.rb +13 -13
  11. data/app/controllers/glib/home_controller.rb +16 -16
  12. data/app/helpers/glib/app_feature_support_helper.rb +16 -16
  13. data/app/helpers/glib/dynamic_images_helper.rb +55 -55
  14. data/app/helpers/glib/dynamic_texts_helper.rb +42 -42
  15. data/app/helpers/glib/enum_helper.rb +8 -8
  16. data/app/helpers/glib/forms_helper.rb +15 -15
  17. data/app/helpers/glib/json_ui/abstract_builder.rb +294 -294
  18. data/app/helpers/glib/json_ui/action_builder.rb +131 -131
  19. data/app/helpers/glib/json_ui/action_builder/dialogs.rb +58 -58
  20. data/app/helpers/glib/json_ui/action_builder/http.rb +39 -39
  21. data/app/helpers/glib/json_ui/action_builder/sheets.rb +15 -15
  22. data/app/helpers/glib/json_ui/action_builder/snackbars.rb +41 -41
  23. data/app/helpers/glib/json_ui/action_builder/windows.rb +26 -26
  24. data/app/helpers/glib/json_ui/analytics_helper.rb +17 -17
  25. data/app/helpers/glib/json_ui/dynamic_field_builders.rb +25 -25
  26. data/app/helpers/glib/json_ui/generic_builders.rb +28 -28
  27. data/app/helpers/glib/json_ui/list_builders.rb +104 -104
  28. data/app/helpers/glib/json_ui/menu_builder.rb +94 -94
  29. data/app/helpers/glib/json_ui/page_helper.rb +213 -213
  30. data/app/helpers/glib/json_ui/response_helper.rb +25 -25
  31. data/app/helpers/glib/json_ui/split_builders.rb +32 -32
  32. data/app/helpers/glib/json_ui/styling_helper.rb +47 -47
  33. data/app/helpers/glib/json_ui/table_builders.rb +74 -74
  34. data/app/helpers/glib/json_ui/view_builder.rb +208 -208
  35. data/app/helpers/glib/json_ui/view_builder/banners.rb +24 -24
  36. data/app/helpers/glib/json_ui/view_builder/charts.rb +33 -33
  37. data/app/helpers/glib/json_ui/view_builder/fields.rb +235 -235
  38. data/app/helpers/glib/json_ui/view_builder/panels.rb +250 -250
  39. data/app/helpers/glib/urls_helper.rb +7 -7
  40. data/app/models/glib/active_storage/attachment.rb +9 -9
  41. data/app/models/glib/active_storage/blob.rb +9 -9
  42. data/app/models/glib/application_record.rb +18 -18
  43. data/app/models/glib/dynamic_text_record.rb +9 -9
  44. data/app/models/glib/text.rb +95 -95
  45. data/app/policies/glib/application_policy.rb +161 -161
  46. data/app/validators/email_typo_validator.rb +38 -38
  47. data/app/validators/email_validator.rb +7 -7
  48. data/app/validators/url_validator.rb +20 -20
  49. data/app/views/json_ui/garage/_nav_menu.json.jbuilder +70 -70
  50. data/app/views/json_ui/garage/actions/_dialogs.json.jbuilder +104 -104
  51. data/app/views/json_ui/garage/actions/_http.json.jbuilder +24 -24
  52. data/app/views/json_ui/garage/actions/_reload.json.jbuilder +17 -17
  53. data/app/views/json_ui/garage/actions/_sheets.json.jbuilder +18 -18
  54. data/app/views/json_ui/garage/actions/_snackbars.json.jbuilder +33 -33
  55. data/app/views/json_ui/garage/actions/_timeouts.json.jbuilder +18 -18
  56. data/app/views/json_ui/garage/actions/_windows.json.jbuilder +24 -24
  57. data/app/views/json_ui/garage/actions/dialogs_oauth_post.json.jbuilder +6 -6
  58. data/app/views/json_ui/garage/actions/index.json.jbuilder +22 -22
  59. data/app/views/json_ui/garage/forms/_alert_post_data.json.jbuilder +6 -6
  60. data/app/views/json_ui/garage/forms/basic.json.jbuilder +21 -21
  61. data/app/views/json_ui/garage/forms/basic_post.json.jbuilder +8 -8
  62. data/app/views/json_ui/garage/forms/checkboxes.json.jbuilder +43 -43
  63. data/app/views/json_ui/garage/forms/conditional_value.json.jbuilder +36 -36
  64. data/app/views/json_ui/garage/forms/dynamic_group.json.jbuilder +56 -56
  65. data/app/views/json_ui/garage/forms/dynamic_select.json.jbuilder +25 -25
  66. data/app/views/json_ui/garage/forms/dynamic_select_data.json.jbuilder +38 -38
  67. data/app/views/json_ui/garage/forms/file_upload.json.jbuilder +65 -65
  68. data/app/views/json_ui/garage/forms/floating_submit.json.jbuilder +31 -31
  69. data/app/views/json_ui/garage/forms/generic_post.json.jbuilder +3 -3
  70. data/app/views/json_ui/garage/forms/get_request.json.jbuilder +28 -28
  71. data/app/views/json_ui/garage/forms/index.json.jbuilder +110 -110
  72. data/app/views/json_ui/garage/forms/new_rich_text.json.jbuilder +40 -40
  73. data/app/views/json_ui/garage/forms/pickers.json.jbuilder +48 -48
  74. data/app/views/json_ui/garage/forms/rich_text.json.jbuilder +40 -40
  75. data/app/views/json_ui/garage/forms/selects.json.jbuilder +70 -70
  76. data/app/views/json_ui/garage/forms/show_hide.json.jbuilder +105 -105
  77. data/app/views/json_ui/garage/forms/styled_boxes.json.jbuilder +36 -36
  78. data/app/views/json_ui/garage/forms/submission_flow.json.jbuilder +17 -17
  79. data/app/views/json_ui/garage/forms/submission_flow_post.json.jbuilder +24 -24
  80. data/app/views/json_ui/garage/forms/submission_indicator.json.jbuilder +63 -63
  81. data/app/views/json_ui/garage/forms/submission_indicator_post.json.jbuilder +25 -25
  82. data/app/views/json_ui/garage/forms/text_validation.json.jbuilder +22 -22
  83. data/app/views/json_ui/garage/home/blank.json.jbuilder +11 -11
  84. data/app/views/json_ui/garage/home/index.json.jbuilder +32 -32
  85. data/app/views/json_ui/garage/home/slow.json.jbuilder +11 -11
  86. data/app/views/json_ui/garage/lists/_autoload_section.json.jbuilder +28 -28
  87. data/app/views/json_ui/garage/lists/autoload_all.json.jbuilder +32 -32
  88. data/app/views/json_ui/garage/lists/autoload_as_needed.json.jbuilder +35 -35
  89. data/app/views/json_ui/garage/lists/chat_ui.json.jbuilder +93 -93
  90. data/app/views/json_ui/garage/lists/edit_actions.json.jbuilder +54 -54
  91. data/app/views/json_ui/garage/lists/fab.json.jbuilder +12 -12
  92. data/app/views/json_ui/garage/lists/index.json.jbuilder +32 -32
  93. data/app/views/json_ui/garage/lists/reordering.json.jbuilder +24 -24
  94. data/app/views/json_ui/garage/lists/templating.json.jbuilder +35 -35
  95. data/app/views/json_ui/garage/notifications/android_post.json.jbuilder +48 -48
  96. data/app/views/json_ui/garage/notifications/index.json.jbuilder +32 -32
  97. data/app/views/json_ui/garage/notifications/web_socket.json.jbuilder +60 -60
  98. data/app/views/json_ui/garage/pages/flat_centered.json.jbuilder +29 -29
  99. data/app/views/json_ui/garage/pages/full_width.json.jbuilder +29 -29
  100. data/app/views/json_ui/garage/pages/full_width_height.json.jbuilder +16 -16
  101. data/app/views/json_ui/garage/pages/index.json.jbuilder +58 -58
  102. data/app/views/json_ui/garage/pages/layout.json.jbuilder +18 -18
  103. data/app/views/json_ui/garage/pages/loading_indicator.json.jbuilder +10 -10
  104. data/app/views/json_ui/garage/pages/nav_buttons.json.jbuilder +21 -21
  105. data/app/views/json_ui/garage/pages/nested_scroll.json.jbuilder +40 -40
  106. data/app/views/json_ui/garage/pages/tab_bar.json.jbuilder +27 -27
  107. data/app/views/json_ui/garage/panels/_styled.json.jbuilder +78 -78
  108. data/app/views/json_ui/garage/panels/card.json.jbuilder +4 -4
  109. data/app/views/json_ui/garage/panels/carousel.json.jbuilder +37 -37
  110. data/app/views/json_ui/garage/panels/custom.json.jbuilder +17 -17
  111. data/app/views/json_ui/garage/panels/flow.json.jbuilder +49 -49
  112. data/app/views/json_ui/garage/panels/horizontal.json.jbuilder +91 -91
  113. data/app/views/json_ui/garage/panels/index.json.jbuilder +132 -132
  114. data/app/views/json_ui/garage/panels/outlined.json.jbuilder +4 -4
  115. data/app/views/json_ui/garage/panels/responsive.json.jbuilder +98 -98
  116. data/app/views/json_ui/garage/panels/split.json.jbuilder +182 -182
  117. data/app/views/json_ui/garage/panels/vertical.json.jbuilder +50 -50
  118. data/app/views/json_ui/garage/services/dynamic_text.json.jbuilder +13 -13
  119. data/app/views/json_ui/garage/services/image.json.jbuilder +47 -47
  120. data/app/views/json_ui/garage/services/index.json.jbuilder +17 -17
  121. data/app/views/json_ui/garage/tables/_autoload_section.json.jbuilder +16 -16
  122. data/app/views/json_ui/garage/tables/autoload_all.json.jbuilder +43 -43
  123. data/app/views/json_ui/garage/tables/autoload_as_needed.json.jbuilder +50 -50
  124. data/app/views/json_ui/garage/tables/export_import.json.jbuilder +29 -29
  125. data/app/views/json_ui/garage/tables/horizontal_scroll.json.jbuilder +26 -26
  126. data/app/views/json_ui/garage/tables/index.json.jbuilder +25 -25
  127. data/app/views/json_ui/garage/tables/layout.json.jbuilder +36 -36
  128. data/app/views/json_ui/garage/views/_chart_data.json.jbuilder +17 -17
  129. data/app/views/json_ui/garage/views/banners.json.jbuilder +63 -63
  130. data/app/views/json_ui/garage/views/calendar_data.json.jbuilder +30 -30
  131. data/app/views/json_ui/garage/views/charts.json.jbuilder +115 -115
  132. data/app/views/json_ui/garage/views/icons.json.jbuilder +1450 -1450
  133. data/app/views/json_ui/garage/views/images.json.jbuilder +89 -89
  134. data/app/views/json_ui/garage/views/index.json.jbuilder +54 -54
  135. data/app/views/json_ui/garage/views/links.json.jbuilder +70 -70
  136. data/app/views/json_ui/garage/views/map_cluster_data.json.jbuilder +41 -41
  137. data/app/views/json_ui/garage/views/map_data.json.jbuilder +51 -51
  138. data/app/views/json_ui/garage/views/maps.json.jbuilder +31 -31
  139. data/app/views/json_ui/garage/views/markdowns.json.jbuilder +41 -41
  140. data/app/views/json_ui/garage/views/misc.json.jbuilder +34 -34
  141. data/app/views/json_ui/garage/views/texts.json.jbuilder +41 -41
  142. data/app/views/layouts/json_ui/renderer.html.erb +35 -35
  143. data/config/routes.rb +7 -7
  144. data/lib/generators/glib/install_generator.rb +24 -24
  145. data/lib/generators/templates/20191017062519_create_texts.rb +12 -12
  146. data/lib/generators/templates/20191024063257_add_scope_to_texts.rb +7 -7
  147. data/lib/generators/templates/20191112095018_add_lang_to_texts.rb +7 -7
  148. data/lib/generators/templates/20191126071051_create_active_storage_tables.active_storage.rb +27 -27
  149. data/lib/generators/templates/database.yml +107 -107
  150. data/lib/generators/templates/dynamic_text.rb +2 -2
  151. data/lib/glib-web.rb +9 -9
  152. data/lib/glib/crypt/utils.rb +26 -26
  153. data/lib/glib/dynamic_text/config.rb +21 -21
  154. data/lib/glib/engine.rb +7 -7
  155. data/lib/glib/json_crawler.rb +11 -11
  156. data/lib/glib/json_crawler/action_crawler.rb +23 -23
  157. data/lib/glib/json_crawler/action_crawlers/action_http.rb +11 -11
  158. data/lib/glib/json_crawler/action_crawlers/forms_submit.rb +48 -48
  159. data/lib/glib/json_crawler/action_crawlers/menu.rb +12 -12
  160. data/lib/glib/json_crawler/action_crawlers/nav_initiate.rb +19 -19
  161. data/lib/glib/json_crawler/action_crawlers/run_multiple.rb +13 -13
  162. data/lib/glib/json_crawler/action_crawlers/windows_open.rb +33 -33
  163. data/lib/glib/json_crawler/coverage.rb +20 -20
  164. data/lib/glib/json_crawler/http.rb +120 -120
  165. data/lib/glib/json_crawler/router.rb +96 -96
  166. data/lib/glib/mailer_tester.rb +36 -36
  167. data/lib/glib/test_helpers.rb +40 -40
  168. data/lib/glib/value.rb +7 -7
  169. data/lib/glib/version.rb +5 -5
  170. data/lib/tasks/db.rake +95 -95
  171. metadata +2 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0b8d44468bb10a4b5bd570d12d233ea3a0057be5e666466575204e7e445de360
4
- data.tar.gz: 3f9d79903871a7a8f59a786c637d42f7e33bba1dfccc8c652544201e9df77ae9
3
+ metadata.gz: be151df878c71087ac47e699e53ce1e6d3f7458f820f2b53a7789ea8afd1ecdf
4
+ data.tar.gz: 58b1a34b76ef8972a4d566913723469a8dffe38c3b30ae1a25d016cede6d5a6a
5
5
  SHA512:
6
- metadata.gz: 5dbedf4e29bc182bce5af77d0c9b392100e030a21fd8ed03dcd56bf1bb2c1c70f3f5d72cda358454e0058a88df16e1a2e83017bf983f42083c57da0f9187f1db
7
- data.tar.gz: 1d80db9408c05b6ce3a2a9356e0aa01aa3f6489276424543996f0f248afe2366b687fc3127c4eda8f3e336d92b3479c88225f619d69df7ed1c9b2c52e1f921db
6
+ metadata.gz: c1523fbe38addf2a78f02c9c5c44a21987cfd7277bec6e9468358dfe45e0fb5f1cfcee6fc309d5ade153694ab114290e4e2b9e4bf93fa0f0e5fb7bb4fbeec281
7
+ data.tar.gz: d12f4bda96c1aa67e6d2fd92dee70adae999bf47e8cbbc962c7f5fff2d07cfcbd200d04287a8d51c297555202e26704a3fa53a8feb2e62503bc3a254f1240d33
@@ -1,61 +1,61 @@
1
- module Glib::Analytics
2
- module Funnel
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- # include Overrides
7
- extend ClassMethods
8
-
9
- helper_method :glib_analytics_feature_segment
10
- helper_method :glib_analytics_feature_referer
11
- helper_method :glib_analytics_included?
12
- end
13
-
14
- # module Overrides
15
-
16
- # # Expose protected method
17
- # public # Override
18
- # def policy_scope(*args)
19
- # super
20
- # end
21
- # end
22
-
23
- def glib_analytics_included?
24
- true
25
- end
26
-
27
- def glib_analytics_feature_segment
28
- # To be overridden
29
- nil
30
- end
31
-
32
- def glib_analytics_feature_referer
33
- group = request.headers['GApp-Analytics-Referer-Group']
34
- action = request.headers['GApp-Analytics-Referer-Action']
35
- segment = request.headers['GApp-Analytics-Referer-Segment']
36
- placement = request.headers['GApp-Analytics-Referer-Placement']
37
-
38
- if group && action
39
- return { group: group, action: action, segment: segment, placement: placement }
40
- end
41
-
42
- nil
43
- end
44
-
45
-
46
-
47
- module ClassMethods
48
- # def glib_auth_inited?
49
- # @@__glib_auth_init ||= false
50
- # end
51
-
52
- # def glib_analytics_init
53
- # @@__glib_analytics_init = true
54
- # end
55
-
56
- # def glib_analytics_inited?
57
- # @@__glib_analytics_init ||= false
58
- # end
59
- end
60
- end
61
- end
1
+ module Glib::Analytics
2
+ module Funnel
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ # include Overrides
7
+ extend ClassMethods
8
+
9
+ helper_method :glib_analytics_feature_segment
10
+ helper_method :glib_analytics_feature_referer
11
+ helper_method :glib_analytics_included?
12
+ end
13
+
14
+ # module Overrides
15
+
16
+ # # Expose protected method
17
+ # public # Override
18
+ # def policy_scope(*args)
19
+ # super
20
+ # end
21
+ # end
22
+
23
+ def glib_analytics_included?
24
+ true
25
+ end
26
+
27
+ def glib_analytics_feature_segment
28
+ # To be overridden
29
+ nil
30
+ end
31
+
32
+ def glib_analytics_feature_referer
33
+ group = request.headers['GApp-Analytics-Referer-Group']
34
+ action = request.headers['GApp-Analytics-Referer-Action']
35
+ segment = request.headers['GApp-Analytics-Referer-Segment']
36
+ placement = request.headers['GApp-Analytics-Referer-Placement']
37
+
38
+ if group && action
39
+ return { group: group, action: action, segment: segment, placement: placement }
40
+ end
41
+
42
+ nil
43
+ end
44
+
45
+
46
+
47
+ module ClassMethods
48
+ # def glib_auth_inited?
49
+ # @@__glib_auth_init ||= false
50
+ # end
51
+
52
+ # def glib_analytics_init
53
+ # @@__glib_analytics_init = true
54
+ # end
55
+
56
+ # def glib_analytics_inited?
57
+ # @@__glib_analytics_init ||= false
58
+ # end
59
+ end
60
+ end
61
+ end
@@ -1,148 +1,148 @@
1
- require 'pundit'
2
-
3
- module Glib::Auth
4
- module Policy
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- include Pundit
9
- include Overrides
10
- extend ClassMethods
11
-
12
- # TODO: Ultimately we want to uncomment this line, but:
13
- # - Need to be able to set aside some time to run rspec tests to ensure nothing gets broken
14
- # - Need to find a solution where we can reuse a single public policy
15
- # after_action :verify_authorized
16
-
17
- helper_method :policy, :can?, :cannot?
18
- end
19
-
20
- module Overrides
21
-
22
- public # Override
23
- def policy(record, policy_name = nil)
24
- policy_name ||= record
25
-
26
- @__pundit_policies ||= {}
27
- return @__pundit_policies[policy_name] if @__pundit_policies[policy_name]
28
-
29
- if policy_name.is_a?(Symbol) && policy_name.to_s.ends_with?('_admin')
30
- policy_class = CommonAdminPolicy
31
- else
32
- policy_class = Pundit::PolicyFinder.new(policy_name).policy
33
- end
34
-
35
- raise "Policy not found for #{policy_name.is_a?(Symbol) || policy_name.is_a?(Class) ? policy_name : policy_name.class}" unless policy_class
36
-
37
- @__pundit_policies[policy_name] = policy_class.new(current_user, record, policy_name, self, request, params, *policy_class.args_builder.call(self))
38
- end
39
-
40
- # Expose protected method
41
- public # Override
42
- def policy_scope(*args)
43
- super
44
- end
45
- end
46
-
47
- private
48
- def raise_access_denied(record, policy)
49
- raise UnauthorizedError.new(record: record, policy: policy, query: "#{action_name}?")
50
- end
51
-
52
- public
53
- def can?(action, record)
54
- policy(record).send("#{action}?")
55
- end
56
-
57
- public
58
- def cannot?(action, record)
59
- !policy(record).send("#{action}?")
60
- end
61
-
62
- # Inspired from https://github.com/ryanb/cancan/wiki/Non-RESTful-Controllers
63
- public
64
- def glib_authorize_resource(*args)
65
- options = args.extract_options!
66
- resource_name = args.first
67
-
68
- resource_name ||= controller_name.split('/').last.singularize
69
-
70
- if (resource_key = options[:class]).nil?
71
- policy_name = resource_name.camelize.constantize
72
- else
73
- policy_name = case resource_key
74
- when false
75
- resource_name.to_sym
76
- when Symbol, Class
77
- resource_key
78
- else
79
- raise "Invalid resource class: #{resource_key}"
80
- end
81
- end
82
-
83
- resource_instance = instance_variable_get("@#{resource_name}") || policy_name
84
-
85
- query = "#{action_name}?"
86
- policy_instance = policy(resource_instance, policy_name)
87
- raise_access_denied(resource_instance, policy_instance) unless policy_instance.public_send(query)
88
- end
89
-
90
-
91
-
92
- class UnauthorizedError < Pundit::NotAuthorizedError
93
- end
94
-
95
-
96
-
97
- module ClassMethods
98
- def glib_auth_init
99
- @@__glib_auth_init = true
100
-
101
- before_action :glib_load_resource
102
- before_action :glib_authorize_resource
103
- end
104
-
105
- def glib_auth_inited?
106
- @@__glib_auth_init ||= false
107
- end
108
-
109
- # TODO: Consider deprecating
110
- public
111
- def authorize_resource(*args)
112
- options = args.extract_options!
113
- resource_name = args.first
114
-
115
- self.before_action(options.slice(:only, :except, :if, :unless)) do |controller|
116
- resource_name ||= resource_name_from_controller
117
-
118
- begin
119
- if !(resource_key = options[:class]).nil?
120
- resource = case resource_key
121
- when false
122
- resource_name.to_sym
123
- when Symbol, Class
124
- resource_key
125
- else
126
- raise "Invalid resource class: #{resource_key}"
127
- end
128
-
129
- authorize resource
130
- elsif (resource_instance = controller.instance_variable_get("@#{resource_name}"))
131
- authorize resource_instance
132
- else
133
- authorize resource_name.camelize.constantize
134
- end
135
- rescue Pundit::NotAuthorizedError => e
136
- raise_access_denied(e.record, e.policy)
137
- end
138
-
139
- verify_authorized
140
- end
141
- end
142
- end
143
-
144
- def resource_name_from_controller
145
- params[:controller].split('/').last.singularize
146
- end
147
- end
148
- end
1
+ require 'pundit'
2
+
3
+ module Glib::Auth
4
+ module Policy
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include Pundit
9
+ include Overrides
10
+ extend ClassMethods
11
+
12
+ # TODO: Ultimately we want to uncomment this line, but:
13
+ # - Need to be able to set aside some time to run rspec tests to ensure nothing gets broken
14
+ # - Need to find a solution where we can reuse a single public policy
15
+ # after_action :verify_authorized
16
+
17
+ helper_method :policy, :can?, :cannot?
18
+ end
19
+
20
+ module Overrides
21
+
22
+ public # Override
23
+ def policy(record, policy_name = nil)
24
+ policy_name ||= record
25
+
26
+ @__pundit_policies ||= {}
27
+ return @__pundit_policies[policy_name] if @__pundit_policies[policy_name]
28
+
29
+ if policy_name.is_a?(Symbol) && policy_name.to_s.ends_with?('_admin')
30
+ policy_class = CommonAdminPolicy
31
+ else
32
+ policy_class = Pundit::PolicyFinder.new(policy_name).policy
33
+ end
34
+
35
+ raise "Policy not found for #{policy_name.is_a?(Symbol) || policy_name.is_a?(Class) ? policy_name : policy_name.class}" unless policy_class
36
+
37
+ @__pundit_policies[policy_name] = policy_class.new(current_user, record, policy_name, self, request, params, *policy_class.args_builder.call(self))
38
+ end
39
+
40
+ # Expose protected method
41
+ public # Override
42
+ def policy_scope(*args)
43
+ super
44
+ end
45
+ end
46
+
47
+ private
48
+ def raise_access_denied(record, policy)
49
+ raise UnauthorizedError.new(record: record, policy: policy, query: "#{action_name}?")
50
+ end
51
+
52
+ public
53
+ def can?(action, record)
54
+ policy(record).send("#{action}?")
55
+ end
56
+
57
+ public
58
+ def cannot?(action, record)
59
+ !policy(record).send("#{action}?")
60
+ end
61
+
62
+ # Inspired from https://github.com/ryanb/cancan/wiki/Non-RESTful-Controllers
63
+ public
64
+ def glib_authorize_resource(*args)
65
+ options = args.extract_options!
66
+ resource_name = args.first
67
+
68
+ resource_name ||= controller_name.split('/').last.singularize
69
+
70
+ if (resource_key = options[:class]).nil?
71
+ policy_name = resource_name.camelize.constantize
72
+ else
73
+ policy_name = case resource_key
74
+ when false
75
+ resource_name.to_sym
76
+ when Symbol, Class
77
+ resource_key
78
+ else
79
+ raise "Invalid resource class: #{resource_key}"
80
+ end
81
+ end
82
+
83
+ resource_instance = instance_variable_get("@#{resource_name}") || policy_name
84
+
85
+ query = "#{action_name}?"
86
+ policy_instance = policy(resource_instance, policy_name)
87
+ raise_access_denied(resource_instance, policy_instance) unless policy_instance.public_send(query)
88
+ end
89
+
90
+
91
+
92
+ class UnauthorizedError < Pundit::NotAuthorizedError
93
+ end
94
+
95
+
96
+
97
+ module ClassMethods
98
+ def glib_auth_init
99
+ @@__glib_auth_init = true
100
+
101
+ before_action :glib_load_resource
102
+ before_action :glib_authorize_resource
103
+ end
104
+
105
+ def glib_auth_inited?
106
+ @@__glib_auth_init ||= false
107
+ end
108
+
109
+ # TODO: Consider deprecating
110
+ public
111
+ def authorize_resource(*args)
112
+ options = args.extract_options!
113
+ resource_name = args.first
114
+
115
+ self.before_action(options.slice(:only, :except, :if, :unless)) do |controller|
116
+ resource_name ||= resource_name_from_controller
117
+
118
+ begin
119
+ if !(resource_key = options[:class]).nil?
120
+ resource = case resource_key
121
+ when false
122
+ resource_name.to_sym
123
+ when Symbol, Class
124
+ resource_key
125
+ else
126
+ raise "Invalid resource class: #{resource_key}"
127
+ end
128
+
129
+ authorize resource
130
+ elsif (resource_instance = controller.instance_variable_get("@#{resource_name}"))
131
+ authorize resource_instance
132
+ else
133
+ authorize resource_name.camelize.constantize
134
+ end
135
+ rescue Pundit::NotAuthorizedError => e
136
+ raise_access_denied(e.record, e.policy)
137
+ end
138
+
139
+ verify_authorized
140
+ end
141
+ end
142
+ end
143
+
144
+ def resource_name_from_controller
145
+ params[:controller].split('/').last.singularize
146
+ end
147
+ end
148
+ end
@@ -1,126 +1,126 @@
1
- module Glib::Json::DynamicText
2
- def __json_traversal_register_dynamic_text
3
- @__specs = {}
4
- @__specs_db = {}
5
-
6
- __json_traversal_on_traverse do |view|
7
- extract_spec(view, 'text')
8
- end
9
-
10
- __json_traversal_on_complete do |view|
11
- if @__specs.keys.size > 0
12
- translated_texts = retrieve_texts(@__specs.keys)
13
- # translated_texts = retrieve_local_texts(@__specs.keys).merge(retrieve_remote_texts(@__specs.keys))
14
- translated_texts.each do |key, value|
15
- @__specs[key].each do |spec|
16
- spec.substitute_with(value)
17
- end
18
-
19
- if @__specs_db[key] && @__specs_db[key].images.attached?
20
- @__specs[key].each do |spec|
21
- spec.substitute_image_with(@__specs_db[key].images)
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end
28
-
29
- def retrieve_texts
30
- # TODO: Check local memory
31
- # TODO: Then check DTR
32
- end
33
-
34
- # def retrieve_remote_texts(keys)
35
- # retries = 0
36
-
37
- # begin
38
- # response = RestClient.get(ENV['DTR_URL'], { params: { keys: keys } })
39
- # rescue Errno::ECONNREFUSED, RestClient::InternalServerError, RestClient::Exceptions::OpenTimeout, RestClient::Exceptions::ReadTimeout
40
- # if (retries += 1) <= 3
41
- # puts "Timeout, retrying..."
42
- # retry
43
- # else
44
- # raise
45
- # end
46
- # end
47
-
48
- # JSON.parse(response)
49
- # end
50
-
51
- # def retrieve_local_texts(keys)
52
- # translated_texts = {}
53
- # db_keys = []
54
-
55
- # redis = Glib::DynamicText::Config.redis
56
- # contents = redis.pipelined do
57
- # keys.each do |key|
58
- # args = @__specs[key].first.args
59
- # options = {
60
- # scope: args.fetch(:scope, 'itinerarybuilder'),
61
- # lang: args.fetch(:lang, 'en')
62
- # }
63
-
64
- # scope_key = "#{options[:scope]}.#{options[:lang]}.#{key}"
65
- # redis.get(scope_key)
66
- # end
67
- # end
68
-
69
- # keys.each_with_index do |key, index|
70
- # if content = contents[index]
71
- # translated_texts[key] = content
72
- # db_keys << key if content.match(/\{\{image(\d)\}\}/)
73
- # else
74
- # db_keys << key
75
- # end
76
- # end
77
-
78
- # if db_keys.size > 0
79
- # texts = Glib::Text.where(key: db_keys)
80
- # texts.each do |text|
81
- # translated_texts[text.key] = text.content
82
- # @__specs_db[text.key] = text
83
- # end
84
- # end
85
-
86
- # translated_texts
87
- # end
88
-
89
- def extract_spec(view, prop)
90
- if (spec = view[prop])
91
- if spec.is_a?(Hash) && (key = spec['dt_key'])
92
- @__specs[key] ||= []
93
- @__specs[key] << TextSpec.new(view, prop, spec)
94
- end
95
- end
96
- end
97
-
98
- TextSpec = Struct.new(:view, :prop, :args) do
99
- def substitute_with(text)
100
- view[prop] = text.gsub(/\{\{(\w+)\}\}/) { args.fetch($1, "{{#{$1}}}") }
101
- end
102
-
103
- def substitute_image_with(images)
104
- view[prop] = view[prop].gsub(/\{\{image(\d)\}\}/) {
105
- if image = images[$1.to_i - 1]
106
- image_server_url(image.blob.key)
107
- else
108
- "{{image#{$1}}}"
109
- end
110
- }
111
- end
112
-
113
- # TODO: Reuse method from DynamicTextsHelper
114
- def image_server_url(blob_key)
115
- return unless blob_key.present?
116
-
117
- uri = URI::HTTPS.build(
118
- host: 'imageserver-demo.herokuapp.com',
119
- path: "/image/#{ENV['AWS_S3_BUCKET']}/#{blob_key}",
120
- query: { w: 100, h: 100 }.to_param
121
- )
122
-
123
- uri.to_s
124
- end
125
- end
126
- end
1
+ module Glib::Json::DynamicText
2
+ def __json_traversal_register_dynamic_text
3
+ @__specs = {}
4
+ @__specs_db = {}
5
+
6
+ __json_traversal_on_traverse do |view|
7
+ extract_spec(view, 'text')
8
+ end
9
+
10
+ __json_traversal_on_complete do |view|
11
+ if @__specs.keys.size > 0
12
+ translated_texts = retrieve_texts(@__specs.keys)
13
+ # translated_texts = retrieve_local_texts(@__specs.keys).merge(retrieve_remote_texts(@__specs.keys))
14
+ translated_texts.each do |key, value|
15
+ @__specs[key].each do |spec|
16
+ spec.substitute_with(value)
17
+ end
18
+
19
+ if @__specs_db[key] && @__specs_db[key].images.attached?
20
+ @__specs[key].each do |spec|
21
+ spec.substitute_image_with(@__specs_db[key].images)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def retrieve_texts
30
+ # TODO: Check local memory
31
+ # TODO: Then check DTR
32
+ end
33
+
34
+ # def retrieve_remote_texts(keys)
35
+ # retries = 0
36
+
37
+ # begin
38
+ # response = RestClient.get(ENV['DTR_URL'], { params: { keys: keys } })
39
+ # rescue Errno::ECONNREFUSED, RestClient::InternalServerError, RestClient::Exceptions::OpenTimeout, RestClient::Exceptions::ReadTimeout
40
+ # if (retries += 1) <= 3
41
+ # puts "Timeout, retrying..."
42
+ # retry
43
+ # else
44
+ # raise
45
+ # end
46
+ # end
47
+
48
+ # JSON.parse(response)
49
+ # end
50
+
51
+ # def retrieve_local_texts(keys)
52
+ # translated_texts = {}
53
+ # db_keys = []
54
+
55
+ # redis = Glib::DynamicText::Config.redis
56
+ # contents = redis.pipelined do
57
+ # keys.each do |key|
58
+ # args = @__specs[key].first.args
59
+ # options = {
60
+ # scope: args.fetch(:scope, 'itinerarybuilder'),
61
+ # lang: args.fetch(:lang, 'en')
62
+ # }
63
+
64
+ # scope_key = "#{options[:scope]}.#{options[:lang]}.#{key}"
65
+ # redis.get(scope_key)
66
+ # end
67
+ # end
68
+
69
+ # keys.each_with_index do |key, index|
70
+ # if content = contents[index]
71
+ # translated_texts[key] = content
72
+ # db_keys << key if content.match(/\{\{image(\d)\}\}/)
73
+ # else
74
+ # db_keys << key
75
+ # end
76
+ # end
77
+
78
+ # if db_keys.size > 0
79
+ # texts = Glib::Text.where(key: db_keys)
80
+ # texts.each do |text|
81
+ # translated_texts[text.key] = text.content
82
+ # @__specs_db[text.key] = text
83
+ # end
84
+ # end
85
+
86
+ # translated_texts
87
+ # end
88
+
89
+ def extract_spec(view, prop)
90
+ if (spec = view[prop])
91
+ if spec.is_a?(Hash) && (key = spec['dt_key'])
92
+ @__specs[key] ||= []
93
+ @__specs[key] << TextSpec.new(view, prop, spec)
94
+ end
95
+ end
96
+ end
97
+
98
+ TextSpec = Struct.new(:view, :prop, :args) do
99
+ def substitute_with(text)
100
+ view[prop] = text.gsub(/\{\{(\w+)\}\}/) { args.fetch($1, "{{#{$1}}}") }
101
+ end
102
+
103
+ def substitute_image_with(images)
104
+ view[prop] = view[prop].gsub(/\{\{image(\d)\}\}/) {
105
+ if image = images[$1.to_i - 1]
106
+ image_server_url(image.blob.key)
107
+ else
108
+ "{{image#{$1}}}"
109
+ end
110
+ }
111
+ end
112
+
113
+ # TODO: Reuse method from DynamicTextsHelper
114
+ def image_server_url(blob_key)
115
+ return unless blob_key.present?
116
+
117
+ uri = URI::HTTPS.build(
118
+ host: 'imageserver-demo.herokuapp.com',
119
+ path: "/image/#{ENV['AWS_S3_BUCKET']}/#{blob_key}",
120
+ query: { w: 100, h: 100 }.to_param
121
+ )
122
+
123
+ uri.to_s
124
+ end
125
+ end
126
+ end