glib-web 4.20.0 → 4.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/glib/json/new_dynamic_text.rb +0 -0
  3. data/app/helpers/glib/app_feature_support_helper.rb +0 -0
  4. data/app/helpers/glib/dynamic_texts_helper.rb +0 -0
  5. data/app/helpers/glib/json_ui/action_builder/fields.rb +6 -1
  6. data/app/helpers/glib/json_ui/analytics_helper.rb +0 -0
  7. data/app/helpers/glib/json_ui/generic_builders.rb +0 -0
  8. data/app/models/glib/active_storage/attachment.rb +0 -0
  9. data/app/models/glib/active_storage/blob.rb +0 -0
  10. data/app/models/glib/dynamic_text_record.rb +0 -0
  11. data/app/models/glib/text.rb +0 -0
  12. data/app/validators/email_typo_validator.rb +0 -0
  13. data/app/validators/email_validator.rb +0 -0
  14. data/app/validators/url_validator.rb +0 -0
  15. data/app/views/json_ui/garage/actions/dialogs_oauth_post.json.jbuilder +0 -0
  16. data/app/views/json_ui/garage/forms/bulk_edit_post.json.jbuilder +0 -0
  17. data/app/views/json_ui/garage/forms/dynamic_group.json.jbuilder +50 -18
  18. data/app/views/json_ui/garage/forms/generic_post.json.jbuilder +0 -0
  19. data/app/views/json_ui/garage/forms/submission_flow.json.jbuilder +0 -0
  20. data/app/views/json_ui/garage/forms/submission_flow_post.json.jbuilder +0 -0
  21. data/app/views/json_ui/garage/forms/submission_indicator.json.jbuilder +0 -0
  22. data/app/views/json_ui/garage/forms/submission_indicator_post.json.jbuilder +0 -0
  23. data/app/views/json_ui/garage/home/blank.json.jbuilder +0 -0
  24. data/app/views/json_ui/garage/home/slow.json.jbuilder +0 -0
  25. data/app/views/json_ui/garage/lists/autoload_all.json.jbuilder +0 -0
  26. data/app/views/json_ui/garage/lists/autoload_as_needed.json.jbuilder +0 -0
  27. data/app/views/json_ui/garage/lists/chat_ui.json.jbuilder +0 -0
  28. data/app/views/json_ui/garage/lists/fab.json.jbuilder +0 -0
  29. data/app/views/json_ui/garage/notifications/web_socket.json.jbuilder +0 -0
  30. data/app/views/json_ui/garage/pages/custom_style_class.json.jbuilder +0 -0
  31. data/app/views/json_ui/garage/pages/full_width.json.jbuilder +0 -0
  32. data/app/views/json_ui/garage/pages/full_width_height.json.jbuilder +0 -0
  33. data/app/views/json_ui/garage/pages/layout.json.jbuilder +0 -0
  34. data/app/views/json_ui/garage/pages/loading_indicator.json.jbuilder +0 -0
  35. data/app/views/json_ui/garage/pages/nested_scroll.json.jbuilder +0 -0
  36. data/app/views/json_ui/garage/pages/redirect_onload.json.jbuilder +0 -0
  37. data/app/views/json_ui/garage/panels/_styled.json.jbuilder +0 -0
  38. data/app/views/json_ui/garage/panels/card.json.jbuilder +0 -0
  39. data/app/views/json_ui/garage/panels/custom.json.jbuilder +0 -0
  40. data/app/views/json_ui/garage/panels/outlined.json.jbuilder +0 -0
  41. data/app/views/json_ui/garage/services/dynamic_text.json.jbuilder +0 -0
  42. data/app/views/json_ui/garage/services/image.json.jbuilder +0 -0
  43. data/app/views/json_ui/garage/services/index.json.jbuilder +0 -0
  44. data/app/views/json_ui/garage/tables/_autoload_section.json.jbuilder +0 -0
  45. data/app/views/json_ui/garage/tables/autoload_all.json.jbuilder +0 -0
  46. data/app/views/json_ui/garage/tables/autoload_as_needed.json.jbuilder +0 -0
  47. data/app/views/json_ui/garage/tables/export_import.json.jbuilder +0 -0
  48. data/app/views/json_ui/garage/tables/pagination.json.jbuilder +3 -3
  49. data/app/views/json_ui/garage/test_page/form.json.jbuilder +16 -0
  50. data/app/views/json_ui/garage/test_page/form_dynamic.json.jbuilder +20 -20
  51. data/app/views/json_ui/garage/views/calendar_data.json.jbuilder +0 -0
  52. data/app/views/json_ui/garage/views/controls.json.jbuilder +13 -3
  53. data/app/views/json_ui/garage/views/map_data.json.jbuilder +0 -0
  54. data/app/views/json_ui/garage/views/multimedia.json.jbuilder +0 -0
  55. data/app/views/layouts/json_ui/no_custom.html.erb +0 -0
  56. data/lib/generators/glib/install_generator.rb +0 -0
  57. data/lib/generators/templates/20191017062519_create_texts.rb +0 -0
  58. data/lib/generators/templates/20191024063257_add_scope_to_texts.rb +0 -0
  59. data/lib/generators/templates/20191112095018_add_lang_to_texts.rb +0 -0
  60. data/lib/generators/templates/20191126071051_create_active_storage_tables.active_storage.rb +0 -0
  61. data/lib/generators/templates/database.yml +0 -0
  62. data/lib/generators/templates/dynamic_text.rb +0 -0
  63. data/lib/glib/dynamic_text/config.rb +0 -0
  64. data/lib/glib/dynamic_text.rb +0 -0
  65. data/lib/glib/json_crawler/action_crawler.rb +0 -0
  66. data/lib/glib/json_crawler/action_crawlers/action_http.rb +0 -0
  67. data/lib/glib/json_crawler/action_crawlers/dialogs_alert.rb +0 -0
  68. data/lib/glib/json_crawler/action_crawlers/menu.rb +0 -0
  69. data/lib/glib/json_crawler/action_crawlers/run_multiple.rb +0 -0
  70. data/lib/glib/json_crawler/action_crawlers/windows_open.rb +0 -0
  71. data/lib/glib/json_crawler/coverage.rb +0 -0
  72. data/lib/glib/value.rb +0 -0
  73. data/lib/glib/version.rb +0 -0
  74. metadata +2 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 68c288de9bf1bf340b92dfd31c6559da13ee0cb6030b907cbd6a86828c989313
