grape 1.5.2 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +47 -0
  3. data/CONTRIBUTING.md +2 -1
  4. data/README.md +33 -3
  5. data/UPGRADING.md +71 -2
  6. data/grape.gemspec +5 -5
  7. data/lib/grape/api/instance.rb +13 -17
  8. data/lib/grape/api.rb +18 -13
  9. data/lib/grape/cookies.rb +2 -0
  10. data/lib/grape/dsl/desc.rb +3 -5
  11. data/lib/grape/dsl/headers.rb +5 -2
  12. data/lib/grape/dsl/helpers.rb +7 -5
  13. data/lib/grape/dsl/inside_route.rb +17 -8
  14. data/lib/grape/dsl/middleware.rb +4 -4
  15. data/lib/grape/dsl/parameters.rb +3 -3
  16. data/lib/grape/dsl/request_response.rb +9 -6
  17. data/lib/grape/dsl/routing.rb +2 -2
  18. data/lib/grape/dsl/settings.rb +5 -5
  19. data/lib/grape/endpoint.rb +21 -36
  20. data/lib/grape/error_formatter/json.rb +2 -6
  21. data/lib/grape/error_formatter/xml.rb +2 -6
  22. data/lib/grape/exceptions/empty_message_body.rb +11 -0
  23. data/lib/grape/exceptions/validation.rb +1 -2
  24. data/lib/grape/formatter/json.rb +1 -0
  25. data/lib/grape/formatter/serializable_hash.rb +2 -1
  26. data/lib/grape/formatter/xml.rb +1 -0
  27. data/lib/grape/locale/en.yml +1 -1
  28. data/lib/grape/middleware/auth/dsl.rb +7 -1
  29. data/lib/grape/middleware/base.rb +3 -1
  30. data/lib/grape/middleware/formatter.rb +4 -4
  31. data/lib/grape/middleware/stack.rb +2 -2
  32. data/lib/grape/middleware/versioner/accept_version_header.rb +3 -5
  33. data/lib/grape/middleware/versioner/header.rb +6 -4
  34. data/lib/grape/middleware/versioner/param.rb +1 -0
  35. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -1
  36. data/lib/grape/middleware/versioner/path.rb +2 -0
  37. data/lib/grape/parser/json.rb +1 -1
  38. data/lib/grape/parser/xml.rb +1 -1
  39. data/lib/grape/path.rb +1 -0
  40. data/lib/grape/request.rb +3 -0
  41. data/lib/grape/router/pattern.rb +1 -1
  42. data/lib/grape/router/route.rb +2 -2
  43. data/lib/grape/router.rb +6 -0
  44. data/lib/grape/util/inheritable_setting.rb +1 -3
  45. data/lib/grape/util/lazy_value.rb +3 -2
  46. data/lib/grape/util/strict_hash_configuration.rb +1 -1
  47. data/lib/grape/validations/params_scope.rb +88 -55
  48. data/lib/grape/validations/types/custom_type_coercer.rb +1 -2
  49. data/lib/grape/validations/types/dry_type_coercer.rb +1 -1
  50. data/lib/grape/validations/types/json.rb +2 -1
  51. data/lib/grape/validations/types/primitive_coercer.rb +3 -3
  52. data/lib/grape/validations/validators/all_or_none.rb +8 -5
  53. data/lib/grape/validations/validators/allow_blank.rb +9 -7
  54. data/lib/grape/validations/validators/as.rb +6 -8
  55. data/lib/grape/validations/validators/at_least_one_of.rb +7 -4
  56. data/lib/grape/validations/validators/base.rb +75 -70
  57. data/lib/grape/validations/validators/coerce.rb +63 -79
  58. data/lib/grape/validations/validators/default.rb +37 -34
  59. data/lib/grape/validations/validators/exactly_one_of.rb +9 -6
  60. data/lib/grape/validations/validators/except_values.rb +13 -11
  61. data/lib/grape/validations/validators/multiple_params_base.rb +24 -20
  62. data/lib/grape/validations/validators/mutual_exclusion.rb +8 -5
  63. data/lib/grape/validations/validators/presence.rb +7 -4
  64. data/lib/grape/validations/validators/regexp.rb +8 -5
  65. data/lib/grape/validations/validators/same_as.rb +18 -15
  66. data/lib/grape/validations/validators/values.rb +61 -56
  67. data/lib/grape/validations.rb +6 -0
  68. data/lib/grape/version.rb +1 -1
  69. data/lib/grape.rb +4 -1
  70. data/spec/grape/api/custom_validations_spec.rb +77 -45
  71. data/spec/grape/api/deeply_included_options_spec.rb +3 -3
  72. data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -1
  73. data/spec/grape/api/invalid_format_spec.rb +2 -0
  74. data/spec/grape/api/recognize_path_spec.rb +1 -1
  75. data/spec/grape/api/routes_with_requirements_spec.rb +8 -8
  76. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -15
  77. data/spec/grape/api_remount_spec.rb +16 -15
  78. data/spec/grape/api_spec.rb +510 -220
  79. data/spec/grape/dsl/callbacks_spec.rb +2 -1
  80. data/spec/grape/dsl/headers_spec.rb +39 -9
  81. data/spec/grape/dsl/helpers_spec.rb +3 -2
  82. data/spec/grape/dsl/inside_route_spec.rb +6 -4
  83. data/spec/grape/dsl/logger_spec.rb +16 -18
  84. data/spec/grape/dsl/middleware_spec.rb +2 -1
  85. data/spec/grape/dsl/parameters_spec.rb +2 -0
  86. data/spec/grape/dsl/request_response_spec.rb +1 -0
  87. data/spec/grape/dsl/routing_spec.rb +10 -7
  88. data/spec/grape/endpoint/declared_spec.rb +259 -12
  89. data/spec/grape/endpoint_spec.rb +77 -55
  90. data/spec/grape/entity_spec.rb +22 -22
  91. data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -0
  92. data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -22
  93. data/spec/grape/exceptions/validation_errors_spec.rb +13 -10
  94. data/spec/grape/exceptions/validation_spec.rb +5 -3
  95. data/spec/grape/extensions/param_builders/hash_spec.rb +7 -7
  96. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -8
  97. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -8
  98. data/spec/grape/integration/rack_sendfile_spec.rb +1 -1
  99. data/spec/grape/loading_spec.rb +8 -8
  100. data/spec/grape/middleware/auth/dsl_spec.rb +15 -6
  101. data/spec/grape/middleware/auth/strategies_spec.rb +60 -20
  102. data/spec/grape/middleware/base_spec.rb +24 -15
  103. data/spec/grape/middleware/error_spec.rb +2 -2
  104. data/spec/grape/middleware/exception_spec.rb +111 -161
  105. data/spec/grape/middleware/formatter_spec.rb +27 -6
  106. data/spec/grape/middleware/globals_spec.rb +7 -4
  107. data/spec/grape/middleware/stack_spec.rb +14 -12
  108. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -1
  109. data/spec/grape/middleware/versioner/header_spec.rb +14 -13
  110. data/spec/grape/middleware/versioner/param_spec.rb +7 -1
  111. data/spec/grape/middleware/versioner/path_spec.rb +5 -1
  112. data/spec/grape/middleware/versioner_spec.rb +1 -1
  113. data/spec/grape/parser_spec.rb +4 -0
  114. data/spec/grape/path_spec.rb +52 -52
  115. data/spec/grape/presenters/presenter_spec.rb +7 -6
  116. data/spec/grape/request_spec.rb +6 -4
  117. data/spec/grape/util/inheritable_setting_spec.rb +7 -7
  118. data/spec/grape/util/inheritable_values_spec.rb +3 -2
  119. data/spec/grape/util/reverse_stackable_values_spec.rb +3 -1
  120. data/spec/grape/util/stackable_values_spec.rb +7 -5
  121. data/spec/grape/validations/instance_behaivour_spec.rb +9 -10
  122. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -0
  123. data/spec/grape/validations/params_scope_spec.rb +46 -10
  124. data/spec/grape/validations/single_attribute_iterator_spec.rb +2 -1
  125. data/spec/grape/validations/types/primitive_coercer_spec.rb +4 -4
  126. data/spec/grape/validations/types_spec.rb +8 -8
  127. data/spec/grape/validations/validators/all_or_none_spec.rb +50 -56
  128. data/spec/grape/validations/validators/allow_blank_spec.rb +136 -140
  129. data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -56
  130. data/spec/grape/validations/validators/coerce_spec.rb +99 -22
  131. data/spec/grape/validations/validators/default_spec.rb +72 -78
  132. data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -77
  133. data/spec/grape/validations/validators/except_values_spec.rb +3 -3
  134. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -77
  135. data/spec/grape/validations/validators/presence_spec.rb +16 -1
  136. data/spec/grape/validations/validators/regexp_spec.rb +25 -31
  137. data/spec/grape/validations/validators/same_as_spec.rb +14 -20
  138. data/spec/grape/validations/validators/values_spec.rb +183 -178
  139. data/spec/grape/validations_spec.rb +99 -58
  140. data/spec/integration/eager_load/eager_load_spec.rb +2 -2
  141. data/spec/integration/multi_json/json_spec.rb +1 -1
  142. data/spec/integration/multi_xml/xml_spec.rb +1 -1
  143. data/spec/shared/versioning_examples.rb +12 -9
  144. data/spec/spec_helper.rb +12 -2
  145. data/spec/support/basic_auth_encode_helpers.rb +1 -1
  146. metadata +102 -101
