jmeter-ruby 3.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 +7 -0
- data/.gitattributes +22 -0
- data/.github/workflows/ci.yml +54 -0
- data/.gitignore +24 -0
- data/.rspec +1 -0
- data/.ruby-version +1 -0
- data/CHANGES.md +77 -0
- data/Gemfile +23 -0
- data/LICENSE.txt +21 -0
- data/README.md +434 -0
- data/Rakefile +18 -0
- data/examples/OS_process_sampler.rb +24 -0
- data/examples/assertion_results.rb +18 -0
- data/examples/basic_auth.rb +11 -0
- data/examples/browser_headers.rb +7 -0
- data/examples/composite_graph.rb +29 -0
- data/examples/constant_throughput_timer.rb +11 -0
- data/examples/csv_data_set.rb +11 -0
- data/examples/dummy_sampler.rb +9 -0
- data/examples/duration_assertion.rb +10 -0
- data/examples/etsy_login_browse.rb +61 -0
- data/examples/extract.rb +12 -0
- data/examples/foreach_controller.rb +29 -0
- data/examples/header_manager.rb +29 -0
- data/examples/http_cache_manager.rb +11 -0
- data/examples/http_cookie_manager.rb +11 -0
- data/examples/http_request_defaults.rb +11 -0
- data/examples/http_request_post.rb +11 -0
- data/examples/http_request_with_files.rb +13 -0
- data/examples/http_request_with_query_params.rb +8 -0
- data/examples/jmeter_plugins_graphs.rb +22 -0
- data/examples/json_path_assertions.rb +11 -0
- data/examples/json_path_extractor.rb +10 -0
- data/examples/json_path_postprocessor.rb +10 -0
- data/examples/jsr223_assertion.rb +13 -0
- data/examples/ldap_sampler.rb +16 -0
- data/examples/loadosophia.rb +18 -0
- data/examples/loop_controller.rb +10 -0
- data/examples/loops_with_counter.rb +15 -0
- data/examples/once_only_controller.rb +15 -0
- data/examples/perfmon.rb +46 -0
- data/examples/real_custom_methods.rb +19 -0
- data/examples/real_page_objects.rb +41 -0
- data/examples/real_redis_data_set_with_setup.rb +123 -0
- data/examples/real_user_objects_github.rb +112 -0
- data/examples/regular_expression_extractor.rb +12 -0
- data/examples/response_assertion.rb +15 -0
- data/examples/response_time_percentiles_graph.rb +11 -0
- data/examples/rsync.rb +16 -0
- data/examples/sample_transaction.rb +18 -0
- data/examples/simple_data_writer_listener.rb +11 -0
- data/examples/stepping_thread_group.rb +30 -0
- data/examples/test_fragment.rb +14 -0
- data/examples/think_time.rb +15 -0
- data/examples/thread_groups.rb +7 -0
- data/examples/throughput_controller.rb +14 -0
- data/examples/throughput_shaping_timer.rb +20 -0
- data/examples/ultimate_thread_group.rb +39 -0
- data/examples/unicode.rb +8 -0
- data/examples/user_defined_variables.rb +10 -0
- data/examples/user_parameters.rb +28 -0
- data/examples/uuid_per_iteration.rb +15 -0
- data/jmeter-ruby.gemspec +28 -0
- data/lib/jmeter-ruby/DSL.md +235 -0
- data/lib/jmeter-ruby/dsl/access_log_sampler.rb +32 -0
- data/lib/jmeter-ruby/dsl/aggregate_graph.rb +55 -0
- data/lib/jmeter-ruby/dsl/aggregate_report.rb +55 -0
- data/lib/jmeter-ruby/dsl/ajp13_sampler.rb +41 -0
- data/lib/jmeter-ruby/dsl/assertion_results.rb +55 -0
- data/lib/jmeter-ruby/dsl/beanshell_assertion.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_listener.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_postprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_preprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_sampler.rb +28 -0
- data/lib/jmeter-ruby/dsl/beanshell_timer.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_assertion.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_listener.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_postprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_preprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_sampler.rb +28 -0
- data/lib/jmeter-ruby/dsl/bsf_timer.rb +28 -0
- data/lib/jmeter-ruby/dsl/compare_assertion.rb +27 -0
- data/lib/jmeter-ruby/dsl/comparison_assertion_visualizer.rb +55 -0
- data/lib/jmeter-ruby/dsl/constant_throughput_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/constant_timer.rb +25 -0
- data/lib/jmeter-ruby/dsl/counter.rb +31 -0
- data/lib/jmeter-ruby/dsl/cssjquery_extractor.rb +31 -0
- data/lib/jmeter-ruby/dsl/csv_data_set_config.rb +33 -0
- data/lib/jmeter-ruby/dsl/debug_postprocessor.rb +28 -0
- data/lib/jmeter-ruby/dsl/debug_sampler.rb +27 -0
- data/lib/jmeter-ruby/dsl/distribution_graphalpha.rb +55 -0
- data/lib/jmeter-ruby/dsl/duration_assertion.rb +25 -0
- data/lib/jmeter-ruby/dsl/foreach_controller.rb +27 -0
- data/lib/jmeter-ruby/dsl/ftp_request.rb +34 -0
- data/lib/jmeter-ruby/dsl/ftp_request_defaults.rb +32 -0
- data/lib/jmeter-ruby/dsl/gaussian_random_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/generate_summary_results.rb +23 -0
- data/lib/jmeter-ruby/dsl/graph_results.rb +55 -0
- data/lib/jmeter-ruby/dsl/html_assertion.rb +30 -0
- data/lib/jmeter-ruby/dsl/html_link_parser.rb +23 -0
- data/lib/jmeter-ruby/dsl/html_parameter_mask.rb +32 -0
- data/lib/jmeter-ruby/dsl/http_authorization_manager.rb +33 -0
- data/lib/jmeter-ruby/dsl/http_cache_manager.rb +26 -0
- data/lib/jmeter-ruby/dsl/http_cookie_manager.rb +28 -0
- data/lib/jmeter-ruby/dsl/http_header_manager.rb +30 -0
- data/lib/jmeter-ruby/dsl/http_request.rb +41 -0
- data/lib/jmeter-ruby/dsl/http_request_defaults.rb +41 -0
- data/lib/jmeter-ruby/dsl/http_url_rewriting_modifier.rb +30 -0
- data/lib/jmeter-ruby/dsl/if_controller.rb +27 -0
- data/lib/jmeter-ruby/dsl/include_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/java_request.rb +69 -0
- data/lib/jmeter-ruby/dsl/java_request_defaults.rb +69 -0
- data/lib/jmeter-ruby/dsl/jdbc_connection_configuration.rb +37 -0
- data/lib/jmeter-ruby/dsl/jdbc_postprocessor.rb +33 -0
- data/lib/jmeter-ruby/dsl/jdbc_preprocessor.rb +33 -0
- data/lib/jmeter-ruby/dsl/jdbc_request.rb +33 -0
- data/lib/jmeter-ruby/dsl/jms_pointtopoint.rb +41 -0
- data/lib/jmeter-ruby/dsl/jms_publisher.rb +43 -0
- data/lib/jmeter-ruby/dsl/jms_subscriber.rb +35 -0
- data/lib/jmeter-ruby/dsl/json_path_postprocessor.rb +27 -0
- data/lib/jmeter-ruby/dsl/jsr223_assertion.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_listener.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_postprocessor.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_preprocessor.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_sampler.rb +29 -0
- data/lib/jmeter-ruby/dsl/jsr223_timer.rb +29 -0
- data/lib/jmeter-ruby/dsl/junit_request.rb +37 -0
- data/lib/jmeter-ruby/dsl/keystore_configuration.rb +28 -0
- data/lib/jmeter-ruby/dsl/ldap_extended_request.rb +42 -0
- data/lib/jmeter-ruby/dsl/ldap_extended_request_defaults.rb +42 -0
- data/lib/jmeter-ruby/dsl/ldap_request.rb +35 -0
- data/lib/jmeter-ruby/dsl/ldap_request_defaults.rb +39 -0
- data/lib/jmeter-ruby/dsl/login_config_element.rb +26 -0
- data/lib/jmeter-ruby/dsl/loop_controller.rb +26 -0
- data/lib/jmeter-ruby/dsl/mail_reader_sampler.rb +37 -0
- data/lib/jmeter-ruby/dsl/mailer_visualizer.rb +64 -0
- data/lib/jmeter-ruby/dsl/md5hex_assertion.rb +25 -0
- data/lib/jmeter-ruby/dsl/module_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/monitor_results.rb +55 -0
- data/lib/jmeter-ruby/dsl/once_only_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/os_process_sampler.rb +34 -0
- data/lib/jmeter-ruby/dsl/poisson_random_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/random_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/random_order_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/random_variable.rb +30 -0
- data/lib/jmeter-ruby/dsl/recording_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/regex_user_parameters.rb +27 -0
- data/lib/jmeter-ruby/dsl/regular_expression_extractor.rb +32 -0
- data/lib/jmeter-ruby/dsl/response_assertion.rb +31 -0
- data/lib/jmeter-ruby/dsl/response_time_graph.rb +55 -0
- data/lib/jmeter-ruby/dsl/result_status_action_handler.rb +25 -0
- data/lib/jmeter-ruby/dsl/runtime_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/save_responses_to_a_file.rb +29 -0
- data/lib/jmeter-ruby/dsl/setup_thread_group.rb +36 -0
- data/lib/jmeter-ruby/dsl/simple_config_element.rb +23 -0
- data/lib/jmeter-ruby/dsl/simple_controller.rb +23 -0
- data/lib/jmeter-ruby/dsl/simple_data_writer.rb +55 -0
- data/lib/jmeter-ruby/dsl/smime_assertion.rb +35 -0
- data/lib/jmeter-ruby/dsl/smtp_sampler.rb +51 -0
- data/lib/jmeter-ruby/dsl/soapxmlrpc_request.rb +33 -0
- data/lib/jmeter-ruby/dsl/spline_visualizer.rb +55 -0
- data/lib/jmeter-ruby/dsl/summary_report.rb +55 -0
- data/lib/jmeter-ruby/dsl/switch_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/synchronizing_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/tcp_sampler.rb +33 -0
- data/lib/jmeter-ruby/dsl/tcp_sampler_config.rb +31 -0
- data/lib/jmeter-ruby/dsl/test_action.rb +27 -0
- data/lib/jmeter-ruby/dsl/test_fragment.rb +23 -0
- data/lib/jmeter-ruby/dsl/test_plan.rb +31 -0
- data/lib/jmeter-ruby/dsl/thread_group.rb +37 -0
- data/lib/jmeter-ruby/dsl/throughput_controller.rb +32 -0
- data/lib/jmeter-ruby/dsl/transaction_controller.rb +26 -0
- data/lib/jmeter-ruby/dsl/uniform_random_timer.rb +26 -0
- data/lib/jmeter-ruby/dsl/user_defined_variables.rb +33 -0
- data/lib/jmeter-ruby/dsl/user_parameters.rb +30 -0
- data/lib/jmeter-ruby/dsl/view_results_in_table.rb +55 -0
- data/lib/jmeter-ruby/dsl/view_results_tree.rb +55 -0
- data/lib/jmeter-ruby/dsl/while_controller.rb +25 -0
- data/lib/jmeter-ruby/dsl/xml_assertion.rb +23 -0
- data/lib/jmeter-ruby/dsl/xml_schema_assertion.rb +25 -0
- data/lib/jmeter-ruby/dsl/xpath_assertion.rb +31 -0
- data/lib/jmeter-ruby/dsl/xpath_extractor.rb +31 -0
- data/lib/jmeter-ruby/dsl.rb +102 -0
- data/lib/jmeter-ruby/extend/assertions/response_assertion.rb +36 -0
- data/lib/jmeter-ruby/extend/config_elements/header_manager.rb +13 -0
- data/lib/jmeter-ruby/extend/config_elements/http_cache_manager.rb +12 -0
- data/lib/jmeter-ruby/extend/config_elements/http_cookie_manager.rb +36 -0
- data/lib/jmeter-ruby/extend/config_elements/http_request_defaults.rb +39 -0
- data/lib/jmeter-ruby/extend/config_elements/user_defined_variables.rb +13 -0
- data/lib/jmeter-ruby/extend/config_elements/user_parameters.rb +31 -0
- data/lib/jmeter-ruby/extend/controllers/foreach_controller.rb +27 -0
- data/lib/jmeter-ruby/extend/controllers/loop_controller.rb +11 -0
- data/lib/jmeter-ruby/extend/controllers/module_controller.rb +23 -0
- data/lib/jmeter-ruby/extend/controllers/throughput_controller.rb +15 -0
- data/lib/jmeter-ruby/extend/controllers/transaction_controller.rb +14 -0
- data/lib/jmeter-ruby/extend/misc/aliases.rb +21 -0
- data/lib/jmeter-ruby/extend/misc/exists.rb +13 -0
- data/lib/jmeter-ruby/extend/misc/rsync.rb +24 -0
- data/lib/jmeter-ruby/extend/misc/uuid.rb +12 -0
- data/lib/jmeter-ruby/extend/misc/with_helpers.rb +27 -0
- data/lib/jmeter-ruby/extend/plugins/jmeter_plugins.rb +120 -0
- data/lib/jmeter-ruby/extend/processors/extract.rb +28 -0
- data/lib/jmeter-ruby/extend/processors/regular_expression_extractor.rb +25 -0
- data/lib/jmeter-ruby/extend/samplers/http_request.rb +58 -0
- data/lib/jmeter-ruby/extend/samplers/jms_pointtopoint.rb +26 -0
- data/lib/jmeter-ruby/extend/samplers/soapxmlrpc_request.rb +9 -0
- data/lib/jmeter-ruby/extend/threads/setup_thread_group.rb +18 -0
- data/lib/jmeter-ruby/extend/threads/thread_group.rb +19 -0
- data/lib/jmeter-ruby/extend/timers/constant_throughput_timer.rb +11 -0
- data/lib/jmeter-ruby/extend/timers/random_timer.rb +14 -0
- data/lib/jmeter-ruby/helpers/fallback_content_proxy.rb +54 -0
- data/lib/jmeter-ruby/helpers/helper.rb +75 -0
- data/lib/jmeter-ruby/helpers/logger-colors.rb +48 -0
- data/lib/jmeter-ruby/helpers/parser.rb +135 -0
- data/lib/jmeter-ruby/helpers/strip-heredoc.rb +5 -0
- data/lib/jmeter-ruby/helpers/user-agents.rb +27 -0
- data/lib/jmeter-ruby/idl.rb +70 -0
- data/lib/jmeter-ruby/idl.xml +1488 -0
- data/lib/jmeter-ruby/plugins/active_threads_over_time.rb +57 -0
- data/lib/jmeter-ruby/plugins/composite_graph.rb +71 -0
- data/lib/jmeter-ruby/plugins/console_status_logger.rb +15 -0
- data/lib/jmeter-ruby/plugins/dummy_sampler.rb +26 -0
- data/lib/jmeter-ruby/plugins/jmx_collector.rb +73 -0
- data/lib/jmeter-ruby/plugins/json_path_assertion.rb +19 -0
- data/lib/jmeter-ruby/plugins/json_path_extractor.rb +20 -0
- data/lib/jmeter-ruby/plugins/latencies_over_time.rb +49 -0
- data/lib/jmeter-ruby/plugins/loadosophia_uploader.rb +63 -0
- data/lib/jmeter-ruby/plugins/perfmon_collector.rb +80 -0
- data/lib/jmeter-ruby/plugins/redis_data_set.rb +39 -0
- data/lib/jmeter-ruby/plugins/response_codes_per_second.rb +49 -0
- data/lib/jmeter-ruby/plugins/response_times_distribution.rb +49 -0
- data/lib/jmeter-ruby/plugins/response_times_over_time.rb +50 -0
- data/lib/jmeter-ruby/plugins/response_times_percentiles.rb +51 -0
- data/lib/jmeter-ruby/plugins/stepping_thread_group.rb +30 -0
- data/lib/jmeter-ruby/plugins/transactions_per_second.rb +50 -0
- data/lib/jmeter-ruby/plugins/ultimate_thread_group.rb +23 -0
- data/lib/jmeter-ruby/plugins/variable_throughput_timer.rb +27 -0
- data/lib/jmeter-ruby/version.rb +12 -0
- data/lib/jmeter-ruby.rb +27 -0
- data/mise.toml +2 -0
- data/script/release +162 -0
- data/spec/constant_throughput_timer_spec.rb +20 -0
- data/spec/csv_data_set_config_spec.rb +33 -0
- data/spec/header_manager_spec.rb +37 -0
- data/spec/http_cache_manager_spec.rb +29 -0
- data/spec/http_cookie_manager_spec.rb +169 -0
- data/spec/http_request_defaults_spec.rb +57 -0
- data/spec/http_request_spec.rb +305 -0
- data/spec/jmeter_plugins_spec.rb +245 -0
- data/spec/json_extractor_spec.rb +19 -0
- data/spec/json_path_assertion_spec.rb +28 -0
- data/spec/logic_controller_spec.rb +148 -0
- data/spec/loop_controller_spec.rb +19 -0
- data/spec/module_controller_spec.rb +56 -0
- data/spec/regular_expression_extractor_spec.rb +63 -0
- data/spec/response_assertion_spec.rb +69 -0
- data/spec/setup_thread_group_spec.rb +31 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/thread_group_spec.rb +57 -0
- data/spec/throughput_controller_spec.rb +24 -0
- data/spec/transaction_controller_spec.rb +30 -0
- data/spec/user_defined_variables_spec.rb +22 -0
- data/spec/user_parameters_spec.rb +45 -0
- data/spec/with_helpers_spec.rb +57 -0
- data/spec/xpath_extractor_spec.rb +15 -0
- metadata +360 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def foreach_controller(params = {}, &block)
|
4
|
+
node = JmeterRuby::ForeachController.new(params).tap do |node|
|
5
|
+
if params[:start_index]
|
6
|
+
params[:startIndex] = params[:start_index]
|
7
|
+
node.doc.children.first.add_child (
|
8
|
+
Nokogiri::XML(<<-EOS.strip_heredoc).children
|
9
|
+
<stringProp name="ForeachController.startIndex"/>
|
10
|
+
EOS
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
if params[:end_index]
|
15
|
+
params[:endIndex] = params[:end_index]
|
16
|
+
node.doc.children.first.add_child (
|
17
|
+
Nokogiri::XML(<<-EOS.strip_heredoc).children
|
18
|
+
<stringProp name="ForeachController.endIndex"/>
|
19
|
+
EOS
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
attach_node(node, &block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def module_controller(params, &block)
|
4
|
+
node = JmeterRuby::ModuleController.new(params)
|
5
|
+
|
6
|
+
if params[:test_fragment]
|
7
|
+
params[:test_fragment].kind_of?(String) &&
|
8
|
+
params[:test_fragment].split('/')
|
9
|
+
elsif params[:node_path]
|
10
|
+
params[:node_path]
|
11
|
+
else
|
12
|
+
[]
|
13
|
+
end.each_with_index do |node_name, index|
|
14
|
+
node.doc.at_xpath('//collectionProp') <<
|
15
|
+
Nokogiri::XML(<<-EOS.strip_heredoc).children
|
16
|
+
<stringProp name="node_#{index}">#{node_name}</stringProp>
|
17
|
+
EOS
|
18
|
+
end
|
19
|
+
|
20
|
+
attach_node(node, &block)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def throughput_controller(params = {}, &block)
|
4
|
+
params[:style] = 1 if params[:percent]
|
5
|
+
params[:maxThroughput] = params[:total] || params[:percent] || 1
|
6
|
+
|
7
|
+
node = JmeterRuby::ThroughputController.new(params)
|
8
|
+
node.doc.xpath(".//FloatProperty/value").first.content = params[:maxThroughput].to_f
|
9
|
+
|
10
|
+
attach_node(node, &block)
|
11
|
+
end
|
12
|
+
|
13
|
+
alias throughput throughput_controller
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def transaction_controller(*args, &block)
|
4
|
+
params = args.shift || {}
|
5
|
+
params = { name: params }.merge(args.shift || {}) if params.class == String
|
6
|
+
params[:parent] = params[:parent] || false
|
7
|
+
params[:includeTimers] = params[:include_timers] || false
|
8
|
+
node = JmeterRuby::TransactionController.new(params)
|
9
|
+
attach_node(node, &block)
|
10
|
+
end
|
11
|
+
|
12
|
+
alias transaction transaction_controller
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
alias auth http_authorization_manager
|
4
|
+
alias soap soapxmlrpc_request
|
5
|
+
alias ldap ldap_request
|
6
|
+
alias ldap_ext ldap_extended_request
|
7
|
+
alias ldap_extended ldap_extended_request
|
8
|
+
alias If if_controller
|
9
|
+
alias Switch switch_controller
|
10
|
+
alias While while_controller
|
11
|
+
alias Interleave random_controller
|
12
|
+
alias Random_order random_order_controller
|
13
|
+
alias Simple simple_controller
|
14
|
+
alias Once once_only_controller
|
15
|
+
alias view_results view_results_tree
|
16
|
+
alias log simple_data_writer
|
17
|
+
alias response_graph response_time_graph
|
18
|
+
alias bsh_pre beanshell_preprocessor
|
19
|
+
alias bsh_post beanshell_postprocessor
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def exists(variable, &block)
|
4
|
+
params ||= {}
|
5
|
+
params[:condition] = "\"${#{variable}}\" != \"\\${#{variable}}\""
|
6
|
+
params[:useExpression] = false
|
7
|
+
params[:name] = "if ${#{variable}}"
|
8
|
+
node = JmeterRuby::IfController.new(params)
|
9
|
+
|
10
|
+
attach_node(node, &block)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def rsync(params = {})
|
4
|
+
logger.warn "Test file upload via rsync ..."
|
5
|
+
|
6
|
+
file(params)
|
7
|
+
|
8
|
+
cmd = "#{params[:rsync_bin_path]} #{params[:rsync_params]} #{params[:file]} #{params[:remote_user]}@#{params[:remote_host]}:#{params[:remote_path]}"
|
9
|
+
|
10
|
+
logger.debug cmd if params[:debug]
|
11
|
+
|
12
|
+
Open3.popen2e("#{cmd}") do |stdin, stdout_err, wait_thr|
|
13
|
+
while line = stdout_err.gets
|
14
|
+
logger.debug line.chomp if params[:debug]
|
15
|
+
end
|
16
|
+
|
17
|
+
exit_status = wait_thr.value
|
18
|
+
abort "Sorry there was an error: #{cmd}" unless exit_status.success?
|
19
|
+
end
|
20
|
+
|
21
|
+
logger.info "Upload complete at: #{params[:remote_host]}:#{params[:remote_path]}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def uuid_per_iteration(params = {}, &block)
|
4
|
+
params[:name] ||= '__UUID'
|
5
|
+
params[:variable] ||= 'UUID'
|
6
|
+
|
7
|
+
dummy_sampler name: params[:name], response_data: '${__UUID}' do
|
8
|
+
regex pattern: '(.*)', name: params[:variable], match_number: 1
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def with_user_agent(device)
|
4
|
+
http_header_manager name: 'User-Agent', value: JmeterRuby::UserAgent.new(device).string
|
5
|
+
end
|
6
|
+
|
7
|
+
def with_browser(device)
|
8
|
+
http_header_manager name: 'User-Agent', value: JmeterRuby::UserAgent.new(device).string
|
9
|
+
http_header_manager [
|
10
|
+
{ name: 'Accept-Encoding', value: 'gzip,deflate,sdch' },
|
11
|
+
{ name: 'Accept', value: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' }
|
12
|
+
]
|
13
|
+
end
|
14
|
+
|
15
|
+
def with_xhr
|
16
|
+
http_header_manager name: 'X-Requested-With', value: 'XMLHttpRequest'
|
17
|
+
end
|
18
|
+
|
19
|
+
def with_gzip
|
20
|
+
http_header_manager name: 'Accept-Encoding', value: 'gzip, deflate'
|
21
|
+
end
|
22
|
+
|
23
|
+
def with_json
|
24
|
+
http_header_manager name: 'Accept', value: 'text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8, application/json'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def response_codes_per_second(params = {}, &block)
|
4
|
+
node = JmeterRuby::Plugins::ResponseCodesPerSecond.new(params)
|
5
|
+
attach_node(node, &block)
|
6
|
+
end
|
7
|
+
|
8
|
+
def response_times_distribution(params = {}, &block)
|
9
|
+
node = JmeterRuby::Plugins::ResponseTimesDistribution.new(params)
|
10
|
+
attach_node(node, &block)
|
11
|
+
end
|
12
|
+
|
13
|
+
def response_times_over_time(params = {}, &block)
|
14
|
+
node = JmeterRuby::Plugins::ResponseTimesOverTime.new(params)
|
15
|
+
attach_node(node, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def response_times_percentiles(params = {}, &block)
|
19
|
+
node = JmeterRuby::Plugins::ResponseTimesPercentiles.new(params)
|
20
|
+
attach_node(node, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def transactions_per_second(params = {}, &block)
|
24
|
+
node = JmeterRuby::Plugins::TransactionsPerSecond.new(params)
|
25
|
+
attach_node(node, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def latencies_over_time(params = {}, &block)
|
29
|
+
node = JmeterRuby::Plugins::LatenciesOverTime.new(params)
|
30
|
+
attach_node(node, &block)
|
31
|
+
end
|
32
|
+
|
33
|
+
def console_status_logger(params = {}, &block)
|
34
|
+
node = JmeterRuby::Plugins::ConsoleStatusLogger.new(params)
|
35
|
+
attach_node(node, &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
alias console console_status_logger
|
39
|
+
|
40
|
+
def throughput_shaper(params = {}, &block)
|
41
|
+
node = JmeterRuby::Plugins::ThroughputShapingTimer.new(params)
|
42
|
+
attach_node(node, &block)
|
43
|
+
end
|
44
|
+
|
45
|
+
alias shaper throughput_shaper
|
46
|
+
|
47
|
+
def dummy_sampler(params = {}, &block)
|
48
|
+
node = JmeterRuby::Plugins::DummySampler.new(params)
|
49
|
+
attach_node(node, &block)
|
50
|
+
end
|
51
|
+
|
52
|
+
alias dummy dummy_sampler
|
53
|
+
|
54
|
+
def stepping_thread_group(params = {}, &block)
|
55
|
+
node = JmeterRuby::Plugins::SteppingThreadGroup.new(params)
|
56
|
+
attach_node(node, &block)
|
57
|
+
end
|
58
|
+
|
59
|
+
alias step stepping_thread_group
|
60
|
+
|
61
|
+
def ultimate_thread_group(params = {}, &block)
|
62
|
+
node = JmeterRuby::Plugins::UltimateThreadGroup.new(params)
|
63
|
+
|
64
|
+
(params.kind_of?(Array) ? params : params[:threads]).each_with_index do |group, index|
|
65
|
+
node.doc.at_xpath('//collectionProp') <<
|
66
|
+
Nokogiri::XML(<<-EOS.strip_heredoc).children
|
67
|
+
<collectionProp name="index">
|
68
|
+
<stringProp name="#{group[:start_threads]}">#{group[:start_threads]}</stringProp>
|
69
|
+
<stringProp name="#{group[:initial_delay]}">#{group[:initial_delay]}</stringProp>
|
70
|
+
<stringProp name="#{group[:start_time]}">#{group[:start_time]}</stringProp>
|
71
|
+
<stringProp name="#{group[:hold_time]}">#{group[:hold_time]}</stringProp>
|
72
|
+
<stringProp name="#{group[:stop_time]}">#{group[:stop_time]}</stringProp>
|
73
|
+
</collectionProp>
|
74
|
+
EOS
|
75
|
+
end
|
76
|
+
|
77
|
+
attach_node(node, &block)
|
78
|
+
end
|
79
|
+
|
80
|
+
alias ultimate ultimate_thread_group
|
81
|
+
|
82
|
+
def composite_graph(params = {}, &block)
|
83
|
+
node = JmeterRuby::Plugins::CompositeGraph.new(params)
|
84
|
+
attach_node(node, &block)
|
85
|
+
end
|
86
|
+
|
87
|
+
alias composite composite_graph
|
88
|
+
|
89
|
+
def active_threads_over_time(params = {}, &block)
|
90
|
+
node = JmeterRuby::Plugins::ActiveThreadsOverTime.new(params)
|
91
|
+
attach_node(node, &block)
|
92
|
+
end
|
93
|
+
|
94
|
+
alias active_threads active_threads_over_time
|
95
|
+
|
96
|
+
def perfmon_collector(params = {}, &block)
|
97
|
+
node = JmeterRuby::Plugins::PerfmonCollector.new(params)
|
98
|
+
attach_node(node, &block)
|
99
|
+
end
|
100
|
+
|
101
|
+
alias perfmon perfmon_collector
|
102
|
+
|
103
|
+
def loadosophia_uploader(params = {}, &block)
|
104
|
+
node = JmeterRuby::Plugins::LoadosophiaUploader.new(params)
|
105
|
+
attach_node(node, &block)
|
106
|
+
end
|
107
|
+
|
108
|
+
alias loadosophia loadosophia_uploader
|
109
|
+
|
110
|
+
def redis_data_set(params = {}, &block)
|
111
|
+
node = JmeterRuby::Plugins::RedisDataSet.new(params)
|
112
|
+
attach_node(node, &block)
|
113
|
+
end
|
114
|
+
|
115
|
+
def jmx_collector(params = {}, &block)
|
116
|
+
node = JmeterRuby::Plugins::JMXCollector.new(params)
|
117
|
+
attach_node(node, &block)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def extract(params, &block)
|
4
|
+
node = if params[:regex]
|
5
|
+
params[:refname] = params[:name]
|
6
|
+
params[:regex] = params[:regex] #CGI.escapeHTML
|
7
|
+
params[:template] = params[:template] || "$1$"
|
8
|
+
JmeterRuby::RegularExpressionExtractor.new(params)
|
9
|
+
elsif params[:xpath]
|
10
|
+
params[:refname] = params[:name]
|
11
|
+
params[:xpathQuery] = params[:xpath]
|
12
|
+
JmeterRuby::XpathExtractor.new(params)
|
13
|
+
elsif params[:json]
|
14
|
+
params[:VAR] = params[:name]
|
15
|
+
params[:JSONPATH] = params[:json]
|
16
|
+
JmeterRuby::Plugins::JsonPathExtractor.new(params)
|
17
|
+
elsif params[:css]
|
18
|
+
params[:refname] = params[:name]
|
19
|
+
params[:expr] = params[:css]
|
20
|
+
JmeterRuby::CssjqueryExtractor.new(params)
|
21
|
+
end
|
22
|
+
|
23
|
+
attach_node(node, &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
alias web_reg_save_param extract
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def regular_expression_extractor(params, &block)
|
4
|
+
params[:refname] = params[:name]
|
5
|
+
params[:regex] = params[:pattern]
|
6
|
+
params[:template] = params[:template] || "$1$"
|
7
|
+
|
8
|
+
node = JmeterRuby::RegularExpressionExtractor.new(params).tap do |node|
|
9
|
+
if params[:variable]
|
10
|
+
node.doc.xpath("//stringProp[@name='Sample.scope']").first.content = 'variable'
|
11
|
+
|
12
|
+
node.doc.children.first.add_child (
|
13
|
+
Nokogiri::XML(<<-EOS.strip_heredoc).children
|
14
|
+
<stringProp name="Scope.variable">#{params[:variable]}</stringProp>
|
15
|
+
EOS
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
attach_node(node, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
alias regex regular_expression_extractor
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def http_request(*args, &block)
|
4
|
+
params = args.shift || {}
|
5
|
+
params = { url: params }.merge(args.shift || {}) if params.class == String
|
6
|
+
|
7
|
+
params[:method] ||= case __callee__.to_s
|
8
|
+
when 'visit'
|
9
|
+
'GET'
|
10
|
+
when 'submit'
|
11
|
+
'POST'
|
12
|
+
else
|
13
|
+
__callee__.to_s.upcase
|
14
|
+
end
|
15
|
+
|
16
|
+
params[:name] ||= params[:url]
|
17
|
+
|
18
|
+
parse_http_request(params)
|
19
|
+
|
20
|
+
if params[:sample]
|
21
|
+
transaction name: params[:name], parent: true do
|
22
|
+
loops count: params[:sample].to_i do
|
23
|
+
params.delete(:sample)
|
24
|
+
attach_node(http_request_node(params), &block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
else
|
28
|
+
attach_node(http_request_node(params), &block)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def http_request_node(params)
|
33
|
+
JmeterRuby::HttpRequest.new(params).tap do |node|
|
34
|
+
node.doc.children.first.add_child (
|
35
|
+
Nokogiri::XML(<<-EOS.strip_heredoc).children
|
36
|
+
<stringProp name="HTTPSampler.implementation">#{params[:implementation]}</stringProp>
|
37
|
+
EOS
|
38
|
+
) if params[:implementation]
|
39
|
+
|
40
|
+
node.doc.children.first.add_child (
|
41
|
+
Nokogiri::XML(<<-EOS.strip_heredoc).children
|
42
|
+
<stringProp name="TestPlan.comments">#{params[:comments]}</stringProp>
|
43
|
+
EOS
|
44
|
+
) if params[:comments]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
alias request http_request
|
49
|
+
alias get http_request
|
50
|
+
alias visit http_request
|
51
|
+
alias post http_request
|
52
|
+
alias submit http_request
|
53
|
+
alias delete http_request
|
54
|
+
alias patch http_request
|
55
|
+
alias put http_request
|
56
|
+
alias head http_request
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def jms_pointtopoint(params, &block)
|
4
|
+
|
5
|
+
node = JmeterRuby::JmsPointtopoint.new(params).tap do |node|
|
6
|
+
|
7
|
+
if params[:jndi_properties]
|
8
|
+
params[:jndi_properties].map do |property_name, property_value|
|
9
|
+
node.doc.xpath('//collectionProp').first.add_child (
|
10
|
+
Nokogiri::XML(<<-EOS.strip_heredoc).children
|
11
|
+
<elementProp name="#{property_name}" elementType="Argument">
|
12
|
+
<stringProp name="Argument.name">#{property_name}</stringProp>
|
13
|
+
<stringProp name="Argument.value">#{property_value}</stringProp>
|
14
|
+
<stringProp name="Argument.metadata">=</stringProp>
|
15
|
+
</elementProp>
|
16
|
+
EOS
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
attach_node(node, &block)
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def setup_thread_group(*args, &block)
|
4
|
+
params = args.shift || {}
|
5
|
+
params = { count: params }.merge(args.shift || {}) if params.class == Integer
|
6
|
+
params[:num_threads] = params[:count] || 1
|
7
|
+
params[:ramp_time] = params[:rampup] || (params[:num_threads]/2.0).ceil
|
8
|
+
params[:start_time] = params[:start_time] || Time.now.to_i * 1000
|
9
|
+
params[:end_time] = params[:end_time] || Time.now.to_i * 1000
|
10
|
+
params[:duration] ||= 60
|
11
|
+
params[:continue_forever] ||= false
|
12
|
+
params[:loops] = -1 if params[:continue_forever]
|
13
|
+
node = JmeterRuby::SetupThreadGroup.new(params)
|
14
|
+
|
15
|
+
attach_node(node, &block)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def thread_group(*args, &block)
|
4
|
+
params = args.shift || {}
|
5
|
+
params = { count: params }.merge(args.shift || {}) if params.class == Integer
|
6
|
+
params[:num_threads] = params[:count] || 1
|
7
|
+
params[:ramp_time] = params[:rampup] || (params[:num_threads]/2.0).ceil
|
8
|
+
params[:start_time] = params[:start_time] || Time.now.to_i * 1000
|
9
|
+
params[:end_time] = params[:end_time] || Time.now.to_i * 1000
|
10
|
+
params[:duration] ||= 60
|
11
|
+
params[:continue_forever] ||= false
|
12
|
+
params[:loops] = -1 if params[:continue_forever]
|
13
|
+
node = JmeterRuby::ThreadGroup.new(params)
|
14
|
+
attach_node(node, &block)
|
15
|
+
end
|
16
|
+
|
17
|
+
alias threads thread_group
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def constant_throughput_timer(params, &block)
|
4
|
+
params[:value] ||= params[:throughput] || 0.0
|
5
|
+
|
6
|
+
node = JmeterRuby::ConstantThroughputTimer.new(params)
|
7
|
+
node.doc.xpath('//stringProp[@name="throughput"]').first.content = params[:value]
|
8
|
+
attach_node(node, &block)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
class ExtendedDSL < DSL
|
3
|
+
def random_timer(delay=0, range=0, &block)
|
4
|
+
params = {}
|
5
|
+
params[:delay] = delay
|
6
|
+
params[:range] = range
|
7
|
+
node = JmeterRuby::GaussianRandomTimer.new(params)
|
8
|
+
|
9
|
+
attach_node(node, &block)
|
10
|
+
end
|
11
|
+
|
12
|
+
alias think_time random_timer
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module JmeterRuby
|
4
|
+
|
5
|
+
class FallbackContextProxy
|
6
|
+
NON_PROXIED_METHODS = Set[:object_id, :__send__, :__id__, :==, :equal?, :"!", :"!=", :instance_eval,
|
7
|
+
:instance_variables, :instance_variable_get, :instance_variable_set,
|
8
|
+
:remove_instance_variable]
|
9
|
+
|
10
|
+
NON_PROXIED_INSTANCE_VARIABLES = Set[:@__receiver__, :@__fallback__]
|
11
|
+
|
12
|
+
instance_methods.each do |method|
|
13
|
+
unless NON_PROXIED_METHODS.include?(method.to_sym)
|
14
|
+
undef_method(method)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(receiver, fallback)
|
19
|
+
@__receiver__ = receiver
|
20
|
+
@__fallback__ = fallback
|
21
|
+
end
|
22
|
+
|
23
|
+
def id
|
24
|
+
@__receiver__.__send__(:id)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Special case due to `Kernel#sub`'s existence
|
28
|
+
def sub(*args, &block)
|
29
|
+
__proxy_method__(:sub, *args, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Special case to allow proxy instance variables
|
33
|
+
def instance_variables
|
34
|
+
# Ruby 1.8.x returns string names, convert to symbols
|
35
|
+
super.map(&:to_sym) - NON_PROXIED_INSTANCE_VARIABLES.to_a
|
36
|
+
end
|
37
|
+
|
38
|
+
def method_missing(method, *args, &block)
|
39
|
+
__proxy_method__(method, *args, &block)
|
40
|
+
end
|
41
|
+
|
42
|
+
def __proxy_method__(method, *args, &block)
|
43
|
+
begin
|
44
|
+
@__receiver__.__send__(method.to_sym, *args, &block)
|
45
|
+
rescue ::NoMethodError => e
|
46
|
+
begin
|
47
|
+
@__fallback__.__send__(method.to_sym, *args, &block)
|
48
|
+
rescue ::NoMethodError
|
49
|
+
raise(e)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module JmeterRuby
|
2
|
+
def dsl_eval(dsl, &block)
|
3
|
+
block_context = eval("self", block.binding)
|
4
|
+
proxy_context = JmeterRuby::FallbackContextProxy.new(dsl, block_context)
|
5
|
+
begin
|
6
|
+
block_context.instance_variables.each { |ivar| proxy_context.instance_variable_set(ivar, block_context.instance_variable_get(ivar)) }
|
7
|
+
proxy_context.instance_eval(&block)
|
8
|
+
ensure
|
9
|
+
block_context.instance_variables.each { |ivar| block_context.instance_variable_set(ivar, proxy_context.instance_variable_get(ivar)) }
|
10
|
+
end
|
11
|
+
dsl
|
12
|
+
end
|
13
|
+
|
14
|
+
module_function :dsl_eval
|
15
|
+
|
16
|
+
module Helper
|
17
|
+
def update(params)
|
18
|
+
params.delete(:name)
|
19
|
+
enabled_disabled(params)
|
20
|
+
if params.class == Array
|
21
|
+
update_collection params
|
22
|
+
else
|
23
|
+
params.each do |name, value|
|
24
|
+
node = @doc.children.xpath("//*[contains(@name,\"#{name.to_s}\")]")
|
25
|
+
if value.class == Nokogiri::XML::Builder
|
26
|
+
node.first.children = value.doc.at_xpath('//builder').children
|
27
|
+
else
|
28
|
+
node.first.content = value unless node.empty?
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def enabled_disabled(params)
|
36
|
+
return unless params.is_a?(Hash)
|
37
|
+
@doc.children.first.attributes['enabled'].value = params[:enabled].to_s.empty? ? 'true' : 'false'
|
38
|
+
end
|
39
|
+
|
40
|
+
def update_at_xpath(params)
|
41
|
+
params[:update_at_xpath].each do |fragment|
|
42
|
+
if fragment[:xpath]
|
43
|
+
@doc.at_xpath(fragment[:xpath]) << fragment[:value]
|
44
|
+
else
|
45
|
+
fragment.each do |xpath, value|
|
46
|
+
@doc.at_xpath(xpath).content = value
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def update_collection(params)
|
53
|
+
elements = @doc.at_xpath("//collectionProp/elementProp")
|
54
|
+
params.each_with_index do |param, index|
|
55
|
+
param.each do |name, value|
|
56
|
+
next unless elements && elements.element_children
|
57
|
+
element = elements.element_children.xpath("//*[contains(@name,\"#{name}\")]")
|
58
|
+
element.last.content = value
|
59
|
+
end
|
60
|
+
if index != params.size - 1 && elements
|
61
|
+
@doc.at_xpath("//collectionProp") << elements.dup
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def enabled(params)
|
67
|
+
#default to true unless explicitly set to false
|
68
|
+
if params.has_key?(:enabled) && params[:enabled] == false
|
69
|
+
'false'
|
70
|
+
else
|
71
|
+
'true'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|