4
- data.tar.gz: 835b1a957ff4c0c72bff64bf9129219c1b806e2a1427bd043c36d1393c1c3c12
3
+ metadata.gz: d78202b475738a29ed66ed9ab23374b4ccebdbd9d58554e60273d41fa99acf8a
4
+ data.tar.gz: b51e17878e5274b4955a2784a8c28f1fd739668ecea83a216b73380f4aa75d48
5
5
  SHA512:
6
- metadata.gz: ff195da76449fe7a87dfa795e5a7434da1b32692f4d7535e979558bd4b2869648ca27b522af95809a2a72950a77d735f0ec4bcdaf34bebdbd574e2ecc0497827
7
- data.tar.gz: d5a35ec75ffe680c2f34483fab42c60ef2c2eaf02f8ce83b07080b24f9dd0a204c83565a293a971e79f18aa660b70b485b4d04d0a453efe425ca968b2c282fec
6
+ metadata.gz: a70cb51681f41ee739ff26fc4551b85ed5a7518267d9c911fcc0c5822261a7b0daa51bf25eab87868fba4206567355448cea1bf241bca10a903b3f6b2d603259
7
+ data.tar.gz: dfa00b2574d73744bf31643d1e71db360772c79eebae88e2e1bc6ce9c6fae18a999f0caee5756dba83b5081f698a52753693a5300e6ca9d0e80709281be795fe
File without changes
File without changes
@@ -14,10 +14,15 @@ class Glib::JsonUi::ActionBuilder
14
14
  action :onReset
15
15
  end
16
16
 
17
-
17
+ # deprecated
18
18
  class GetDynamicGroupEntryValues < Action
19
19
  array :names
20
20
  action :onGet