@@ -489,17 +489,24 @@ describe Grape::Validations do
489
489
  end
490
490
 
491
491
  context 'custom validator for a Hash' do
492
- module ValuesSpec
493
- module DateRangeValidations
494
- class DateRangeValidator < Grape::Validations::Base
495
- def validate_param!(attr_name, params)
496
- return if params[attr_name][:from] <= params[attr_name][:to]
497
- raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: "'from' must be lower or equal to 'to'")
498
- end
492
+ let(:date_range_validator) do
493
+ Class.new(Grape::Validations::Validators::Base) do
494
+ def validate_param!(attr_name, params)
495
+ return if params[attr_name][:from] <= params[attr_name][:to]
496
+
497
+ raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: "'from' must be lower or equal to 'to'")
499
498
  end
500
499
  end
501
500
  end
502
501
 
502
+ before do
503
+ described_class.register_validator('date_range', date_range_validator)
504
+ end
505
+
506
+ after do
507
+ described_class.deregister_validator('date_range')
508
+ end
509
+
503
510
  before do
504
511
  subject.params do
505
512
  optional :date_range, date_range: true, type: Hash do
@@ -887,13 +894,13 @@ describe Grape::Validations do
887
894
  context <<~DESC do
888
895
  Issue occurs whenever:
