form_obj 0.5.0 → 1.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/.gitignore +0 -4
- data/CHANGELOG.md +43 -1
- data/Gemfile.lock +2 -17
- data/README.md +768 -213
- data/Rakefile +1 -4
- data/bundle_update.sh +27 -0
- data/form_obj.gemspec +0 -1
- data/lib/form_obj/form/array.rb +34 -10
- data/lib/form_obj/form.rb +4 -0
- data/lib/form_obj/model_mapper/array.rb +52 -33
- data/lib/form_obj/model_mapper/attribute.rb +13 -2
- data/lib/form_obj/model_mapper/model_attribute/item.rb +1 -0
- data/lib/form_obj/model_mapper/model_attribute.rb +4 -3
- data/lib/form_obj/model_mapper.rb +9 -1
- data/lib/form_obj/struct/array.rb +35 -24
- data/lib/form_obj/struct/attribute.rb +7 -3
- data/lib/form_obj/struct.rb +16 -10
- data/lib/form_obj/version.rb +1 -1
- data/run_tests.sh +0 -1
- metadata +4 -18
- data/.rspec +0 -3
data/Rakefile
CHANGED
@@ -1,13 +1,10 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rake/testtask"
|
3
|
-
require "rspec/core/rake_task"
|
4
3
|
|
5
4
|
Rake::TestTask.new(:test) do |t|
|
6
5
|
t.libs << "test"
|
7
6
|
t.libs << "lib"
|
8
7
|
t.test_files = FileList["test/**/*_test.rb"]
|
9
8
|
end
|
10
|
-
RSpec::Core::RakeTask.new(:spec)
|
11
9
|
|
12
|
-
task :default => :
|
13
|
-
# task :default => :test
|
10
|
+
task :default => :test
|
data/bundle_update.sh
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
rubies=()
|
6
|
+
versions=false
|
7
|
+
while read -r line; do
|
8
|
+
if [[ $line == "rvm:" ]]
|
9
|
+
then
|
10
|
+
versions=true
|
11
|
+
elif $versions && [[ $line == -* ]]
|
12
|
+
then
|
13
|
+
rubies+=(${line:2})
|
14
|
+
elif [[ ${line:0:1} != "#" ]]
|
15
|
+
then
|
16
|
+
versions=false
|
17
|
+
fi
|
18
|
+
done < ".travis.yml"
|
19
|
+
|
20
|
+
for i in "${rubies[@]}"
|
21
|
+
do
|
22
|
+
echo "====================================================="
|
23
|
+
echo "$i: Start appraisal update"
|
24
|
+
echo "====================================================="
|
25
|
+
rvm $i exec bundle
|
26
|
+
rvm $i exec appraisal update
|
27
|
+
done
|
data/form_obj.gemspec
CHANGED
@@ -39,7 +39,6 @@ well as serialized to a hash which reflects a model. ActiveModel::Errors could b
|
|
39
39
|
|
40
40
|
spec.add_development_dependency "bundler", "~> 1.16"
|
41
41
|
spec.add_development_dependency "rake", "~> 10.0"
|
42
|
-
spec.add_development_dependency "rspec", "~> 3.0"
|
43
42
|
spec.add_development_dependency "minitest", "~> 5.0"
|
44
43
|
spec.add_development_dependency "actionpack", ">= 3.2"
|
45
44
|
spec.add_development_dependency "appraisal"
|
data/lib/form_obj/form/array.rb
CHANGED
@@ -13,24 +13,48 @@ module FormObj
|
|
13
13
|
each(&:mark_for_destruction)
|
14
14
|
end
|
15
15
|
|
16
|
+
def marked_for_destruction
|
17
|
+
select(&:marked_for_destruction?)
|
18
|
+
end
|
19
|
+
|
16
20
|
private
|
17
21
|
|
18
|
-
#
|
19
|
-
#
|
20
|
-
|
21
|
-
|
22
|
+
# Should return hash with 3 keys: :create, :update, :destroy
|
23
|
+
# In default implementation:
|
24
|
+
# :create - array of hashes of new attribute values
|
25
|
+
# :update - hash where key is the item to update and value is a hash of new attribute values
|
26
|
+
# :destroy - array of items to be destroyed
|
27
|
+
def define_items_for_CUD(items)
|
28
|
+
to_be_created = []
|
29
|
+
to_be_updated = {}
|
30
|
+
to_be_destroyed = []
|
31
|
+
|
32
|
+
items.each do |item_hash|
|
33
|
+
item_hash = HashWithIndifferentAccess.new(item_hash)
|
34
|
+
_destroy = item_hash.delete(:_destroy)
|
35
|
+
item = find_by_primary_key(primary_key(item_hash))
|
36
|
+
if item
|
37
|
+
if _destroy
|
38
|
+
to_be_destroyed << item
|
39
|
+
else
|
40
|
+
to_be_updated[item] = item_hash
|
41
|
+
end
|
42
|
+
elsif !_destroy
|
43
|
+
to_be_created << item_hash
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
{ create: to_be_created, update: to_be_updated, destroy: to_be_destroyed }
|
48
|
+
end
|
49
|
+
|
50
|
+
# Do not do resort since update_attributes parameter may have not full list of items
|
51
|
+
def resort_items_after_CUD!(items)
|
22
52
|
end
|
23
53
|
|
24
54
|
# items - array of items to be destroyed
|
25
55
|
def destroy_items(items)
|
26
56
|
items.each(&:mark_for_destruction)
|
27
57
|
end
|
28
|
-
|
29
|
-
# items - hash where key is the item to update and value is a hash of new attribute values
|
30
|
-
# params - additional params for :update_attributes method
|
31
|
-
def update_items(items, params)
|
32
|
-
items.each_pair { |item, attr_values| item.update_attributes(attr_values, params) unless attr_values.delete(:_destroy) }
|
33
|
-
end
|
34
58
|
end
|
35
59
|
end
|
36
60
|
end
|
data/lib/form_obj/form.rb
CHANGED
@@ -15,26 +15,28 @@ module FormObj
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def sync_to_models(models)
|
18
|
-
|
19
|
-
ids_exists = []
|
20
|
-
items_to_add = []
|
18
|
+
items = define_models_for_CUD(models)
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
else
|
27
|
-
items_to_add << item
|
28
|
-
end
|
29
|
-
end
|
20
|
+
sync_destruction_to_models(models, items[:destroy])
|
21
|
+
sync_update_to_models(models, items[:update])
|
22
|
+
sync_creation_to_models(models, items[:create])
|
23
|
+
end
|
30
24
|
|
31
|
-
|
32
|
-
|
25
|
+
def model_primary_key
|
26
|
+
self.item_class.model_primary_key
|
27
|
+
end
|
33
28
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
29
|
+
def to_models_hash(models)
|
30
|
+
self.each { |item| models[:default] << item.to_models_hash(models.merge(default: {}))[:default] }
|
31
|
+
models
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
attr_reader :model_attribute
|
37
|
+
|
38
|
+
def iterate_through_models_to_load_them(models, *args, &block)
|
39
|
+
models.each { |model| block.call(model) }
|
38
40
|
end
|
39
41
|
|
40
42
|
def find_model(model_array, id)
|
@@ -45,29 +47,46 @@ module FormObj
|
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
# Should return hash with 3 keys: :create, :update, :destroy
|
51
|
+
# In default implementation:
|
52
|
+
# :create - array of form objects to be added
|
53
|
+
# :update - hash where key is a model to be updated and value is a form object
|
54
|
+
# :destroy - array of models to be marked for deletion
|
55
|
+
def define_models_for_CUD(models)
|
56
|
+
to_be_created = []
|
57
|
+
to_be_updated = {}
|
58
|
+
to_be_destroyed = select(&:marked_for_destruction?).map(&:primary_key)
|
59
|
+
|
60
|
+
reject(&:marked_for_destruction?).each do |form_object|
|
61
|
+
if model = find_model(models[:default], form_object.primary_key)
|
62
|
+
to_be_updated[model] = form_object
|
63
|
+
else
|
64
|
+
to_be_created << form_object
|
65
|
+
end
|
53
66
|
end
|
54
|
-
end
|
55
67
|
|
56
|
-
|
57
|
-
self.item_class.model_primary_key
|
68
|
+
{ create: to_be_created, update: to_be_updated, destroy: to_be_destroyed }
|
58
69
|
end
|
59
70
|
|
60
|
-
def
|
61
|
-
|
62
|
-
|
71
|
+
def sync_destruction_to_models(models, ids_to_destroy)
|
72
|
+
if models[:default].respond_to? :where
|
73
|
+
models[:default].where(model_primary_key.name => ids_to_destroy).each(&:mark_for_destruction)
|
74
|
+
else
|
75
|
+
models[:default].delete_if { |model| ids_to_destroy.include? model_primary_key.read_from_model(model) }
|
76
|
+
end
|
63
77
|
end
|
64
78
|
|
65
|
-
|
66
|
-
|
67
|
-
|
79
|
+
def sync_update_to_models(models, items_to_update)
|
80
|
+
items_to_update.each_pair do |model, form_object|
|
81
|
+
form_object.sync_to_models(models.merge(default: model))
|
82
|
+
end
|
83
|
+
end
|
68
84
|
|
69
|
-
def
|
70
|
-
|
85
|
+
def sync_creation_to_models(models, form_objects_to_create)
|
86
|
+
form_objects_to_create.each do |form_object|
|
87
|
+
models[:default] << model = model_attribute.create_model
|
88
|
+
form_object.sync_to_models(models.merge(default: model))
|
89
|
+
end
|
71
90
|
end
|
72
91
|
end
|
73
92
|
end
|
@@ -5,8 +5,19 @@ module FormObj
|
|
5
5
|
class Attribute < FormObj::Form::Attribute
|
6
6
|
attr_reader :model_attribute
|
7
7
|
|
8
|
-
def initialize(name, array: false, class: nil, default: nil, model_hash: false, model: :default, model_attribute: nil, model_class: nil, model_nesting: true, parent:, primary_key: nil, &block)
|
9
|
-
@model_attribute = ModelAttribute.new(
|
8
|
+
def initialize(name, array: false, class: nil, default: nil, model_hash: false, model: :default, model_attribute: nil, model_class: nil, model_nesting: true, parent:, primary_key: nil, read_from_model: true, write_to_model: true, &block)
|
9
|
+
@model_attribute = ModelAttribute.new(
|
10
|
+
array: array,
|
11
|
+
classes: model_class,
|
12
|
+
default_name: name,
|
13
|
+
hash: model_hash,
|
14
|
+
model: model,
|
15
|
+
names: model_attribute,
|
16
|
+
nesting: model_nesting,
|
17
|
+
read_from_model: read_from_model,
|
18
|
+
subform: binding.local_variable_get(:class) || block_given?,
|
19
|
+
write_to_model: write_to_model,
|
20
|
+
)
|
10
21
|
|
11
22
|
if block_given?
|
12
23
|
new_block = Proc.new do
|
@@ -6,8 +6,9 @@ module FormObj
|
|
6
6
|
class ModelAttribute
|
7
7
|
attr_reader :model
|
8
8
|
|
9
|
-
def initialize(
|
10
|
-
@read_from_model =
|
9
|
+
def initialize(array:, classes:, default_name:, hash:, model:, names:, nesting:, read_from_model:, subform:, write_to_model:)
|
10
|
+
@read_from_model = read_from_model && !(names === false)
|
11
|
+
@write_to_model = write_to_model && !(names === false)
|
11
12
|
|
12
13
|
@nesting = nesting
|
13
14
|
@model = model
|
@@ -18,7 +19,7 @@ module FormObj
|
|
18
19
|
|
19
20
|
if classes.size > 0
|
20
21
|
if (subform && (names.size != classes.size)) || (!subform && (names.size != classes.size + 1))
|
21
|
-
raise "Since the :model_attribute size is #{names.size} the :model_class size should be #{names.size - subform ? 0 : 1} in terms of nested items but it was #{classes.size}" unless names.size == classes.size
|
22
|
+
raise "Since the :model_attribute size is #{names.size} the :model_class size should be #{names.size - (subform ? 0 : 1)} in terms of nested items but it was #{classes.size}" unless names.size == classes.size
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
@@ -25,7 +25,15 @@ module FormObj
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def model_primary_key
|
28
|
-
ModelMapper::ModelPrimaryKey.new(
|
28
|
+
ModelMapper::ModelPrimaryKey.new(_attributes.find(primary_key).model_attribute)
|
29
|
+
end
|
30
|
+
|
31
|
+
def load_from_model(*args)
|
32
|
+
new.load_from_model(*args)
|
33
|
+
end
|
34
|
+
|
35
|
+
def load_from_models(*args)
|
36
|
+
new.load_from_models(*args)
|
29
37
|
end
|
30
38
|
end
|
31
39
|
|
@@ -16,26 +16,14 @@ module FormObj
|
|
16
16
|
self.map(&:to_hash)
|
17
17
|
end
|
18
18
|
|
19
|
-
def update_attributes(
|
20
|
-
|
21
|
-
items_to_update = {}
|
19
|
+
def update_attributes(items, raise_if_not_found:)
|
20
|
+
items_for_CUD = define_items_for_CUD(items)
|
22
21
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
if item
|
27
|
-
items_to_update[item] = val
|
28
|
-
else
|
29
|
-
items_to_add << val
|
30
|
-
end
|
31
|
-
end
|
32
|
-
items_to_destroy = items_for_destruction(items_to_add: items_to_add, items_to_update: items_to_update)
|
33
|
-
|
34
|
-
destroy_items(items_to_destroy)
|
35
|
-
update_items(items_to_update, raise_if_not_found: raise_if_not_found)
|
36
|
-
build_items(items_to_add, raise_if_not_found: raise_if_not_found)
|
22
|
+
destroy_items(items_for_CUD[:destroy])
|
23
|
+
update_items(items_for_CUD[:update], raise_if_not_found: raise_if_not_found)
|
24
|
+
build_items(items_for_CUD[:create], raise_if_not_found: raise_if_not_found)
|
37
25
|
|
38
|
-
|
26
|
+
resort_items_after_CUD!(items)
|
39
27
|
end
|
40
28
|
|
41
29
|
private
|
@@ -48,14 +36,33 @@ module FormObj
|
|
48
36
|
find { |item| item.primary_key == id }
|
49
37
|
end
|
50
38
|
|
51
|
-
|
52
|
-
|
39
|
+
# Should return hash with 3 keys: :create, :update, :destroy
|
40
|
+
# In default implementation:
|
41
|
+
# :create - array of hashes of new attribute values
|
42
|
+
# :update - hash where key is the item to update and value is a hash of new attribute values
|
43
|
+
# :destroy - array of items to be destroyed
|
44
|
+
def define_items_for_CUD(items)
|
45
|
+
to_be_created = []
|
46
|
+
to_be_updated = {}
|
47
|
+
|
48
|
+
items.each do |item_hash|
|
49
|
+
item_hash = HashWithIndifferentAccess.new(item_hash)
|
50
|
+
item = find_by_primary_key(primary_key(item_hash))
|
51
|
+
if item
|
52
|
+
to_be_updated[item] = item_hash
|
53
|
+
else
|
54
|
+
to_be_created << item_hash
|
55
|
+
end
|
56
|
+
end
|
57
|
+
to_be_destroyed = self - to_be_updated.keys
|
58
|
+
|
59
|
+
{ create: to_be_created, update: to_be_updated, destroy: to_be_destroyed }
|
53
60
|
end
|
54
61
|
|
55
|
-
#
|
56
|
-
#
|
57
|
-
def
|
58
|
-
|
62
|
+
# Resort items so they will be in the same order as in the update_attributes parameter
|
63
|
+
# items - hash received by update_attributes
|
64
|
+
def resort_items_after_CUD!(items)
|
65
|
+
sort! { |a, b| (items.index { |val| primary_key(val) == a.primary_key } || -1) <=> (items.index { |val| primary_key(val) == b.primary_key } || -1) }
|
59
66
|
end
|
60
67
|
|
61
68
|
# items - array of items to be destroyed
|
@@ -74,6 +81,10 @@ module FormObj
|
|
74
81
|
def build_items(items, params)
|
75
82
|
items.each { |item| self << build_item(item, params) }
|
76
83
|
end
|
84
|
+
|
85
|
+
def build_item(hash, raise_if_not_found:)
|
86
|
+
item_class.new(hash, raise_if_not_found: raise_if_not_found)
|
87
|
+
end
|
77
88
|
end
|
78
89
|
end
|
79
90
|
end
|
@@ -22,6 +22,10 @@ module FormObj
|
|
22
22
|
parent.primary_key = name.to_sym
|
23
23
|
end
|
24
24
|
end
|
25
|
+
|
26
|
+
if @array && @nested_class._attributes.find(@nested_class.primary_key).nil?
|
27
|
+
raise FormObj::NonexistentPrimaryKeyError.new("#{@nested_class.inspect} has no attribute :#{@nested_class.primary_key} which is specified/defaulted as primary key")
|
28
|
+
end
|
25
29
|
end
|
26
30
|
|
27
31
|
def subform?
|
@@ -65,15 +69,15 @@ module FormObj
|
|
65
69
|
|
66
70
|
if @nested_class
|
67
71
|
if @array
|
68
|
-
raise FormObj::
|
72
|
+
raise FormObj::WrongDefaultValueClassError unless value.is_a? ::Array
|
69
73
|
value = create_array(value.map do |val|
|
70
74
|
val = create_nested(val) if val.is_a?(::Hash)
|
71
|
-
raise FormObj::
|
75
|
+
raise FormObj::WrongDefaultValueClassError if val.class != @nested_class
|
72
76
|
val
|
73
77
|
end)
|
74
78
|
else
|
75
79
|
value = create_nested(value) if value.is_a? ::Hash
|
76
|
-
raise FormObj::
|
80
|
+
raise FormObj::WrongDefaultValueClassError if value.class != @nested_class
|
77
81
|
end
|
78
82
|
end
|
79
83
|
|
data/lib/form_obj/struct.rb
CHANGED
@@ -6,7 +6,8 @@ require "active_support/core_ext/hash/indifferent_access"
|
|
6
6
|
|
7
7
|
module FormObj
|
8
8
|
class UnknownAttributeError < RuntimeError; end
|
9
|
-
class
|
9
|
+
class WrongDefaultValueClassError < RuntimeError; end
|
10
|
+
class NonexistentPrimaryKeyError < NameError; end
|
10
11
|
|
11
12
|
class Struct
|
12
13
|
class_attribute :_attributes, instance_predicate: false, instance_reader: false, instance_writer: false
|
@@ -37,7 +38,7 @@ module FormObj
|
|
37
38
|
end
|
38
39
|
|
39
40
|
def attributes
|
40
|
-
|
41
|
+
_attributes.map(&:name)
|
41
42
|
end
|
42
43
|
|
43
44
|
def inspect
|
@@ -72,17 +73,17 @@ module FormObj
|
|
72
73
|
send("#{self.class.primary_key}=", val)
|
73
74
|
end
|
74
75
|
|
75
|
-
def update_attributes(
|
76
|
-
|
77
|
-
|
78
|
-
attr = self.class._attributes.find(
|
76
|
+
def update_attributes(attrs, raise_if_not_found: true)
|
77
|
+
attrs = HashWithIndifferentAccess.new(attrs) unless attrs.is_a? HashWithIndifferentAccess
|
78
|
+
attrs.each_pair do |attr_name, attr_value|
|
79
|
+
attr = self.class._attributes.find(attr_name)
|
79
80
|
if attr.nil?
|
80
|
-
raise UnknownAttributeError.new(
|
81
|
+
raise UnknownAttributeError.new(attr_name) if raise_if_not_found
|
81
82
|
else
|
82
83
|
if attr.subform?
|
83
|
-
|
84
|
+
read_attribute(attr).update_attributes(attr_value, raise_if_not_found: raise_if_not_found)
|
84
85
|
else
|
85
|
-
update_attribute(attr,
|
86
|
+
update_attribute(attr, attr_value)
|
86
87
|
end
|
87
88
|
end
|
88
89
|
end
|
@@ -95,11 +96,16 @@ module FormObj
|
|
95
96
|
end
|
96
97
|
|
97
98
|
def inspect
|
98
|
-
"#<#{
|
99
|
+
"#<#{inner_inspect}>"
|
99
100
|
end
|
100
101
|
|
101
102
|
private
|
102
103
|
|
104
|
+
def inner_inspect
|
105
|
+
attributes = self.class._attributes.map { |attribute| "#{attribute.name}: #{read_attribute(attribute).inspect}"}.join(', ')
|
106
|
+
"#{self.class.name}#{attributes.size > 0 ? " #{attributes}" : ''}"
|
107
|
+
end
|
108
|
+
|
103
109
|
def update_attribute(attribute, new_value)
|
104
110
|
write_attribute(attribute, new_value)
|
105
111
|
end
|
data/lib/form_obj/version.rb
CHANGED
data/run_tests.sh
CHANGED
@@ -23,7 +23,6 @@ do
|
|
23
23
|
echo "$i: Start Test"
|
24
24
|
echo "====================================================="
|
25
25
|
rvm $i exec bundle exec appraisal rake test
|
26
|
-
rvm $i exec bundle exec appraisal rake spec
|
27
26
|
echo "====================================================="
|
28
27
|
echo "$i: End Test"
|
29
28
|
echo "====================================================="
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: form_obj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Koltun
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: typed_array
|
@@ -80,20 +80,6 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '10.0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rspec
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '3.0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '3.0'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: minitest
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,7 +134,6 @@ extensions: []
|
|
148
134
|
extra_rdoc_files: []
|
149
135
|
files:
|
150
136
|
- ".gitignore"
|
151
|
-
- ".rspec"
|
152
137
|
- ".travis.yml"
|
153
138
|
- Appraisals
|
154
139
|
- CHANGELOG.md
|
@@ -160,6 +145,7 @@ files:
|
|
160
145
|
- bin/console
|
161
146
|
- bin/setup
|
162
147
|
- bundle_install.sh
|
148
|
+
- bundle_update.sh
|
163
149
|
- form_obj.gemspec
|
164
150
|
- gemfiles/3.2.gemfile
|
165
151
|
- gemfiles/4.1.gemfile
|
@@ -206,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
206
192
|
version: '0'
|
207
193
|
requirements: []
|
208
194
|
rubyforge_project:
|
209
|
-
rubygems_version: 2.
|
195
|
+
rubygems_version: 2.7.7
|
210
196
|
signing_key:
|
211
197
|
specification_version: 4
|
212
198
|
summary: Simple but powerful form object compatible with Rails form builders.
|
data/.rspec
DELETED