active_scaffold 3.3.3 → 3.4.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 +4 -4
- data/CHANGELOG +39 -0
- data/README.md +5 -3
- data/app/assets/images/active_scaffold/refresh.png +0 -0
- data/app/assets/javascripts/jquery/active_scaffold.js +182 -91
- data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +14 -16
- data/app/assets/javascripts/jquery/draggable_lists.js +33 -26
- data/app/assets/javascripts/jquery/jquery.editinplace.js +3 -3
- data/app/assets/javascripts/prototype/active_scaffold.js +61 -19
- data/app/assets/stylesheets/active_scaffold_colors.css.scss +4 -0
- data/app/assets/stylesheets/active_scaffold_images.css.scss +3 -0
- data/app/assets/stylesheets/active_scaffold_layout.css +23 -2
- data/app/views/active_scaffold_overrides/_add_existing_form.html.erb +1 -3
- data/app/views/active_scaffold_overrides/_base_form.html.erb +7 -5
- data/app/views/active_scaffold_overrides/_field_search.html.erb +1 -2
- data/app/views/active_scaffold_overrides/_form.html.erb +6 -4
- data/app/views/active_scaffold_overrides/_form_association.html.erb +4 -3
- data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +5 -5
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +8 -6
- data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +3 -2
- data/app/views/active_scaffold_overrides/_list.html.erb +8 -6
- data/app/views/active_scaffold_overrides/_list_column_headings.html.erb +1 -4
- data/app/views/active_scaffold_overrides/_list_pagination.html.erb +4 -4
- data/app/views/active_scaffold_overrides/_list_pagination_links.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_list_record.html.erb +3 -3
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +8 -1
- data/app/views/active_scaffold_overrides/_search.html.erb +7 -13
- data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
- data/app/views/active_scaffold_overrides/on_create.js.erb +4 -4
- data/app/views/active_scaffold_overrides/render_field_inplace.html.erb +1 -1
- data/app/views/active_scaffold_overrides/row.js.erb +1 -1
- data/config/locales/de.yml +106 -95
- data/config/locales/en.yml +108 -97
- data/config/locales/es.yml +109 -98
- data/config/locales/fr.yml +108 -97
- data/config/locales/hu.yml +109 -98
- data/config/locales/ja.yml +100 -89
- data/config/locales/ru.yml +115 -104
- data/lib/active_scaffold.rb +18 -294
- data/lib/active_scaffold/actions/common_search.rb +50 -17
- data/lib/active_scaffold/actions/core.rb +93 -22
- data/lib/active_scaffold/actions/create.rb +15 -6
- data/lib/active_scaffold/actions/field_search.rb +68 -60
- data/lib/active_scaffold/actions/list.rb +49 -28
- data/lib/active_scaffold/actions/nested.rb +14 -6
- data/lib/active_scaffold/actions/search.rb +36 -35
- data/lib/active_scaffold/actions/show.rb +9 -4
- data/lib/active_scaffold/actions/subform.rb +1 -1
- data/lib/active_scaffold/actions/update.rb +22 -7
- data/lib/active_scaffold/active_record_permissions.rb +125 -118
- data/lib/active_scaffold/attribute_params.rb +84 -66
- data/lib/active_scaffold/bridges.rb +3 -3
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +10 -5
- data/lib/active_scaffold/bridges/cancan.rb +2 -1
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +13 -2
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +11 -6
- data/lib/active_scaffold/bridges/chosen/helpers.rb +2 -2
- data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +45 -29
- data/lib/active_scaffold/bridges/date_picker/ext.rb +11 -6
- data/lib/active_scaffold/bridges/date_picker/helper.rb +5 -1
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +10 -5
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +6 -1
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +12 -11
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +14 -6
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/record_select/helpers.rb +15 -12
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +7 -8
- data/lib/active_scaffold/bridges/tiny_mce.rb +5 -3
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +4 -5
- data/lib/active_scaffold/config/base.rb +4 -0
- data/lib/active_scaffold/config/core.rb +12 -5
- data/lib/active_scaffold/config/delete.rb +0 -2
- data/lib/active_scaffold/config/field_search.rb +1 -4
- data/lib/active_scaffold/config/form.rb +0 -2
- data/lib/active_scaffold/config/list.rb +31 -1
- data/lib/active_scaffold/config/search.rb +0 -3
- data/lib/active_scaffold/config/show.rb +0 -6
- data/lib/active_scaffold/config/subform.rb +1 -0
- data/lib/active_scaffold/configurable.rb +2 -2
- data/lib/active_scaffold/constraints.rb +11 -14
- data/lib/active_scaffold/core.rb +277 -0
- data/lib/active_scaffold/data_structures/action_columns.rb +18 -2
- data/lib/active_scaffold/data_structures/action_link.rb +25 -6
- data/lib/active_scaffold/data_structures/action_links.rb +9 -4
- data/lib/active_scaffold/data_structures/actions.rb +1 -1
- data/lib/active_scaffold/data_structures/column.rb +6 -6
- data/lib/active_scaffold/data_structures/columns.rb +2 -2
- data/lib/active_scaffold/data_structures/nested_info.rb +5 -1
- data/lib/active_scaffold/data_structures/sorting.rb +15 -5
- data/lib/active_scaffold/delayed_setup.rb +30 -0
- data/lib/active_scaffold/engine.rb +25 -0
- data/lib/active_scaffold/extensions/action_view_rendering.rb +1 -1
- data/lib/active_scaffold/extensions/left_outer_joins.rb +61 -21
- data/lib/active_scaffold/extensions/localize.rb +1 -1
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +13 -8
- data/lib/active_scaffold/extensions/paginator_extensions.rb +5 -1
- data/lib/active_scaffold/extensions/reverse_associations.rb +1 -0
- data/lib/active_scaffold/extensions/routing_mapper.rb +1 -1
- data/lib/active_scaffold/extensions/unsaved_record.rb +4 -6
- data/lib/active_scaffold/finder.rb +79 -27
- data/lib/active_scaffold/helpers/association_helpers.rb +48 -18
- data/lib/active_scaffold/helpers/controller_helpers.rb +19 -10
- data/lib/active_scaffold/helpers/form_column_helpers.rb +185 -87
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +2 -1
- data/lib/active_scaffold/helpers/id_helpers.rb +14 -8
- data/lib/active_scaffold/helpers/list_column_helpers.rb +65 -56
- data/lib/active_scaffold/helpers/pagination_helpers.rb +5 -1
- data/lib/active_scaffold/helpers/search_column_helpers.rb +21 -18
- data/lib/active_scaffold/helpers/view_helpers.rb +102 -64
- data/lib/active_scaffold/responds_to_parent.rb +39 -64
- data/lib/active_scaffold/tableless.rb +129 -10
- data/lib/active_scaffold/version.rb +2 -2
- data/test/bridges/bridge_test.rb +1 -1
- data/test/bridges/date_picker_test.rb +2 -2
- data/test/bridges/paperclip_test.rb +10 -8
- data/test/bridges/tiny_mce_test.rb +2 -2
- data/test/company.rb +22 -10
- data/test/config/base_test.rb +1 -1
- data/test/config/core_test.rb +8 -6
- data/test/config/create_test.rb +6 -6
- data/test/config/delete_test.rb +4 -4
- data/test/config/field_search_test.rb +6 -6
- data/test/config/list_test.rb +7 -7
- data/test/config/nested_test.rb +8 -7
- data/test/config/search_test.rb +7 -7
- data/test/config/show_test.rb +5 -5
- data/test/config/subform_test.rb +1 -1
- data/test/config/update_test.rb +5 -4
- data/test/data_structures/action_columns_test.rb +15 -16
- data/test/data_structures/action_link_test.rb +10 -10
- data/test/data_structures/action_links_test.rb +6 -6
- data/test/data_structures/actions_test.rb +4 -4
- data/test/data_structures/association_column_test.rb +4 -4
- data/test/data_structures/column_test.rb +9 -9
- data/test/data_structures/columns_test.rb +7 -7
- data/test/data_structures/error_message_test.rb +2 -4
- data/test/data_structures/set_test.rb +13 -13
- data/test/data_structures/sorting_test.rb +8 -8
- data/test/data_structures/standard_column_test.rb +2 -2
- data/test/data_structures/validation_reflection_test.rb +8 -8
- data/test/data_structures/virtual_column_test.rb +5 -5
- data/test/extensions/active_record_test.rb +1 -1
- data/test/helpers/form_column_helpers_test.rb +5 -5
- data/test/helpers/list_column_helpers_test.rb +2 -1
- data/test/helpers/pagination_helpers_test.rb +1 -1
- data/test/misc/active_record_permissions_test.rb +23 -4
- data/test/misc/attribute_params_test.rb +304 -136
- data/test/misc/calculation_test.rb +55 -0
- data/test/misc/configurable_test.rb +22 -21
- data/test/misc/constraints_test.rb +10 -7
- data/test/misc/convert_numbers_format_test.rb +149 -0
- data/test/misc/finder_test.rb +17 -13
- data/test/misc/lang_test.rb +1 -1
- data/test/misc/tableless_test.rb +18 -0
- data/test/mock_app/app/controllers/addresses_controller.rb +4 -0
- data/test/mock_app/app/controllers/buildings_controller.rb +4 -0
- data/test/mock_app/app/controllers/cars_controller.rb +4 -0
- data/test/mock_app/app/controllers/contacts_controller.rb +4 -0
- data/test/mock_app/app/controllers/floors_controller.rb +6 -0
- data/test/mock_app/app/controllers/people_controller.rb +4 -0
- data/test/mock_app/app/models/address.rb +3 -0
- data/test/mock_app/app/models/building.rb +8 -0
- data/test/mock_app/app/models/car.rb +3 -0
- data/test/mock_app/app/models/contact.rb +3 -0
- data/test/mock_app/app/models/file_model.rb +19 -0
- data/test/mock_app/app/models/floor.rb +8 -0
- data/test/mock_app/app/models/person.rb +11 -0
- data/test/mock_app/config/application.rb +2 -0
- data/test/mock_app/config/environments/test.rb +1 -1
- data/test/mock_app/config/initializers/secret_token.rb +5 -1
- data/test/mock_app/config/routes.rb +1 -1
- data/test/mock_app/db/schema.rb +51 -0
- data/test/model_stub.rb +3 -3
- data/test/test_helper.rb +15 -12
- metadata +51 -50
- data/lib/active_scaffold/extensions/array.rb +0 -7
- data/lib/active_scaffold/extensions/cache_association.rb +0 -16
- data/lib/active_scaffold/extensions/usa_state.rb +0 -46
- data/lib/active_scaffold_env.rb +0 -13
- data/test/extensions/array_test.rb +0 -12
- data/test/mock_app/public/blank.html +0 -33
- data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +0 -2
- data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
- data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
- data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
- data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +0 -2
- data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +0 -532
- data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +0 -867
- data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +0 -117
- data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +0 -370
- data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +0 -2
- data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +0 -35
- data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +0 -848
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class ClassWithFinder
|
|
4
|
+
include ActiveScaffold::Finder
|
|
5
|
+
def conditions_for_collection; end
|
|
6
|
+
def conditions_from_params; end
|
|
7
|
+
def conditions_from_constraints; end
|
|
8
|
+
def joins_for_collection; end
|
|
9
|
+
def custom_finder_options
|
|
10
|
+
{}
|
|
11
|
+
end
|
|
12
|
+
def beginning_of_chain
|
|
13
|
+
active_scaffold_config.model
|
|
14
|
+
end
|
|
15
|
+
def conditional_get_support?; end
|
|
16
|
+
def params; {}; end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class CalculationTest < MiniTest::Test
|
|
20
|
+
def setup
|
|
21
|
+
@buildings = []
|
|
22
|
+
@buildings << Building.create {|b| b.create_owner(:first_name => 'foo')}
|
|
23
|
+
@buildings << Building.create(:name => 'foo bar')
|
|
24
|
+
@buildings << Building.create
|
|
25
|
+
|
|
26
|
+
@klass = ClassWithFinder.new
|
|
27
|
+
@klass.stubs(:active_scaffold_config).returns(mock { stubs(:model).returns(Building) })
|
|
28
|
+
@klass.stubs(:active_scaffold_session_storage).returns({})
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def teardown
|
|
32
|
+
@buildings.each(&:destroy).map(&:owner).compact.each(&:destroy)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_calculation_with_conditions
|
|
36
|
+
@klass.expects(:conditions_for_collection).returns(['"buildings"."name" LIKE ? OR "people"."first_name" LIKE ?', '%foo%', '%foo%'])
|
|
37
|
+
@klass.expects(:active_scaffold_references).returns([:owner])
|
|
38
|
+
@klass.active_scaffold_config.expects(:list).returns(mock { stubs(:count_includes).returns(nil) })
|
|
39
|
+
|
|
40
|
+
column = mock { stubs(:field).returns('"buildings"."id"') }
|
|
41
|
+
@klass.active_scaffold_config.expects(:columns).returns(mock { stubs(:"[]").returns(column) })
|
|
42
|
+
query = @klass.send :calculate_query
|
|
43
|
+
assert_equal 2, query.count
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_calculation_without_conditions
|
|
47
|
+
@klass.stubs(:active_scaffold_references).returns([:owner])
|
|
48
|
+
@klass.active_scaffold_config.expects(:list).returns(mock { stubs(:count_includes).returns(nil) })
|
|
49
|
+
|
|
50
|
+
column = mock { stubs(:field).returns('"buildings"."id"') }
|
|
51
|
+
@klass.active_scaffold_config.expects(:columns).returns(mock { stubs(:"[]").returns(column) })
|
|
52
|
+
query = @klass.send :calculate_query
|
|
53
|
+
assert_equal Building.count, query.count
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -6,8 +6,15 @@ class ConfigurableClass
|
|
|
6
6
|
def self.foo; FOO end
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
+
class IncludedClass < ConfigurableClass
|
|
10
|
+
include ActiveScaffold::Configurable
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class ExtendedClass < ConfigurableClass
|
|
14
|
+
extend ActiveScaffold::Configurable
|
|
15
|
+
end
|
|
9
16
|
|
|
10
|
-
class ConfigurableTest < Test
|
|
17
|
+
class ConfigurableTest < MiniTest::Test
|
|
11
18
|
##
|
|
12
19
|
## constants and methods for tests to check against
|
|
13
20
|
##
|
|
@@ -15,19 +22,17 @@ class ConfigurableTest < Test::Unit::TestCase
|
|
|
15
22
|
HELLO = 'world'
|
|
16
23
|
|
|
17
24
|
def test_instance_configuration
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
configurable_class = ConfigurableClass.new
|
|
25
|
+
configurable_class = IncludedClass.new
|
|
21
26
|
|
|
22
27
|
##
|
|
23
28
|
## sanity checks
|
|
24
29
|
##
|
|
25
30
|
# make sure the configure method is available
|
|
26
|
-
assert
|
|
31
|
+
assert configurable_class.respond_to?(:configure)
|
|
27
32
|
# make sure real functions still work
|
|
28
33
|
assert_equal 'bar', configurable_class.foo
|
|
29
34
|
# make sure other functions still don't work
|
|
30
|
-
|
|
35
|
+
assert_raises NoMethodError do
|
|
31
36
|
configurable_class.i_do_not_exist
|
|
32
37
|
end
|
|
33
38
|
|
|
@@ -52,45 +57,41 @@ class ConfigurableTest < Test::Unit::TestCase
|
|
|
52
57
|
end
|
|
53
58
|
|
|
54
59
|
def test_class_configuration
|
|
55
|
-
ConfigurableClass.send :extend, ActiveScaffold::Configurable
|
|
56
|
-
|
|
57
60
|
##
|
|
58
61
|
## sanity checks
|
|
59
62
|
##
|
|
60
63
|
# make sure the configure method is available
|
|
61
|
-
assert
|
|
64
|
+
assert ExtendedClass.respond_to?(:configure)
|
|
62
65
|
# make sure real functions still work
|
|
63
|
-
assert_equal 'bar',
|
|
66
|
+
assert_equal 'bar', ExtendedClass.foo
|
|
64
67
|
# make sure other functions still don't work
|
|
65
|
-
|
|
66
|
-
|
|
68
|
+
assert_raises NoMethodError do
|
|
69
|
+
ExtendedClass.i_do_not_exist
|
|
67
70
|
end
|
|
68
71
|
|
|
69
72
|
##
|
|
70
73
|
## test normal block behaviors
|
|
71
74
|
##
|
|
72
75
|
# functions
|
|
73
|
-
assert_equal hello,
|
|
76
|
+
assert_equal hello, ExtendedClass.configure {hello}
|
|
74
77
|
# variables
|
|
75
|
-
assert_equal
|
|
78
|
+
assert_equal ExtendedClass, ExtendedClass.configure {ExtendedClass}
|
|
76
79
|
# constants
|
|
77
|
-
assert_equal ConfigurableTest::HELLO,
|
|
80
|
+
assert_equal ConfigurableTest::HELLO, ExtendedClass.configure {ConfigurableTest::HELLO}
|
|
78
81
|
|
|
79
82
|
##
|
|
80
83
|
## test extra "localized" block behavior
|
|
81
84
|
##
|
|
82
85
|
# functions
|
|
83
|
-
assert_equal
|
|
86
|
+
assert_equal ExtendedClass.foo, ExtendedClass.configure {foo}
|
|
84
87
|
# constants - not working
|
|
85
|
-
# assert_equal
|
|
88
|
+
# assert_equal ExtendedClass.FOO, ExtendedClass.configure {FOO}
|
|
86
89
|
end
|
|
87
90
|
|
|
88
91
|
def test_arity
|
|
89
|
-
ConfigurableClass.send :extend, ActiveScaffold::Configurable
|
|
90
|
-
|
|
91
92
|
# this is the main style
|
|
92
|
-
assert_equal 'foo',
|
|
93
|
+
assert_equal 'foo', ExtendedClass.configure {'foo'}
|
|
93
94
|
# but we want to let people accept the configurable class as the first argument, too
|
|
94
|
-
assert_equal 'bar',
|
|
95
|
+
assert_equal 'bar', ExtendedClass.configure {|a| a.foo}
|
|
95
96
|
end
|
|
96
97
|
end
|
|
@@ -3,7 +3,8 @@ require 'test_helper'
|
|
|
3
3
|
module ModelStubs
|
|
4
4
|
class ModelStub < ActiveRecord::Base
|
|
5
5
|
abstract_class = true
|
|
6
|
-
def self.columns; [
|
|
6
|
+
def self.columns; @columns ||= [ColumnMock.new('foo', '')] end
|
|
7
|
+
def self.columns_hash; @hash ||= Hash[@columns.map{|c| [c.name, c]}] end
|
|
7
8
|
def self.table_name
|
|
8
9
|
@table_name || to_s.split('::').last.underscore.pluralize
|
|
9
10
|
end
|
|
@@ -83,7 +84,8 @@ end
|
|
|
83
84
|
class ConstraintsTestObject
|
|
84
85
|
# stub out what the mixin expects to find ...
|
|
85
86
|
def self.before_filter(*args); end
|
|
86
|
-
attr_accessor :
|
|
87
|
+
attr_accessor :active_scaffold_preload
|
|
88
|
+
attr_accessor :active_scaffold_references
|
|
87
89
|
attr_accessor :active_scaffold_habtm_joins
|
|
88
90
|
attr_accessor :active_scaffold_config
|
|
89
91
|
attr_accessor :params
|
|
@@ -98,13 +100,14 @@ class ConstraintsTestObject
|
|
|
98
100
|
attr_accessor :active_scaffold_constraints
|
|
99
101
|
|
|
100
102
|
def initialize
|
|
101
|
-
@
|
|
103
|
+
@active_scaffold_preload = []
|
|
104
|
+
@active_scaffold_references = []
|
|
102
105
|
@active_scaffold_habtm_joins = []
|
|
103
106
|
@params = {}
|
|
104
107
|
end
|
|
105
108
|
end
|
|
106
109
|
|
|
107
|
-
class ConstraintsTest < Test
|
|
110
|
+
class ConstraintsTest < MiniTest::Test
|
|
108
111
|
def setup
|
|
109
112
|
@test_object = ConstraintsTestObject.new
|
|
110
113
|
end
|
|
@@ -114,12 +117,12 @@ class ConstraintsTest < Test::Unit::TestCase
|
|
|
114
117
|
# has_one (vs belongs_to)
|
|
115
118
|
assert_constraint_condition({:subscription => 5}, [{'subscriptions.id' => 5}], 'find the user with subscription #5')
|
|
116
119
|
# habtm (vs habtm)
|
|
117
|
-
assert_constraint_condition({:roles => 4}, [{'
|
|
120
|
+
assert_constraint_condition({:roles => 4}, [{'roles.id' => 4}], 'find all users with role #4')
|
|
118
121
|
# has_one (vs polymorphic)
|
|
119
122
|
assert_constraint_condition({:address => 11}, [{'addresses.id' => 11}], 'find the user with address #11')
|
|
120
123
|
# reverse of a has_many :through
|
|
121
124
|
assert_constraint_condition({:subscription => {:service => 5}}, [{'services.id' => 5}], 'find all users subscribed to service #5')
|
|
122
|
-
assert(@test_object.
|
|
125
|
+
assert(@test_object.active_scaffold_references.include?({:subscription => :service}), 'multi-level association include')
|
|
123
126
|
|
|
124
127
|
@test_object.active_scaffold_config = config_for('subscription')
|
|
125
128
|
# belongs_to (vs has_one)
|
|
@@ -144,7 +147,7 @@ class ConstraintsTest < Test::Unit::TestCase
|
|
|
144
147
|
# has_one (vs belongs_to)
|
|
145
148
|
assert_constraint_condition({:other_subscription => 5}, [{'subscriptions.id' => 5}], 'find the user with subscription #5')
|
|
146
149
|
# habtm (vs habtm)
|
|
147
|
-
assert_constraint_condition({:other_roles => 4}, [{'
|
|
150
|
+
assert_constraint_condition({:other_roles => 4}, [{'roles.id' => 4}], 'find all users with role #4')
|
|
148
151
|
# has_one (vs polymorphic)
|
|
149
152
|
assert_constraint_condition({:other_address => 11}, [{'addresses.id' => 11}], 'find the user with address #11')
|
|
150
153
|
# reverse of a has_many :through
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class NumberModel < ActiveRecord::Base
|
|
4
|
+
include ActiveScaffold::ActiveRecordPermissions::ModelUserAccess::Model
|
|
5
|
+
abstract_class = true
|
|
6
|
+
def self.columns
|
|
7
|
+
@columns ||= [ColumnMock.new('number', '', 'double(10,2)')]
|
|
8
|
+
end
|
|
9
|
+
def self.columns_hash
|
|
10
|
+
@hash ||= Hash[@columns.map{|c| [c.name, c]}]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class ConvertNumbersFormatTest < MiniTest::Test
|
|
15
|
+
include ActiveScaffold::AttributeParams
|
|
16
|
+
include ActiveScaffold::Finder
|
|
17
|
+
|
|
18
|
+
def setup
|
|
19
|
+
I18n.backend.store_translations :en, :number => {:format => {
|
|
20
|
+
:delimiter => ',',
|
|
21
|
+
:separator => '.'
|
|
22
|
+
}}
|
|
23
|
+
I18n.backend.store_translations :es, :number => {:format => {
|
|
24
|
+
:delimiter => '.',
|
|
25
|
+
:separator => ','
|
|
26
|
+
}}
|
|
27
|
+
I18n.backend.store_translations :ru, :number => {:currency => {
|
|
28
|
+
:format => {
|
|
29
|
+
:separator => ',',
|
|
30
|
+
:delimiter => ''
|
|
31
|
+
}
|
|
32
|
+
}}
|
|
33
|
+
|
|
34
|
+
@config = config_for('number_model')
|
|
35
|
+
@config.columns[:number].form_ui = nil
|
|
36
|
+
@config.create.columns.set_columns @config.columns
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def teardown
|
|
40
|
+
I18n.locale = :en
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_english_format_with_decimal_separator_using_english_language
|
|
44
|
+
I18n.locale = :en
|
|
45
|
+
assert_equal 0.1, convert_number('.1')
|
|
46
|
+
assert_equal 0.1, convert_number('.100')
|
|
47
|
+
assert_equal 0.1, convert_number('0.1')
|
|
48
|
+
assert_equal 0.345, convert_number('0.345')
|
|
49
|
+
assert_equal 0.345, convert_number('+0.345')
|
|
50
|
+
assert_equal -0.345, convert_number('-0.345')
|
|
51
|
+
assert_equal 9.345, convert_number('9.345')
|
|
52
|
+
assert_equal 9.1, convert_number('9.1')
|
|
53
|
+
assert_equal 90.1, convert_number('90.1')
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_english_format_with_thousand_delimiter_using_english_language
|
|
57
|
+
I18n.locale = :en
|
|
58
|
+
assert_equal 1000, convert_number('1,000')
|
|
59
|
+
assert_equal 1000, convert_number('+1,000')
|
|
60
|
+
assert_equal -1000, convert_number('-1,000')
|
|
61
|
+
assert_equal 1000000, convert_number('1,000,000')
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_english_format_with_separator_and_delimiter_using_english_language
|
|
65
|
+
I18n.locale = :en
|
|
66
|
+
assert_equal 1234.1, convert_number('1,234.1')
|
|
67
|
+
assert_equal 1234.1, convert_number('1,234.100')
|
|
68
|
+
assert_equal 1234.345, convert_number('+1,234.345')
|
|
69
|
+
assert_equal -1234.345, convert_number('-1,234.345')
|
|
70
|
+
assert_equal 1234000.1, convert_number('1,234,000.100')
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_english_format_with_decimal_separator_using_spanish_language
|
|
74
|
+
I18n.locale = :es
|
|
75
|
+
assert_equal 0.1, convert_number('.1')
|
|
76
|
+
assert_equal 0.1, convert_number('0.1')
|
|
77
|
+
assert_equal 0.12, convert_number('+0.12')
|
|
78
|
+
assert_equal -0.12, convert_number('-0.12')
|
|
79
|
+
assert_equal 9.1, convert_number('9.1')
|
|
80
|
+
assert_equal 90.1, convert_number('90.1')
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_spanish_format_with_decimal_separator_using_spanish_language
|
|
84
|
+
I18n.locale = :es
|
|
85
|
+
assert_equal 0.1, convert_number(',1')
|
|
86
|
+
assert_equal 0.1, convert_number(',100')
|
|
87
|
+
assert_equal 0.1, convert_number('0,1')
|
|
88
|
+
assert_equal 0.345, convert_number('0,345')
|
|
89
|
+
assert_equal 0.345, convert_number('+0,345')
|
|
90
|
+
assert_equal -0.345, convert_number('-0,345')
|
|
91
|
+
assert_equal 9.1, convert_number('9,1')
|
|
92
|
+
assert_equal 90.1, convert_number('90,1')
|
|
93
|
+
assert_equal 9.1, convert_number('9,100')
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_spanish_format_with_thousand_delimiter_using_spanish_language
|
|
97
|
+
I18n.locale = :es
|
|
98
|
+
assert_equal 1000, convert_number('1.000')
|
|
99
|
+
assert_equal 1000, convert_number('+1.000')
|
|
100
|
+
assert_equal -1000, convert_number('-1.000')
|
|
101
|
+
assert_equal 1000000, convert_number('1.000.000')
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def test_spanish_format_with_separator_and_decimal_using_spanish_language
|
|
105
|
+
I18n.locale = :es
|
|
106
|
+
assert_equal 1230.1, convert_number('1.230,1')
|
|
107
|
+
assert_equal 1230.1, convert_number('1.230,100')
|
|
108
|
+
assert_equal 1234.345, convert_number('+1.234,345')
|
|
109
|
+
assert_equal -1234.345, convert_number('-1.234,345')
|
|
110
|
+
assert_equal 1234000.1, convert_number('1.234.000,100')
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def test_english_currency_format_with_decimal_separator_using_russian_language
|
|
114
|
+
I18n.locale = :ru
|
|
115
|
+
assert_equal 0.1, convert_number('.1', :currency)
|
|
116
|
+
assert_equal 0.1, convert_number('0.1', :currency)
|
|
117
|
+
assert_equal 0.12, convert_number('+0.12', :currency)
|
|
118
|
+
assert_equal -0.12, convert_number('-0.12', :currency)
|
|
119
|
+
assert_equal 9.1, convert_number('9.1', :currency)
|
|
120
|
+
assert_equal 90.1, convert_number('90.1', :currency)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def test_russian_currency_format_with_decimal_separator_using_russian_language
|
|
124
|
+
I18n.locale = :ru
|
|
125
|
+
assert_equal 0.1, convert_number(',1', :currency)
|
|
126
|
+
assert_equal 0.1, convert_number(',100', :currency)
|
|
127
|
+
assert_equal 0.1, convert_number('0,1', :currency)
|
|
128
|
+
assert_equal 0.345, convert_number('0,345', :currency)
|
|
129
|
+
assert_equal 0.345, convert_number('+0,345', :currency)
|
|
130
|
+
assert_equal -0.345, convert_number('-0,345', :currency)
|
|
131
|
+
assert_equal 9.1, convert_number('9,1', :currency)
|
|
132
|
+
assert_equal 90.1, convert_number('90,1', :currency)
|
|
133
|
+
assert_equal 9.1, convert_number('9,100', :currency)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def test_english_format_with_decimal_separator_with_no_localized_format
|
|
137
|
+
I18n.locale = :ru
|
|
138
|
+
assert_equal 0.1, convert_number('.1')
|
|
139
|
+
assert_equal 0.1, convert_number('0.1')
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
private
|
|
143
|
+
def convert_number(value, format = nil)
|
|
144
|
+
record = NumberModel.new
|
|
145
|
+
@config.columns[:number].options[:format] = format unless format.nil?
|
|
146
|
+
update_record_from_params(record, @config.create.columns, HashWithIndifferentAccess.new({:number => value}))
|
|
147
|
+
record.number
|
|
148
|
+
end
|
|
149
|
+
end
|
data/test/misc/finder_test.rb
CHANGED
|
@@ -12,9 +12,11 @@ class ClassWithFinder
|
|
|
12
12
|
def beginning_of_chain
|
|
13
13
|
active_scaffold_config.model
|
|
14
14
|
end
|
|
15
|
+
def conditional_get_support?; end
|
|
16
|
+
def params; {}; end
|
|
15
17
|
end
|
|
16
18
|
|
|
17
|
-
class FinderTest < Test
|
|
19
|
+
class FinderTest < MiniTest::Test
|
|
18
20
|
def setup
|
|
19
21
|
@klass = ClassWithFinder.new
|
|
20
22
|
@klass.stubs(:active_scaffold_config).returns(mock { stubs(:model).returns(ModelStub) })
|
|
@@ -55,10 +57,7 @@ class FinderTest < Test::Unit::TestCase
|
|
|
55
57
|
assert_equal collection.sort.reverse, @klass.send(:sort_collection_by_column, collection, column, 'desc')
|
|
56
58
|
|
|
57
59
|
collection = ['a', nil, 'b']
|
|
58
|
-
result =
|
|
59
|
-
assert_nothing_raised do
|
|
60
|
-
result = @klass.send(:sort_collection_by_column, collection, column, 'asc')
|
|
61
|
-
end
|
|
60
|
+
result = @klass.send(:sort_collection_by_column, collection, column, 'asc')
|
|
62
61
|
assert_equal [nil, 'a', 'b'], result
|
|
63
62
|
|
|
64
63
|
column.sort_by :method => 'self'
|
|
@@ -68,21 +67,21 @@ class FinderTest < Test::Unit::TestCase
|
|
|
68
67
|
|
|
69
68
|
def test_count_with_group
|
|
70
69
|
@klass.expects(:custom_finder_options).returns({:group => :a})
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
relation_class.any_instance.expects(:count).returns({'foo' => 5, 'bar' => 4})
|
|
71
|
+
relation_class.any_instance.expects(:limit).with(20).returns(ModelStub.where(nil))
|
|
72
|
+
relation_class.any_instance.expects(:offset).with(0).returns(ModelStub.where(nil))
|
|
74
73
|
page = @klass.send :find_page, :per_page => 20, :pagination => true
|
|
75
74
|
page.items
|
|
76
75
|
|
|
77
76
|
assert_kind_of Integer, page.pager.count
|
|
78
|
-
assert_equal
|
|
79
|
-
|
|
77
|
+
assert_equal 2, page.pager.count
|
|
78
|
+
assert_equal 1, page.pager.number_of_pages
|
|
80
79
|
end
|
|
81
80
|
|
|
82
81
|
def test_disabled_pagination
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
82
|
+
relation_class.any_instance.expects(:count).never
|
|
83
|
+
relation_class.any_instance.expects(:limit).never
|
|
84
|
+
relation_class.any_instance.expects(:offset).never
|
|
86
85
|
ModelStub.expects(:count).never
|
|
87
86
|
page = @klass.send :find_page, :per_page => 20, :pagination => false
|
|
88
87
|
page.items
|
|
@@ -92,4 +91,9 @@ class FinderTest < Test::Unit::TestCase
|
|
|
92
91
|
ModelStub.expects(:count).never
|
|
93
92
|
page = @klass.send :find_page, :pagination => :infinite
|
|
94
93
|
end
|
|
94
|
+
|
|
95
|
+
private
|
|
96
|
+
def relation_class
|
|
97
|
+
@klass.active_scaffold_config.model.send(:relation).class
|
|
98
|
+
end
|
|
95
99
|
end
|
data/test/misc/lang_test.rb
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class TablelessTest < MiniTest::Test
|
|
4
|
+
def test_find_all
|
|
5
|
+
assert_equal [], FileModel.all
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def test_find_by_id
|
|
9
|
+
assert_raises ActiveRecord::RecordNotFound do
|
|
10
|
+
FileModel.find('filename')
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_find_with_association
|
|
15
|
+
assert_equal [], Person.new.files
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|