889
896
  * param structure with at least three levels
890
- * 1st level item is a required Array that has >1 entry with an optional item present and >1 entry with an optional item missing
891
- * 2nd level is an optional Array or Hash
897
+ * 1st level item is a required Array that has >1 entry with an optional item present and >1 entry with an optional item missing#{' '}
898
+ * 2nd level is an optional Array or Hash#{' '}
892
899
  * 3rd level is a required item (can be any type)
893
900
  * additional levels do not effect the issue from occuring
894
901
  DESC
895
902
 
896
- it "example based off actual real world use case" do
903
+ it 'example based off actual real world use case' do
897
904
  subject.params do
898
905
  requires :orders, type: Array do
899
906
  requires :id, type: Integer
@@ -911,17 +918,17 @@ describe Grape::Validations do
911
918
 
912
919
  data = {
913
920
  orders: [
914
- { id: 77, drugs: [{batches: [{batch_no: "A1234567"}]}]},
921
+ { id: 77, drugs: [{ batches: [{ batch_no: 'A1234567' }] }] },
915
922
  { id: 70 }
916
923
  ]
917
924
  }
918
925
 
919
926
  get '/validate_required_arrays_under_optional_arrays', data
920
- expect(last_response.body).to eq("validate_required_arrays_under_optional_arrays works!")
927
+ expect(last_response.body).to eq('validate_required_arrays_under_optional_arrays works!')
921
928
  expect(last_response.status).to eq(200)
922
929
  end
923
930
 
924
- it "simplest example using Array -> Array -> Hash -> String" do
931
+ it 'simplest example using Array -> Array -> Hash -> String' do
925
932
  subject.params do
926
933
  requires :orders, type: Array do
927
934
  requires :id, type: Integer
@@ -937,17 +944,17 @@ describe Grape::Validations do
937
944
 