21
21
  end
22
+
23
+ class GetValues < Action
24
+ hash :fieldNames
25
+ action :onGet
26
+ end
22
27
  end
23
28
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -30,8 +30,8 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
30
30
  template.fields_hidden name: 'error_message'
31
31
  template.fields_text width: 'matchParent', name: 'question', label: 'Question', placeholder: 'Question'
32
32
 
33
- form.panels_responsive id: 'responsive_{{entry_index}}', childViews: ->(column) do
34
- options = [:rating, :yes_no, :choices]
33
+ form.panels_responsive id: 'responsive_{{entryIndex}}', childViews: ->(column) do
34
+ options = [:rating, :yes_no, :choices, :unspecified]
35
35
  template.fields_select \
36
36
  width: 'matchParent',
37
37
  name: 'type',
@@ -41,16 +41,48 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
41
41
  options: options.map { |o| { text: o.to_s.humanize, value: o } },
42
42
  onChangeAndLoad: ->(action) do
43
43
  action.runMultiple childActions: ->(multiple) do
44
+ multiple.fields_getValues \
45
+ fieldNames: {
46
+ '{{entryPrefix}}[type]' => nil,
47
+ '{{entryPrefix}}[question]' => 'question'
48
+ },
49
+ onGet: ->(get) do
50
+ # get.snackbars_alert paramName: 'message', fieldName: 'entry-{{entryIndex}}'
51
+
52
+ get.http_get \
53
+ fieldName: 'entry',
54
+ url: json_ui_garage_current_url(entry: {
55
+ index: '{{entryIndex}}'
56
+ }).gsub('%7B%7B', '{{').gsub('%7D%7D', '}}') # manually change url because rails escape {{entryIndex}}
57
+ end
58
+
59
+ # multiple.logics_run \
60
+ # condition: { "==": [{ "var": "user[evaluation][{{entryIndex}}][type]" }, 'unspecified'] },
61
+ # onTrue: ->(subaction) do
62
+ # subaction.dialogs_alert message: 'Please select a valid type'
63
+ # end
64
+
65
+ # multiple.logics_run \
66
+ # condition: { "==": [{ "var": "[{{entryIndex}}][type]" }, 'unspecified'] },
67
+ # onTrue: ->(subaction) do
68
+ # subaction.dialogs_alert message: 'Please select a valid type'
69
+ # end
70
+
71
+ multiple.logics_run \
72
+ condition: { "==": [{ "var": '{{entryPrefix}}[type]' }, 'unspecified'] },
73
+ onTrue: ->(subaction) do
74
+ subaction.dialogs_alert message: 'Please select a valid type'
75
+ end
76
+
44
77
  multiple.logics_set \
45
- cacheData: true, # This is so that the the new data is retained when the `dynamicGroup` gets re-rendered.
46
78
  debug: true,
47
- targetId: 'responsive_{{entry_index}}', dataBuilder: ->(set) do
79
+ targetId: 'responsive_{{entryIndex}}', dataBuilder: ->(set) do
48
80
  set.panels_responsive width: 'matchParent', accessory: ->(accessory) do
49
81
  accessory.footer childViews: ->(footer) do
50
82
  footer.fields_check \
51
83
  width: 'matchParent',
52
- id: 'check_{{entry_index}}',
53
- name: 'enabled',
84
+ id: 'check_{{entryIndex}}',
85
+ name: '{{entryPrefix}}[enabled]',
54
86
  label: 'Enable',
55
87
  checkValue: true
56
88
 
@@ -63,20 +95,20 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
63
95
  end
64
96
  end, onSet: ->(subaction) do
65
97
  subaction.logics_set \
66
- targetId: 'check_{{entry_index}}',
98
+ targetId: 'check_{{entryIndex}}',
67
99
  conditionalData: {
68
100
  value: {
69
- "==": [{ "var": 'user[evaluation][{{entry_index}}][type]' }, 'rating']
101
+ "==": [{ "var": 'user[evaluation][{{entryIndex}}][type]' }, 'rating']
70
102
  }
71
103
  }
72
104
  end
73
105
 
74
106
  multiple.logics_set \
