formula 1.1.1 → 2.0.0
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 +5 -5
- data/Gemfile +11 -0
- data/README.md +71 -0
- data/bin/rubocop +8 -0
- data/bin/test +5 -0
- data/lib/formula/config.rb +136 -0
- data/lib/formula/form_builder.rb +351 -0
- data/lib/formula/form_helper.rb +49 -0
- data/lib/formula/railtie.rb +3 -2
- data/lib/formula/version.rb +3 -1
- data/lib/formula.rb +12 -495
- metadata +37 -17
- data/LICENSE +0 -20
- data/README.rdoc +0 -72
- data/Rakefile +0 -32
data/lib/formula.rb
CHANGED
@@ -1,503 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require 'formula/railtie' if defined?(Rails)
|
5
|
-
|
6
|
-
mattr_accessor :box_options
|
7
|
-
mattr_accessor :area_options
|
8
|
-
mattr_accessor :file_options
|
9
|
-
mattr_accessor :field_options
|
10
|
-
mattr_accessor :select_options
|
11
|
-
@@box_options = {}
|
12
|
-
@@area_options = {}
|
13
|
-
@@file_options = {}
|
14
|
-
@@field_options = {}
|
15
|
-
@@select_options = {}
|
16
|
-
|
17
|
-
# Default class assigned to block (<div class="block">...</div>).
|
18
|
-
mattr_accessor :block_class
|
19
|
-
@@block_class = 'block'
|
20
|
-
|
21
|
-
# Default class assigned to input (<div class="input">...</div>).
|
22
|
-
mattr_accessor :input_class
|
23
|
-
@@input_class = 'input'
|
24
|
-
|
25
|
-
# Default class assigned to association (<div class="association">...</div>).
|
26
|
-
mattr_accessor :association_class
|
27
|
-
@@association_class = 'association'
|
28
|
-
|
29
|
-
# Default class assigned to block with errors (<div class="block errors">...</div>).
|
30
|
-
mattr_accessor :block_error_class
|
31
|
-
@@block_error_class = 'errors'
|
32
|
-
|
33
|
-
# Default class assigned to input with errors (<div class="input errors">...</div>).
|
34
|
-
mattr_accessor :input_error_class
|
35
|
-
@@input_error_class = false
|
36
|
-
|
37
|
-
# Default class assigned to input with errors (<div class="association errors">...</div>).
|
38
|
-
mattr_accessor :association_error_class
|
39
|
-
@@association_error_class = false
|
40
|
-
|
41
|
-
# Default class assigned to error (<div class="error">...</div>).
|
42
|
-
mattr_accessor :error_class
|
43
|
-
@@error_class = 'error'
|
44
|
-
|
45
|
-
# Default class assigned to hint (<div class="hint">...</div>).
|
46
|
-
mattr_accessor :hint_class
|
47
|
-
@@hint_class = 'hint'
|
48
|
-
|
49
|
-
# Default tag assigned to block (<div class="input">...</div>).
|
50
|
-
mattr_accessor :block_tag
|
51
|
-
@@block_tag = :div
|
52
|
-
|
53
|
-
# Default tag assigned to input (<div class="input">...</div>).
|
54
|
-
mattr_accessor :input_tag
|
55
|
-
@@input_tag = :div
|
56
|
-
|
57
|
-
# Default tag assigned to association (<div class="association">...</div>).
|
58
|
-
mattr_accessor :association_tag
|
59
|
-
@@association_tag = :div
|
60
|
-
|
61
|
-
# Default tag assigned to error (<div class="error">...</div>).
|
62
|
-
mattr_accessor :error_tag
|
63
|
-
@@error_tag = :div
|
64
|
-
|
65
|
-
# Default tag assigned to hint (<div class="hint">...</div>).
|
66
|
-
mattr_accessor :hint_tag
|
67
|
-
@@hint_tag = :div
|
68
|
-
|
69
|
-
# Method for file.
|
70
|
-
mattr_accessor :file
|
71
|
-
@@file = [:file?]
|
72
|
-
|
73
|
-
# Default as.
|
74
|
-
mattr_accessor :default_as
|
75
|
-
@@default_as = :string
|
76
|
-
|
77
|
-
|
78
|
-
class FormulaFormBuilder < ActionView::Helpers::FormBuilder
|
79
|
-
|
80
|
-
|
81
|
-
# Generate a form button.
|
82
|
-
#
|
83
|
-
# Options:
|
84
|
-
#
|
85
|
-
# * :container - add custom options to the container
|
86
|
-
# * :button - add custom options to the button
|
87
|
-
#
|
88
|
-
# Usage:
|
89
|
-
#
|
90
|
-
# f.button(:name)
|
91
|
-
#
|
92
|
-
# Equivalent:
|
93
|
-
#
|
94
|
-
# <div class="block">
|
95
|
-
# <%= f.submit("Save")
|
96
|
-
# </div>
|
97
|
-
|
98
|
-
def button(value = nil, options = {})
|
99
|
-
options[:button] ||= {}
|
100
|
-
|
101
|
-
options[:container] ||= {}
|
102
|
-
options[:container][:class] = arrayorize(options[:container][:class]) << ::Formula.block_class
|
103
|
-
|
104
|
-
|
105
|
-
@template.content_tag(::Formula.block_tag, options[:container]) do
|
106
|
-
submit value, options[:button]
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
|
111
|
-
# Basic container generator for use with blocks.
|
112
|
-
#
|
113
|
-
# Options:
|
114
|
-
#
|
115
|
-
# * :hint - specify a hint to be displayed ('We promise not to spam you.', etc.)
|
116
|
-
# * :label - override the default label used ('Name:', 'URL:', etc.)
|
117
|
-
# * :error - override the default error used ('invalid', 'incorrect', etc.)
|
118
|
-
#
|
119
|
-
# Usage:
|
120
|
-
#
|
121
|
-
# f.block(:name, :label => "Name:", :hint => "Please use your full name.", :container => { :class => 'fill' }) do
|
122
|
-
# ...
|
123
|
-
# end
|
124
|
-
#
|
125
|
-
# Equivalent:
|
126
|
-
#
|
127
|
-
# <div class='block fill'>
|
128
|
-
# <%= f.label(:name, "Name:") %>
|
129
|
-
# ...
|
130
|
-
# <div class="hint">Please use your full name.</div>
|
131
|
-
# <div class="error">...</div>
|
132
|
-
# </div>
|
133
|
-
|
134
|
-
def block(method = nil, options = {}, &block)
|
135
|
-
options[:error] ||= error(method) if method
|
136
|
-
|
137
|
-
components = "".html_safe
|
138
|
-
|
139
|
-
if method
|
140
|
-
components << self.label(method, options[:label]) if options[:label] or options[:label].nil? and method
|
141
|
-
end
|
142
|
-
|
143
|
-
components << @template.capture(&block)
|
144
|
-
|
145
|
-
options[:container] ||= {}
|
146
|
-
options[:container][:class] = arrayorize(options[:container][:class]) << ::Formula.block_class << method
|
147
|
-
options[:container][:class] << ::Formula.block_error_class if ::Formula.block_error_class.present? and error?(method)
|
148
|
-
|
149
|
-
components << @template.content_tag(::Formula.hint_tag , options[:hint ], :class => ::Formula.hint_class ) if options[:hint ]
|
150
|
-
components << @template.content_tag(::Formula.error_tag, options[:error], :class => ::Formula.error_class) if options[:error]
|
151
|
-
|
152
|
-
@template.content_tag(::Formula.block_tag, options[:container]) do
|
153
|
-
components
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
|
158
|
-
# Generate a suitable form input for a given method by performing introspection on the type.
|
159
|
-
#
|
160
|
-
# Options:
|
161
|
-
#
|
162
|
-
# * :as - override the default type used (:url, :email, :phone, :password, :number, :text)
|
163
|
-
# * :label - override the default label used ('Name:', 'URL:', etc.)
|
164
|
-
# * :error - override the default error used ('invalid', 'incorrect', etc.)
|
165
|
-
# * :input - add custom options to the input ({ :class => 'goregous' }, etc.)
|
166
|
-
# * :container - add custom options to the container ({ :class => 'gorgeous' }, etc.)
|
167
|
-
#
|
168
|
-
# Usage:
|
169
|
-
#
|
170
|
-
# f.input(:name)
|
171
|
-
# f.input(:email)
|
172
|
-
# f.input(:password_a, :label => "Password", :hint => "It's a secret!", :container => { :class => "half" })
|
173
|
-
# f.input(:password_b, :label => "Password", :hint => "It's a secret!", :container => { :class => "half" })
|
174
|
-
#
|
175
|
-
# Equivalent:
|
176
|
-
#
|
177
|
-
# <div class="block name">
|
178
|
-
# <%= f.label(:name)
|
179
|
-
# <div class="input string"><%= f.text_field(:name)</div>
|
180
|
-
# <div class="error">...</div>
|
181
|
-
# </div>
|
182
|
-
# <div class="block email">
|
183
|
-
# <%= f.label(:email)
|
184
|
-
# <div class="input string"><%= f.email_field(:email)</div>
|
185
|
-
# <div class="error">...</div>
|
186
|
-
# </div>
|
187
|
-
# <div class="block half password_a">
|
188
|
-
# <div class="input">
|
189
|
-
# <%= f.label(:password_a, "Password")
|
190
|
-
# <%= f.password_field(:password_a)
|
191
|
-
# <div class="hint">It's a secret!</div>
|
192
|
-
# <div class="error">...</div>
|
193
|
-
# </div>
|
194
|
-
# </div>
|
195
|
-
# <div class="block half password_b">
|
196
|
-
# <div class="input">
|
197
|
-
# <%= f.label(:password_b, "Password")
|
198
|
-
# <%= f.password_field(:password_b)
|
199
|
-
# <div class="hint">It's a secret!</div>
|
200
|
-
# <div class="error">...</div>
|
201
|
-
# </div>
|
202
|
-
# </div>
|
203
|
-
|
204
|
-
def input(method, options = {})
|
205
|
-
options[:as] ||= as(method)
|
206
|
-
options[:input] ||= {}
|
207
|
-
|
208
|
-
return hidden_field method, options[:input] if options[:as] == :hidden
|
209
|
-
|
210
|
-
klass = [::Formula.input_class, options[:as]]
|
211
|
-
klass << ::Formula.input_error_class if ::Formula.input_error_class.present? and error?(method)
|
212
|
-
|
213
|
-
self.block(method, options) do
|
214
|
-
@template.content_tag(::Formula.input_tag, :class => klass) do
|
215
|
-
case options[:as]
|
216
|
-
when :text then text_area method, ::Formula.area_options.merge(options[:input] || {})
|
217
|
-
when :file then file_field method, ::Formula.file_options.merge(options[:input] || {})
|
218
|
-
when :string then text_field method, ::Formula.field_options.merge(options[:input] || {})
|
219
|
-
when :password then password_field method, ::Formula.field_options.merge(options[:input] || {})
|
220
|
-
when :url then url_field method, ::Formula.field_options.merge(options[:input] || {})
|
221
|
-
when :email then email_field method, ::Formula.field_options.merge(options[:input] || {})
|
222
|
-
when :phone then phone_field method, ::Formula.field_options.merge(options[:input] || {})
|
223
|
-
when :number then number_field method, ::Formula.field_options.merge(options[:input] || {})
|
224
|
-
when :boolean then check_box method, ::Formula.box_options.merge(options[:input] || {})
|
225
|
-
when :country then country_select method, ::Formula.select_options.merge(options[:input] || {})
|
226
|
-
when :date then date_select method, ::Formula.select_options.merge(options[:input] || {}), options[:input].delete(:html) || {}
|
227
|
-
when :time then time_select method, ::Formula.select_options.merge(options[:input] || {}), options[:input].delete(:html) || {}
|
228
|
-
when :datetime then datetime_select method, ::Formula.select_options.merge(options[:input] || {}), options[:input].delete(:html) || {}
|
229
|
-
when :select then select method, options[:choices], ::Formula.select_options.merge(options[:input] || {}), options[:input].delete(:html) || {}
|
230
|
-
end
|
231
|
-
end
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
|
236
|
-
# Generate a suitable form association for a given method by performing introspection on the type.
|
237
|
-
#
|
238
|
-
# Options:
|
239
|
-
#
|
240
|
-
# * :label - override the default label used ('Name:', 'URL:', etc.)
|
241
|
-
# * :error - override the default error used ('invalid', 'incorrect', etc.)
|
242
|
-
# * :association - add custom options to the input ({ :class => 'goregous' }, etc.)
|
243
|
-
# * :container - add custom options to the container ({ :class => 'gorgeous' }, etc.)
|
244
|
-
#
|
245
|
-
# Usage:
|
246
|
-
#
|
247
|
-
# f.association(:category, Category.all, :id, :name, :hint => "What do you do?")
|
248
|
-
# f.association(:category, Category.all, :id, :name, :association => { :prompt => "Category?" })
|
249
|
-
# f.association(:category, Category.all, :id, :name, :association => { :html => { :class => "category" } })
|
250
|
-
#
|
251
|
-
# Equivalent:
|
252
|
-
#
|
253
|
-
# <div>
|
254
|
-
# <div class="association category">
|
255
|
-
# <%= f.label(:category)
|
256
|
-
# <div class="association">
|
257
|
-
# <%= f.collection_select(:category, Category.all, :id, :name) %>
|
258
|
-
# </div>
|
259
|
-
# <div class="hint">What do you do?</div>
|
260
|
-
# <div class="error">...</div>
|
261
|
-
# </div>
|
262
|
-
# </div>
|
263
|
-
# <div>
|
264
|
-
# <div class="association category">
|
265
|
-
# <%= f.label(:category)
|
266
|
-
# <div class="association">
|
267
|
-
# <%= f.collection_select(:category, Category.all, :id, :name, { :prompt => "Category") } %>
|
268
|
-
# </div>
|
269
|
-
# <div class="error">...</div>
|
270
|
-
# </div>
|
271
|
-
# </div>
|
272
|
-
# <div>
|
273
|
-
# <div class="association category">
|
274
|
-
# <%= f.label(:category)
|
275
|
-
# <div class="association">
|
276
|
-
# <%= f.collection_select(:category, Category.all, :id, :name, {}, { :class => "category" } %>
|
277
|
-
# </div>
|
278
|
-
# <div class="error">...</div>
|
279
|
-
# </div>
|
280
|
-
# </div>
|
1
|
+
# frozen_string_literal: true
|
281
2
|
|
3
|
+
require 'zeitwerk'
|
282
4
|
|
283
|
-
|
284
|
-
|
285
|
-
options[:association] ||= {}
|
286
|
-
|
287
|
-
klass = [::Formula.association_class, options[:as]]
|
288
|
-
klass << ::Formula.association_error_class if ::Formula.association_error_class.present? and error?(method)
|
289
|
-
|
290
|
-
self.block(method, options) do
|
291
|
-
@template.content_tag(::Formula.association_tag, :class => klass) do
|
292
|
-
case options[:as]
|
293
|
-
when :select then collection_select :"#{method}_id", collection, value, text,
|
294
|
-
options[:association], options[:association].delete(:html) || {}
|
295
|
-
end
|
296
|
-
end
|
297
|
-
end
|
298
|
-
end
|
299
|
-
|
300
|
-
|
301
|
-
private
|
302
|
-
|
303
|
-
|
304
|
-
# Introspection on the column to determine how to render a method. The method is used to
|
305
|
-
# identify a method type (if the method corresponds to a column)
|
306
|
-
#
|
307
|
-
# Returns:
|
308
|
-
#
|
309
|
-
# * :text - for columns of type 'text'
|
310
|
-
# * :string - for columns of type 'string'
|
311
|
-
# * :integer - for columns of type 'integer'
|
312
|
-
# * :float - for columns of type 'float'
|
313
|
-
# * :decimal - for columns of type 'decimal'
|
314
|
-
# * :datetime - for columns of type 'datetime'
|
315
|
-
# * :date - for columns of type 'date'
|
316
|
-
# * :time - for columns of type 'time'
|
317
|
-
# * nil - for unkown columns
|
318
|
-
|
319
|
-
def type(method)
|
320
|
-
if @object.respond_to?(:has_attribute?) && @object.has_attribute?(method)
|
321
|
-
column = @object.column_for_attribute(method) if @object.respond_to?(:column_for_attribute)
|
322
|
-
return column.type if column
|
323
|
-
end
|
324
|
-
end
|
325
|
-
|
326
|
-
|
327
|
-
# Introspection on an association to determine if a method is a file. This
|
328
|
-
# is determined by the methods ability to respond to file methods.
|
329
|
-
|
330
|
-
def file?(method)
|
331
|
-
@files ||= {}
|
332
|
-
@files[method] ||= begin
|
333
|
-
file = @object.send(method) if @object && @object.respond_to?(method)
|
334
|
-
file && ::Formula.file.any? { |method| file.respond_to?(method) }
|
335
|
-
end
|
336
|
-
end
|
337
|
-
|
338
|
-
|
339
|
-
# Introspection on the field and method to determine how to render a method. The method is
|
340
|
-
# used to generate form element types.
|
341
|
-
#
|
342
|
-
# Returns:
|
343
|
-
#
|
344
|
-
# * :url - for columns containing 'url'
|
345
|
-
# * :email - for columns containing 'email'
|
346
|
-
# * :phone - for columns containing 'phone'
|
347
|
-
# * :password - for columns containing 'password'
|
348
|
-
# * :number - for integer, float or decimal columns
|
349
|
-
# * :datetime - for datetime or timestamp columns
|
350
|
-
# * :date - for date column
|
351
|
-
# * :time - for time column
|
352
|
-
# * :text - for time column
|
353
|
-
# * :string - for all other cases
|
354
|
-
|
355
|
-
def as(method)
|
356
|
-
|
357
|
-
case "#{method}"
|
358
|
-
when /url/ then return :url
|
359
|
-
when /email/ then return :email
|
360
|
-
when /phone/ then return :phone
|
361
|
-
when /password/ then return :password
|
362
|
-
end
|
363
|
-
|
364
|
-
case type(method)
|
365
|
-
when :string then return :string
|
366
|
-
when :integer then return :number
|
367
|
-
when :float then return :number
|
368
|
-
when :decimal then return :number
|
369
|
-
when :timestamp then return :datetime
|
370
|
-
when :datetime then return :datetime
|
371
|
-
when :date then return :date
|
372
|
-
when :time then return :time
|
373
|
-
when :text then return :text
|
374
|
-
end
|
375
|
-
|
376
|
-
return :file if file?(method)
|
377
|
-
|
378
|
-
return ::Formula.default_as
|
379
|
-
|
380
|
-
end
|
381
|
-
|
382
|
-
|
383
|
-
# Generate error messages by combining all errors on an object into a comma seperated string
|
384
|
-
# representation.
|
385
|
-
|
386
|
-
def error(method)
|
387
|
-
errors = @object.errors[method] if @object
|
388
|
-
errors.to_sentence if errors.present?
|
389
|
-
end
|
390
|
-
|
391
|
-
|
392
|
-
# Identify if error message exists for a given method by checking for the presence of the object
|
393
|
-
# followed by the presence of errors.
|
394
|
-
|
395
|
-
def error?(method)
|
396
|
-
@object.present? and @object.errors[method].present?
|
397
|
-
end
|
398
|
-
|
399
|
-
|
400
|
-
# Create an array from a string, a symbol, or an undefined value. The default is to return
|
401
|
-
# the value and assume it has already is valid.
|
402
|
-
|
403
|
-
def arrayorize(value)
|
404
|
-
case value
|
405
|
-
when nil then return []
|
406
|
-
when String then value.to_s.split
|
407
|
-
when Symbol then value.to_s.split
|
408
|
-
else value
|
409
|
-
end
|
410
|
-
end
|
411
|
-
|
412
|
-
|
413
|
-
public
|
414
|
-
|
415
|
-
|
416
|
-
# Generates a wrapper around fields_form with :builder set to FormulaFormBuilder.
|
417
|
-
#
|
418
|
-
# Supports:
|
419
|
-
#
|
420
|
-
# * f.formula_fields_for(@user.company)
|
421
|
-
# * f.fieldsula_for(@user.company)
|
422
|
-
#
|
423
|
-
# Equivalent:
|
424
|
-
#
|
425
|
-
# * f.fields_for(@user.company, :builder => Formula::FormulaFormBuilder))
|
426
|
-
#
|
427
|
-
# Usage:
|
428
|
-
#
|
429
|
-
# <% f.formula_fields_for(@user.company) do |company_f| %>
|
430
|
-
# <%= company_f.input :url %>
|
431
|
-
# <%= company_f.input :phone %>
|
432
|
-
# <% end %>
|
433
|
-
|
434
|
-
def formula_fields_for(record_or_name_or_array, *args, &block)
|
435
|
-
options = args.extract_options!
|
436
|
-
options[:builder] ||= self.class
|
437
|
-
fields_for(record_or_name_or_array, *(args << options), &block)
|
438
|
-
end
|
439
|
-
|
440
|
-
alias :fieldsula_for :formula_fields_for
|
5
|
+
loader = Zeitwerk::Loader.for_gem
|
6
|
+
loader.setup
|
441
7
|
|
8
|
+
require 'formula/railtie' if defined?(Rails)
|
442
9
|
|
10
|
+
module Formula
|
11
|
+
# @return [Formula::Config]
|
12
|
+
def self.config
|
13
|
+
@config ||= Config.new
|
443
14
|
end
|
444
15
|
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
# Generates a wrapper around form_for with :builder set to FormulaFormBuilder.
|
450
|
-
#
|
451
|
-
# Supports:
|
452
|
-
#
|
453
|
-
# * formula_form_for(@user)
|
454
|
-
#
|
455
|
-
# Equivalent:
|
456
|
-
#
|
457
|
-
# * form_for(@user, :builder => Formula::FormulaFormBuilder))
|
458
|
-
#
|
459
|
-
# Usage:
|
460
|
-
#
|
461
|
-
# <% formula_form_for(@user) do |f| %>
|
462
|
-
# <%= f.input :email %>
|
463
|
-
# <%= f.input :password %>
|
464
|
-
# <% end %>
|
465
|
-
|
466
|
-
def formula_form_for(record_or_name_or_array, *args, &proc)
|
467
|
-
options = args.extract_options!
|
468
|
-
options[:builder] ||= @@builder
|
469
|
-
form_for(record_or_name_or_array, *(args << options), &proc)
|
470
|
-
end
|
471
|
-
|
472
|
-
alias :formula_for :formula_form_for
|
473
|
-
|
474
|
-
|
475
|
-
# Generates a wrapper around fields_for with :builder set to FormulaFormBuilder.
|
476
|
-
#
|
477
|
-
# Supports:
|
478
|
-
#
|
479
|
-
# * f.formula_fields_for(@user.company)
|
480
|
-
# * f.fieldsula_for(@user.company)
|
481
|
-
#
|
482
|
-
# Equivalent:
|
483
|
-
#
|
484
|
-
# * f.fields_for(@user.company, :builder => Formula::FormulaFormBuilder))
|
485
|
-
#
|
486
|
-
# Usage:
|
487
|
-
#
|
488
|
-
# <% f.formula_fields_for(@user.company) do |company_f| %>
|
489
|
-
# <%= company_f.input :url %>
|
490
|
-
# <%= company_f.input :phone %>
|
491
|
-
# <% end %>
|
492
|
-
|
493
|
-
def formula_fields_for(record_or_name_or_array, *args, &block)
|
494
|
-
options = args.extract_options!
|
495
|
-
options[:builder] ||= @@builder
|
496
|
-
fields_for(record_or_name_or_array, *(args << options), &block)
|
497
|
-
end
|
498
|
-
|
499
|
-
alias :fieldsula_for :formula_fields_for
|
500
|
-
|
16
|
+
# @yield [Formula::Config]
|
17
|
+
def self.configure
|
18
|
+
yield config
|
501
19
|
end
|
502
|
-
|
503
20
|
end
|
metadata
CHANGED
@@ -1,29 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: formula
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Sylvestre
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: zeitwerk
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
description: Formula is a Rails form generator that generates simple clean markup.
|
28
42
|
The project aims to let users create semantically beautiful forms without introducing
|
29
43
|
too much syntax. The goal is to make integrating advanced layout systems as simple
|
@@ -34,19 +48,26 @@ executables: []
|
|
34
48
|
extensions: []
|
35
49
|
extra_rdoc_files: []
|
36
50
|
files:
|
37
|
-
-
|
38
|
-
- README.
|
39
|
-
-
|
51
|
+
- Gemfile
|
52
|
+
- README.md
|
53
|
+
- bin/rubocop
|
54
|
+
- bin/test
|
40
55
|
- lib/formula.rb
|
56
|
+
- lib/formula/config.rb
|
57
|
+
- lib/formula/form_builder.rb
|
58
|
+
- lib/formula/form_helper.rb
|
41
59
|
- lib/formula/railtie.rb
|
42
60
|
- lib/formula/version.rb
|
43
61
|
- lib/generators/attached/templates/_form.html.erb
|
44
62
|
- lib/generators/attached/templates/_form.html.haml
|
45
63
|
- lib/generators/attached/templates/_form.html.slim
|
46
|
-
homepage:
|
64
|
+
homepage: https://github.com/ksylvest/formula
|
47
65
|
licenses: []
|
48
|
-
metadata:
|
49
|
-
|
66
|
+
metadata:
|
67
|
+
homepage_uri: https://github.com/ksylvest/formula
|
68
|
+
changelog_uri: https://github.com/ksylvest/formula/releases
|
69
|
+
rubygems_mfa_required: 'true'
|
70
|
+
post_install_message:
|
50
71
|
rdoc_options: []
|
51
72
|
require_paths:
|
52
73
|
- lib
|
@@ -54,16 +75,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
54
75
|
requirements:
|
55
76
|
- - ">="
|
56
77
|
- !ruby/object:Gem::Version
|
57
|
-
version:
|
78
|
+
version: 3.2.0
|
58
79
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
80
|
requirements:
|
60
81
|
- - ">="
|
61
82
|
- !ruby/object:Gem::Version
|
62
83
|
version: '0'
|
63
84
|
requirements: []
|
64
|
-
|
65
|
-
|
66
|
-
signing_key:
|
85
|
+
rubygems_version: 3.5.22
|
86
|
+
signing_key:
|
67
87
|
specification_version: 4
|
68
88
|
summary: A great way to simplify complex forms
|
69
89
|
test_files: []
|
data/LICENSE
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
Copyright (c) 2010 - 2012 Kevin Sylvestre
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
a copy of this software and associated documentation files (the
|
5
|
-
"Software"), to deal in the Software without restriction, including
|
6
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
the following conditions:
|
10
|
-
|
11
|
-
The above copyright notice and this permission notice shall be
|
12
|
-
included in all copies or substantial portions of the Software.
|
13
|
-
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|