938
945
  data = {
939
946
  orders: [
940
- { id: 77, drugs: [{batch_no: "A1234567"}]},
947
+ { id: 77, drugs: [{ batch_no: 'A1234567' }] },
941
948
  { id: 70 }
942
949
  ]
943
950
  }
944
951
 
945
952
  get '/validate_required_arrays_under_optional_arrays', data
946
- expect(last_response.body).to eq("validate_required_arrays_under_optional_arrays works!")
953
+ expect(last_response.body).to eq('validate_required_arrays_under_optional_arrays works!')
947
954
  expect(last_response.status).to eq(200)
948
955
  end
949
956
 
950
- it "simplest example using Array -> Hash -> String" do
957
+ it 'simplest example using Array -> Hash -> String' do
951
958
  subject.params do
952
959
  requires :orders, type: Array do
953
960
  requires :id, type: Integer
@@ -963,17 +970,17 @@ describe Grape::Validations do
963
970
 
964
971
  data = {
965
972
  orders: [
966
- { id: 77, drugs: {batch_no: "A1234567"}},
973
+ { id: 77, drugs: { batch_no: 'A1234567' } },
967
974
  { id: 70 }
968
975
  ]
969
976
  }
970
977
 
971
978
  get '/validate_required_arrays_under_optional_arrays', data
972
- expect(last_response.body).to eq("validate_required_arrays_under_optional_arrays works!")
979
+ expect(last_response.body).to eq('validate_required_arrays_under_optional_arrays works!')
973
980
  expect(last_response.status).to eq(200)
974
981
  end
975
982
 
976
- it "correctly indexes invalida data" do
983
+ it 'correctly indexes invalida data' do
977
984
  subject.params do
978
985
  requires :orders, type: Array do
979
986
  requires :id, type: Integer
@@ -991,16 +998,16 @@ describe Grape::Validations do
991
998
  data = {
992
999
  orders: [
993
1000
  { id: 70 },
994
- { id: 77, drugs: [{batch_no: "A1234567", quantity: 12}, {batch_no: "B222222"}]}
1001
+ { id: 77, drugs: [{ batch_no: 'A1234567', quantity: 12 }, { batch_no: 'B222222' }] }
995
1002
  ]
996
1003
  }
997
1004
 
998
1005
  get '/correctly_indexes', data
999
- expect(last_response.body).to eq("orders[1][drugs][1][quantity] is missing")
1006
+ expect(last_response.body).to eq('orders[1][drugs][1][quantity] is missing')
1000
1007
  expect(last_response.status).to eq(400)
1001
1008
  end
1002
1009
 
1003
- context "multiple levels of optional and requires settings" do
1010
+ context 'multiple levels of optional and requires settings' do
1004
1011
  before do
1005
1012
  subject.params do
1006
1013
  requires :top, type: Array do
@@ -1022,53 +1029,62 @@ describe Grape::Validations do
1022
1029
  end
1023
1030
  end
1024
1031
 
1025
- it "with valid data" do
1032
+ it 'with valid data' do
1026
1033
  data = {
1027
1034
  top: [
1028
1035
  { top_id: 1, middle_1: [
1029
- {middle_1_id: 11}, {middle_1_id: 12, middle_2: [
1030
- {middle_2_id: 121}, {middle_2_id: 122, bottom: [{bottom_id: 1221}]}]}]},
1036
+ { middle_1_id: 11 }, { middle_1_id: 12, middle_2: [
1037
+ { middle_2_id: 121 }, { middle_2_id: 122, bottom: [{ bottom_id: 1221 }] }
1038
+ ] }
1039
+ ] },
1031
1040
  { top_id: 2, middle_1: [
1032
- {middle_1_id: 21}, {middle_1_id: 22, middle_2: [
1033
- {middle_2_id: 221}]}]},
1041
+ { middle_1_id: 21 }, { middle_1_id: 22, middle_2: [
1042
+ { middle_2_id: 221 }
1043
+ ] }
1044
+ ] },
1034
1045
  { top_id: 3, middle_1: [
1035
- {middle_1_id: 31}, {middle_1_id: 32}]},
1046
+ { middle_1_id: 31 }, { middle_1_id: 32 }
1047
+ ] },
1036
1048
  { top_id: 4 }
1037
1049
  ]
1038
1050
  }
1039
1051
 