75
- targetId: 'choices_panel_{{entry_index}}',
107
+ targetId: 'choices_panel_{{entryIndex}}',
76
108
  debug: true,
77
109
  conditionalData: {
78
110
  displayed: {
79
- "==": [{ "var": 'user[evaluation][{{entry_index}}][type]' }, 'choices']
111
+ "==": [{ "var": 'user[evaluation][{{entryIndex}}][type]' }, 'choices']
80
112
  }
81
113
  }
82
114
  end
@@ -88,29 +120,29 @@ page.form url: json_ui_garage_url(path: 'forms/generic_post'), method: 'post', p
88
120
  end
89
121
 
90
122
  template.icon \
91
- id: 'error_icon_{{entry_index}}',
123
+ id: 'error_icon_{{entryIndex}}',
92
124
  name: 'error',
93
125
  onLoad: ->(action) do
94
- action.logics_set debug: true, targetId: 'error_icon_{{entry_index}}', conditionalData: {
126
+ action.logics_set debug: true, targetId: 'error_icon_{{entryIndex}}', conditionalData: {
95
127
  displayed: {
96
128
  "!!": [
97
- { 'var': '{{entry_prefix}}[error_message]' }
129
+ { 'var': '{{entryPrefix}}[error_message]' }
98
130
  ]
99
131
  },
100
- 'tooltip.text': { 'var': '{{entry_prefix}}[error_message]' }
132
+ 'tooltip.text': { 'var': '{{entryPrefix}}[error_message]' }
101
133
  }
102
134
  end
103
- template.panels_vertical id: 'choices_panel_{{entry_index}}', childViews: ->(vertical) do
135
+ template.panels_vertical id: 'choices_panel_{{entryIndex}}', childViews: ->(vertical) do
104
136
  (1..5).each do |i|
105
137
  vertical.fields_text \
106
- id: "input_choice_{{entry_index}}_#{i}",
138
+ id: "input_choice_{{entryIndex}}_#{i}",
107
139
  width: 'matchParent',
108
140
  name: "choices_#{i}",
109
141
  label: "Choice #{i}",
110
142
  displayed: i <= 1,
111
143
  onChange: ->(action) do
112
- action.logics_set targetId: "input_choice_{{entry_index}}_#{i + 1}", conditionalData: {
113
- displayed: { "isPresent": [{ "var": "user[evaluation][{{entry_index}}][choices_#{i}]" }] }
144
+ action.logics_set targetId: "input_choice_{{entryIndex}}_#{i + 1}", conditionalData: {
145
+ displayed: { "isPresent": [{ "var": "user[evaluation][{{entryIndex}}][choices_#{i}]" }] }
114
146
  }
115
147
  end
116
148
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -9,10 +9,10 @@ per_page = 20
9
9
  page_index = params[:page]&.to_i || 1
10
10
 
11
11
  page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
12
- scroll.panels_table firstSection: ->(section) do
12
+ scroll.panels_table key: params[:page], firstSection: ->(section) do
13
13
  section.header cellViews: ->(header) do
14
- header.label text: "Name"
15
- header.label text: "Status"
14
+ header.label text: 'Name'
15
+ header.label text: 'Status'
16
16
  end
17
17
 
18
18
  items = (1..per_page).map do |index|
@@ -118,6 +118,22 @@ page.body childViews: ->(body) do
118
118
 
119
119
  form.fields_textarea width: 'matchParent', name: 'user[textarea]', id: 'textarea', value: 'Lorem ipsum et dumet bla bla bla...'
120
120
 
121
+ form.hr width: 'matchParent'
122
+
123
+ form.hr width: 'matchParent'
124
+
125
+ form.fields_check label: 'show nested panel', name: 'not_user[nested_panel]', checkValue: true, onChange: ->(action) do
126
+ action.logics_set targetId: 'nested_panel', conditionalData: { displayed: { "var": 'not_user[nested_panel]' } }
127
+ end
128
+ form.panels_responsive backgroundColor: '#FF0000', padding: { all: 8 }, displayed: false, id: 'nested_panel', width: 'matchParent', childViews: ->(xres) do
129
+ xres.panels_horizontal backgroundColor: '#00FF00', padding: { all: 8 }, width: 'matchParent', childViews: ->(ver) do
130
+ ver.panels_vertical width: 'matchParent', childViews: ->(hori) do
131
+ hori.fields_text width: 300, name: 'user[should_not_submitted]', value: ''
132
+ end
133
+ end
134
+ end
135
+ form.fields_text width: 300, name: 'user[should_submitted]', displayed: false, value: 'Should be submitted even if not visible', submitWhenNotDisplayed: true
136
+
121
137
  form.hr width: 'matchParent'
122
138
  form.fields_submit text: 'submit'
123
139
  form.spacer height: 2
@@ -36,7 +36,7 @@ page.body childViews: ->(body) do
36
36
  template.fields_hidden name: 'error_message'
37
37
  template.fields_text width: 'matchParent', name: 'question', label: 'Question', placeholder: 'Question', styleClass: 'question'
38
38
 
39
- form.panels_responsive id: 'responsive_{{entry_index}}', childViews: ->(column) do
39
+ form.panels_responsive id: 'responsive_{{entryIndex}}', childViews: ->(column) do
40
40
  options = [:rating, :yes_no, :choices]
41
41
  template.fields_select \
42
42
  width: 'matchParent',
@@ -48,16 +48,17 @@ page.body childViews: ->(body) do
48
48
  options: options.map { |o| { text: o.to_s.humanize, value: o } },
49
49
  onChangeAndLoad: ->(action) do
50
50
  action.runMultiple childActions: ->(multiple) do
51
+ multiple.fields_getValues fieldNames: { '{{entryPrefix}}[type]' => nil, '{{entryPrefix}}[question]' => nil }, onGet: ->(get) do
52
+ get.snackbars_alert paramName: 'message', fieldName: 'entry-{{entryIndex}}'
53
+ end
51
54
  multiple.logics_set \
52
- cacheData: true, # This is so that the the new data is retained when the `dynamicGroup` gets re-rendered.
53
- debug: true,
54
- targetId: 'responsive_{{entry_index}}', dataBuilder: ->(set) do
55
+ targetId: 'responsive_{{entryIndex}}', dataBuilder: ->(set) do
55
56
  set.panels_responsive width: 'matchParent', accessory: ->(accessory) do
56
57
  accessory.footer childViews: ->(footer) do
57
58
  footer.fields_check \
58
59
  width: 'matchParent',
59
- id: 'check_{{entry_index}}',
60
- name: 'enabled',
60
+ id: 'check_{{entryIndex}}',
61
+ name: '{{entryPrefix}}[enabled]',
61
62
  label: 'Enable',
62
63
  styleClass: 'enable',
63
64
  checkValue: true
@@ -71,20 +72,19 @@ page.body childViews: ->(body) do
71
72
  end
72
73
  end, onSet: ->(subaction) do
73
74
  subaction.logics_set \
74
- targetId: 'check_{{entry_index}}',
75
+ targetId: 'check_{{entryIndex}}',
75
76
  conditionalData: {
76
77
  value: {
77
- "==": [{ "var": 'user[evaluation][{{entry_index}}][type]' }, 'rating']
78
+ "==": [{ "var": 'user[evaluation][{{entryIndex}}][type]' }, 'rating']
78
79
  }
79
80
  }
80
81
  end
81
82
 
82
83
  multiple.logics_set \
83
- targetId: 'choices_panel_{{entry_index}}',
84
- debug: true,
84
+ targetId: 'choices_panel_{{entryIndex}}',
85
85
  conditionalData: {
86
86
  displayed: {
87
- "==": [{ "var": 'user[evaluation][{{entry_index}}][type]' }, 'choices']
87
+ "==": [{ "var": 'user[evaluation][{{entryIndex}}][type]' }, 'choices']
88
88
  }
89
89
  }
90
90
  end
@@ -96,29 +96,29 @@ page.body childViews: ->(body) do
96
96
  end
97
97
 
98
98
  template.icon \
99
- id: 'error_icon_{{entry_index}}',
99
+ id: 'error_icon_{{entryIndex}}',
100
100
  name: 'error',
101
101
  onLoad: ->(action) do
102
- action.logics_set debug: true, targetId: 'error_icon_{{entry_index}}', conditionalData: {
102
+ action.logics_set targetId: 'error_icon_{{entryIndex}}', conditionalData: {
103
103
  displayed: {
104
104
  "!!": [
105
- { 'var': '{{entry_prefix}}[error_message]' }
105
+ { 'var': '{{entryPrefix}}[error_message]' }
106
106
  ]
107
107
  },
108
- 'tooltip.text': { 'var': '{{entry_prefix}}[error_message]' }
108
+ 'tooltip.text': { 'var': '{{entryPrefix}}[error_message]' }
109
109
  }
110
110
  end
111
- template.panels_vertical id: 'choices_panel_{{entry_index}}', childViews: ->(vertical) do
111
+ template.panels_vertical id: 'choices_panel_{{entryIndex}}', childViews: ->(vertical) do
112
112
  (1..5).each do |i|
113
113
  vertical.fields_text \
114
- id: "input_choice_{{entry_index}}_#{i}",
114
+ id: "input_choice_{{entryIndex}}_#{i}",
115
115
  width: 'matchParent',
116
- name: "choices_#{i}",
116
+ name: "[choices][#{i}]",
117
117
  label: "Choice #{i}",
118
118
  displayed: i <= 1,
119
119
  onChange: ->(action) do
120
- action.logics_set targetId: "input_choice_{{entry_index}}_#{i + 1}", conditionalData: {
121
- displayed: { "isPresent": [{ "var": "user[evaluation][{{entry_index}}][choices_#{i}]" }] }
120
+ action.logics_set targetId: "input_choice_{{entryIndex}}_#{i + 1}", conditionalData: {
121
+ displayed: { "isPresent": [{ "var": "{{entryPrefix}}[choices][#{i}]" }] }
122
122
  }
123
123
  end
124
124
  end
@@ -63,12 +63,12 @@ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
63
63
  onClick: ->(action) do
64
64
  action.popovers_show \
65
65
  key: 'menu2',
66
- placement: 'bottom-start',
66
+ placement: 'right-start',
67
67
  width: 200,
68
68
  content: ->(dialog) do
69
69
  dialog.body styleClass: 'popover-menu', padding: glib_json_padding_body, childViews: ->(res) do
70
70
  res.label text: 'Item 1', styleClass: 'popover-menu-item', onClick: ->(saction) do
71
- saction.popovers_close key: 'menu2'
71
+ saction.windows_open url: json_ui_garage_url(path: 'pages/index')
72
72
  end
73
73
  res.label text: 'Item 2', styleClass: 'popover-menu-item', onClick: ->(saction) do
74
74
  saction.popovers_close key: 'menu2'
@@ -92,7 +92,17 @@ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
92
92
  icon: 'info',
93
93
  styleClasses: ['icon', 'text'],
94
94
  onClick: ->(action) do
95
- action.dialogs_alert message: 'Perform action'
95
+ # action.dialogs_alert message: 'Perform action'
96
+ action.popovers_show \
97
+ key: 'menu2',
98
+ placement: 'bottom-start',
99
+ width: 200,
100
+ persistent: true,
101
+ content: ->(dialog) do
102
+ dialog.body styleClass: 'popover-menu', padding: glib_json_padding_body, childViews: ->(res) do
103
+ res.label text: 'This is a persistent popover'
104
+ end
105
+ end
96
106
  end
97
107
 
98
108
  scroll.spacer height: 20
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
data/lib/glib/value.rb CHANGED
File without changes
data/lib/glib/version.rb CHANGED
File without changes
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: 4.20.0
4
+ version: 4.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ''
@@ -408,8 +408,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
408
408
  - !ruby/object:Gem::Version
409
409
  version: '0'
410
410
  requirements: []
411
- rubyforge_project:
412
- rubygems_version: 2.7.6
411
+ rubygems_version: 3.4.6
413
412
  signing_key:
414
413
  specification_version: 4
415
414
  summary: ''