1040
1052
  get '/multi_level', data
1041
- expect(last_response.body).to eq("multi_level works!")
1053
+ expect(last_response.body).to eq('multi_level works!')
1042
1054
  expect(last_response.status).to eq(200)
1043
1055
  end
1044
1056
 
1045
- it "with invalid data" do
1057
+ it 'with invalid data' do
1046
1058
  data = {
1047
1059
  top: [
1048
1060
  { top_id: 1, middle_1: [
1049
- {middle_1_id: 11}, {middle_1_id: 12, middle_2: [
1050
- {middle_2_id: 121}, {middle_2_id: 122, bottom: [{bottom_id: nil}]}]}]},
1061
+ { middle_1_id: 11 }, { middle_1_id: 12, middle_2: [
1062
+ { middle_2_id: 121 }, { middle_2_id: 122, bottom: [{ bottom_id: nil }] }
1063
+ ] }
1064
+ ] },
1051
1065
  { top_id: 2, middle_1: [
1052
- {middle_1_id: 21}, {middle_1_id: 22, middle_2: [{middle_2_id: nil}]}]},
1066
+ { middle_1_id: 21 }, { middle_1_id: 22, middle_2: [{ middle_2_id: nil }] }
1067
+ ] },
1053
1068
  { top_id: 3, middle_1: [
1054
- {middle_1_id: nil}, {middle_1_id: 32}]},
1069
+ { middle_1_id: nil }, { middle_1_id: 32 }
1070
+ ] },
1055
1071
  { top_id: nil, missing_top_id: 4 }
1056
1072
  ]
1057
1073
  }
1058
1074
  # debugger
1059
1075
  get '/multi_level', data
1060
- expect(last_response.body.split(", ")).to match_array([
1061
- "top[3][top_id] is empty",
1062
- "top[2][middle_1][0][middle_1_id] is empty",
1063
- "top[1][middle_1][1][middle_2][0][middle_2_id] is empty",
1064
- "top[0][middle_1][1][middle_2][1][bottom][0][bottom_id] is empty"
1065
- ])
1076
+ expect(last_response.body.split(', ')).to match_array([
1077
+ 'top[3][top_id] is empty',
1078
+ 'top[2][middle_1][0][middle_1_id] is empty',
1079
+ 'top[1][middle_1][1][middle_2][0][middle_2_id] is empty',
1080
+ 'top[0][middle_1][1][middle_2][1][bottom][0][bottom_id] is empty'
1081
+ ])
1066
1082
  expect(last_response.status).to eq(400)
1067
1083
  end
1068
1084
  end
1069
1085
  end
1070
1086
 
1071
- it "exactly_one_of" do
1087
+ it 'exactly_one_of' do
1072
1088
  subject.params do
1073
1089
  requires :orders, type: Array do
1074
1090
  requires :id, type: Integer
@@ -1086,17 +1102,17 @@ describe Grape::Validations do
1086
1102
 
1087
1103
  data = {
1088
1104
  orders: [
1089
- { id: 77, drugs: {batch_no: "A1234567"}},
1105
+ { id: 77, drugs: { batch_no: 'A1234567' } },
1090
1106
  { id: 70 }
1091
1107
  ]
1092
1108
  }
1093
1109
 
1094
1110
  get '/exactly_one_of', data
1095
- expect(last_response.body).to eq("exactly_one_of works!")
1111
+ expect(last_response.body).to eq('exactly_one_of works!')
1096
1112
  expect(last_response.status).to eq(200)
1097
1113
  end
1098
1114
 
1099
- it "at_least_one_of" do
1115
+ it 'at_least_one_of' do
1100
1116
  subject.params do
1101
1117
  requires :orders, type: Array do
1102
1118
  requires :id, type: Integer
@@ -1114,17 +1130,17 @@ describe Grape::Validations do
1114
1130
 
1115
1131
  data = {
1116
1132
  orders: [
1117
- { id: 77, drugs: {batch_no: "A1234567"}},
1133
+ { id: 77, drugs: { batch_no: 'A1234567' } },
1118
1134
  { id: 70 }
1119
1135
  ]
1120
1136
  }
1121
1137
 
1122
1138
  get '/at_least_one_of', data
1123
- expect(last_response.body).to eq("at_least_one_of works!")
1139
+ expect(last_response.body).to eq('at_least_one_of works!')
1124
1140
  expect(last_response.status).to eq(200)
1125
1141
  end
1126
1142
 
1127
- it "all_or_none_of" do
1143
+ it 'all_or_none_of' do
1128
1144
  subject.params do
1129
1145
  requires :orders, type: Array do
1130
1146
  requires :id, type: Integer
@@ -1142,13 +1158,13 @@ describe Grape::Validations do
1142
1158
 
1143
1159
  data = {
1144
1160
  orders: [
1145
- { id: 77, drugs: {batch_no: "A1234567", batch_id: "12"}},
1161
+ { id: 77, drugs: { batch_no: 'A1234567', batch_id: '12' } },
1146
1162
  { id: 70 }
1147
1163
  ]
1148
1164
  }
1149
1165
 
1150
1166
  get '/all_or_none_of', data
1151
- expect(last_response.body).to eq("all_or_none_of works!")
1167
+ expect(last_response.body).to eq('all_or_none_of works!')
1152
1168
  expect(last_response.status).to eq(200)
1153
1169
  end
1154
1170
  end
@@ -1173,15 +1189,24 @@ describe Grape::Validations do
1173
1189
  end
1174
1190
 
1175
1191
  context 'custom validation' do
1176
- module CustomValidations
1177
- class Customvalidator < Grape::Validations::Base
1192
+ let(:custom_validator) do
1193
+ Class.new(Grape::Validations::Validators::Base) do
1178
1194
  def validate_param!(attr_name, params)
1179
1195
  return if params[attr_name] == 'im custom'
1196
+
1180
1197
  raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: 'is not custom!')
1181
1198
  end
1182
1199
  end
1183
1200
  end
1184
1201
 
1202
+ before do
1203
+ described_class.register_validator('customvalidator', custom_validator)
1204
+ end
1205
+
1206
+ after do
1207
+ described_class.deregister_validator('customvalidator')
1208
+ end
1209
+
1185
1210
  context 'when using optional with a custom validator' do
1186
1211
  before do
1187
1212
  subject.params do
@@ -1321,15 +1346,24 @@ describe Grape::Validations do
1321
1346
  end
1322
1347
 
1323
1348
  context 'when using options on param' do
1324
- module CustomValidations
1325
- class CustomvalidatorWithOptions < Grape::Validations::Base
1349
+ let(:custom_validator_with_options) do
1350
+ Class.new(Grape::Validations::Validators::Base) do
1326
1351
  def validate_param!(attr_name, params)
1327
1352
  return if params[attr_name] == @option[:text]
1353
+
1328
1354
  raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: message)
1329
1355
  end
1330
1356
  end
1331
1357
  end
1332
1358
 
1359
+ before do
1360
+ described_class.register_validator('customvalidator_with_options', custom_validator_with_options)
1361
+ end
1362
+
1363
+ after do
1364
+ described_class.deregister_validator('customvalidator_with_options')
1365
+ end
1366
+
1333
1367
  before do
1334
1368
  subject.params do
1335
1369
  optional :custom, customvalidator_with_options: { text: 'im custom with options', message: 'is not custom with options!' }
@@ -1424,21 +1458,25 @@ describe Grape::Validations do
1424
1458
  }
1425
1459
  end
1426
1460
  end
1461
+
1427
1462
  it 'returns defaults' do
1428
1463
  get '/order'
1429
1464
  expect(last_response.status).to eq(200)
1430
1465
  expect(last_response.body).to eq({ order: :asc, order_by: :created_at }.to_json)
1431
1466
  end
1467
+
1432
1468
  it 'overrides default value for order' do
1433
1469
  get '/order?order=desc'
1434
1470
  expect(last_response.status).to eq(200)
1435
1471
  expect(last_response.body).to eq({ order: :desc, order_by: :created_at }.to_json)
1436
1472
  end
1473
+
1437
1474
  it 'overrides default value for order_by' do
1438
1475
  get '/order?order_by=name'
1439
1476
  expect(last_response.status).to eq(200)
1440
1477
  expect(last_response.body).to eq({ order: :asc, order_by: :name }.to_json)
1441
1478
  end
1479
+
1442
1480
  it 'fails with invalid value' do
1443
1481
  get '/order?order=invalid'
1444
1482
  expect(last_response.status).to eq(400)
@@ -1463,7 +1501,7 @@ describe Grape::Validations do
1463
1501
 
1464
1502
  context 'all or none' do
1465
1503
  context 'optional params' do
1466
- before :each do
1504
+ before do
1467
1505
  subject.resource :custom_message do
1468
1506
  params do
1469
1507
  optional :beer
@@ -1476,17 +1514,20 @@ describe Grape::Validations do
1476
1514
  end
1477
1515
  end
1478
1516
  end
1517
+
1479
1518
  context 'with a custom validation message' do
1480
1519
  it 'errors when any one is present' do
1481
1520
  get '/custom_message/all_or_none', beer: 'string'
1482
1521
  expect(last_response.status).to eq(400)
1483
1522
  expect(last_response.body).to eq 'beer, wine, juice all params are required or none is required'
1484
1523
  end
1524
+
1485
1525
  it 'works when all params are present' do
1486
1526
  get '/custom_message/all_or_none', beer: 'string', wine: 'anotherstring', juice: 'anotheranotherstring'
1487
1527
  expect(last_response.status).to eq(200)
1488
1528
  expect(last_response.body).to eq 'all_or_none works!'
1489
1529
  end
1530
+
1490
1531
  it 'works when none are present' do
1491
1532
  get '/custom_message/all_or_none'
1492
1533
  expect(last_response.status).to eq(200)
@@ -1650,7 +1691,7 @@ describe Grape::Validations do
1650
1691
 
1651
1692
  context 'exactly one of' do
1652
1693
  context 'params' do
1653
- before :each do
1694
+ before do
1654
1695
  subject.resources :custom_message do
1655
1696
  params do
1656
1697
  optional :beer
@@ -1714,7 +1755,7 @@ describe Grape::Validations do
1714
1755
  end
1715
1756
 
1716
1757
  context 'nested params' do
1717
- before :each do
1758
+ before do
1718
1759
  subject.params do
1719
1760
  requires :nested, type: Hash do
1720
1761
  optional :beer_nested
@@ -1756,7 +1797,7 @@ describe Grape::Validations do
1756
1797
 
1757
1798
  context 'at least one of' do
1758
1799
  context 'params' do
1759
- before :each do
1800
+ before do
1760
1801
  subject.resources :custom_message do
1761
1802
  params do
1762
1803
  optional :beer
@@ -1820,7 +1861,7 @@ describe Grape::Validations do
1820
1861
  end
1821
1862
 
1822
1863
  context 'nested params' do
1823
- before :each do
1864
+ before do
1824
1865
  subject.params do
1825
1866
  requires :nested, type: Hash do
1826
1867
  optional :beer
@@ -6,10 +6,10 @@ require 'grape'
6
6
  describe Grape do
7
7
  it 'eager_load!' do
8
8
  require 'grape/eager_load'
9
- expect { Grape.eager_load! }.to_not raise_error
9
+ expect { described_class.eager_load! }.not_to raise_error
10
10
  end
11
11
 
12
12
  it 'compile!' do
13
- expect { Class.new(Grape::API).compile! }.to_not raise_error
13
+ expect { Class.new(Grape::API).compile! }.not_to raise_error
14
14
  end
15
15
  end
@@ -4,6 +4,6 @@ require 'spec_helper'
4
4
 
5
5
  describe Grape::Json do
6
6
  it 'uses multi_json' do
7
- expect(Grape::Json).to eq(::MultiJson)
7
+ expect(described_class).to eq(::MultiJson)
8
8
  end
9
9
  end
@@ -4,6 +4,6 @@ require 'spec_helper'
4
4
 
5
5
  describe Grape::Xml do
6
6
  it 'uses multi_xml' do
7
- expect(Grape::Xml).to eq(::MultiXml)
7
+ expect(described_class).to eq(::MultiXml)
8
8
  end
9
9
  end
@@ -35,14 +35,14 @@ shared_examples_for 'versioning' do
35
35
  end
36
36
 
37
37
  versioned_get '/awesome', 'v1', **macro_options
38
- expect(last_response.status).to eql 404
38
+ expect(last_response.status).to be 404
39
39
 
40
40
  versioned_get '/awesome', 'v2', **macro_options
41
- expect(last_response.status).to eql 200
41
+ expect(last_response.status).to be 200
42
42
  versioned_get '/legacy', 'v1', **macro_options
43
- expect(last_response.status).to eql 200
43
+ expect(last_response.status).to be 200
44
44
  versioned_get '/legacy', 'v2', **macro_options
45
- expect(last_response.status).to eql 404
45
+ expect(last_response.status).to be 404
46
46
  end
47
47
 
48
48
  it 'is able to specify multiple versions' do
@@ -52,11 +52,11 @@ shared_examples_for 'versioning' do
52
52
  end
53
53
 
54
54
  versioned_get '/awesome', 'v1', **macro_options
55
- expect(last_response.status).to eql 200
55
+ expect(last_response.status).to be 200
56
56
  versioned_get '/awesome', 'v2', **macro_options
57
- expect(last_response.status).to eql 200
57
+ expect(last_response.status).to be 200
58
58
  versioned_get '/awesome', 'v3', **macro_options
59
- expect(last_response.status).to eql 404
59
+ expect(last_response.status).to be 404
60
60
  end
61
61
 
62
62
  context 'with different versions for the same endpoint' do
@@ -70,7 +70,7 @@ shared_examples_for 'versioning' do
70
70
 
71
71
  subject.version 'v1', macro_options do
72
72
  get 'version' do
73
- 'version ' + request.env['api.version']
73
+ "version #{request.env['api.version']}"
74
74
  end
75
75
  end
76
76
 
@@ -94,7 +94,7 @@ shared_examples_for 'versioning' do
94
94
 
95
95
  subject.version 'v1', macro_options do
96
96
  get 'version' do
97
- 'version ' + request.env['api.version']
97
+ "version #{request.env['api.version']}"
98
98
  end
99
99
  end
100
100
 
@@ -117,6 +117,7 @@ shared_examples_for 'versioning' do
117
117
  before do
118
118
  @output ||= 'v2-'
119
119
  end
120
+
120
121
  get 'version' do
121
122
  @output += 'version'
122
123
  end
@@ -126,6 +127,7 @@ shared_examples_for 'versioning' do
126
127
  before do
127
128
  @output ||= 'v1-'
128
129
  end
130
+
129
131
  get 'version' do
130
132
  @output += 'version'
131
133
  end
@@ -170,6 +172,7 @@ shared_examples_for 'versioning' do
170
172
  end
171
173
  klass
172
174
  end
175
+
173
176
  before do
174
177
  subject.format :txt
175
178
 
data/spec/spec_helper.rb CHANGED
@@ -5,12 +5,21 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'support'))
6
6
 
7
7
  require 'grape'
8
+ require 'test_prof/recipes/rspec/let_it_be'
9
+
10
+ class NullAdapter
11
+ def begin_transaction; end
12
+
13
+ def rollback_transaction; end
14
+ end
15
+
16
+ TestProf::BeforeAll.adapter = NullAdapter.new
8
17
 
9
18
  require 'rubygems'
10
19
  require 'bundler'
11
20
  Bundler.require :default, :test
12
21
 
13
- Dir["#{File.dirname(__FILE__)}/support/*.rb"].each do |file|
22
+ Dir["#{File.dirname(__FILE__)}/support/*.rb"].sort.each do |file|
14
23
  require file
15
24
  end
16
25
 
@@ -27,7 +36,8 @@ RSpec.configure do |config|
27
36
  config.filter_run_when_matching :focus
28
37
  config.warnings = true
29
38
 
30
- config.before(:each) { Grape::Util::InheritableSetting.reset_global! }
39
+ config.before(:all) { Grape::Util::InheritableSetting.reset_global! }
40
+ config.before { Grape::Util::InheritableSetting.reset_global! }
31
41
 
32
42
  # Enable flags like --only-failures and --next-failure
33
43
  config.example_status_persistence_file_path = '.rspec_status'
@@ -4,7 +4,7 @@ module Spec
4
4
  module Support
5
5
  module Helpers
6
6
  def encode_basic_auth(username, password)
7
- 'Basic ' + Base64.encode64("#{username}:#{password}")
7
+ "Basic #{Base64.encode64("#{username}:#{password}")}"
8
8
  end
9
9
  end
10
10
  end