active_model_serializers 0.10.9 → 0.10.13
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.md +41 -2
- data/README.md +18 -19
- data/lib/action_controller/serialization.rb +9 -1
- data/lib/active_model/serializer/collection_serializer.rb +11 -2
- data/lib/active_model/serializer/concerns/caching.rb +2 -1
- data/lib/active_model/serializer/fieldset.rb +1 -1
- data/lib/active_model/serializer/reflection.rb +4 -4
- data/lib/active_model/serializer/version.rb +1 -1
- data/lib/active_model/serializer.rb +13 -4
- data/lib/active_model_serializers/adapter/attributes.rb +21 -0
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +5 -1
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +1 -1
- data/lib/active_model_serializers/model/caching.rb +26 -0
- metadata +20 -292
- data/.github/ISSUE_TEMPLATE.md +0 -29
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
- data/.gitignore +0 -35
- data/.rubocop.yml +0 -109
- data/.simplecov +0 -110
- data/.travis.yml +0 -63
- data/CODE_OF_CONDUCT.md +0 -74
- data/CONTRIBUTING.md +0 -105
- data/Gemfile +0 -74
- data/Rakefile +0 -76
- data/active_model_serializers.gemspec +0 -64
- data/appveyor.yml +0 -28
- data/bin/bench +0 -171
- data/bin/bench_regression +0 -316
- data/bin/rubocop +0 -38
- data/bin/serve_benchmark +0 -39
- data/docs/README.md +0 -41
- data/docs/STYLE.md +0 -58
- data/docs/general/adapters.md +0 -269
- data/docs/general/caching.md +0 -58
- data/docs/general/configuration_options.md +0 -185
- data/docs/general/deserialization.md +0 -100
- data/docs/general/fields.md +0 -31
- data/docs/general/getting_started.md +0 -133
- data/docs/general/instrumentation.md +0 -40
- data/docs/general/key_transforms.md +0 -40
- data/docs/general/logging.md +0 -21
- data/docs/general/rendering.md +0 -293
- data/docs/general/serializers.md +0 -495
- data/docs/how-open-source-maintained.jpg +0 -0
- data/docs/howto/add_pagination_links.md +0 -138
- data/docs/howto/add_relationship_links.md +0 -140
- data/docs/howto/add_root_key.md +0 -62
- data/docs/howto/grape_integration.md +0 -42
- data/docs/howto/outside_controller_use.md +0 -66
- data/docs/howto/passing_arbitrary_options.md +0 -27
- data/docs/howto/serialize_poro.md +0 -73
- data/docs/howto/test.md +0 -154
- data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
- data/docs/integrations/ember-and-json-api.md +0 -147
- data/docs/integrations/grape.md +0 -19
- data/docs/jsonapi/errors.md +0 -56
- data/docs/jsonapi/schema/schema.json +0 -366
- data/docs/jsonapi/schema.md +0 -151
- data/docs/rfcs/0000-namespace.md +0 -106
- data/docs/rfcs/template.md +0 -15
- data/test/action_controller/adapter_selector_test.rb +0 -64
- data/test/action_controller/explicit_serializer_test.rb +0 -137
- data/test/action_controller/json/include_test.rb +0 -248
- data/test/action_controller/json_api/deserialization_test.rb +0 -114
- data/test/action_controller/json_api/errors_test.rb +0 -42
- data/test/action_controller/json_api/fields_test.rb +0 -68
- data/test/action_controller/json_api/linked_test.rb +0 -204
- data/test/action_controller/json_api/pagination_test.rb +0 -126
- data/test/action_controller/json_api/transform_test.rb +0 -191
- data/test/action_controller/lookup_proc_test.rb +0 -51
- data/test/action_controller/namespace_lookup_test.rb +0 -234
- data/test/action_controller/serialization_scope_name_test.rb +0 -237
- data/test/action_controller/serialization_test.rb +0 -480
- data/test/active_model_serializers/adapter_for_test.rb +0 -210
- data/test/active_model_serializers/json_pointer_test.rb +0 -24
- data/test/active_model_serializers/logging_test.rb +0 -79
- data/test/active_model_serializers/model_test.rb +0 -144
- data/test/active_model_serializers/railtie_test_isolated.rb +0 -70
- data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -163
- data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -73
- data/test/active_model_serializers/test/schema_test.rb +0 -133
- data/test/active_model_serializers/test/serializer_test.rb +0 -64
- data/test/active_record_test.rb +0 -11
- data/test/adapter/attributes_test.rb +0 -42
- data/test/adapter/deprecation_test.rb +0 -102
- data/test/adapter/json/belongs_to_test.rb +0 -47
- data/test/adapter/json/collection_test.rb +0 -106
- data/test/adapter/json/has_many_test.rb +0 -55
- data/test/adapter/json/transform_test.rb +0 -95
- data/test/adapter/json_api/belongs_to_test.rb +0 -157
- data/test/adapter/json_api/collection_test.rb +0 -98
- data/test/adapter/json_api/errors_test.rb +0 -78
- data/test/adapter/json_api/fields_test.rb +0 -98
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -98
- data/test/adapter/json_api/has_many_test.rb +0 -175
- data/test/adapter/json_api/has_one_test.rb +0 -82
- data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -215
- data/test/adapter/json_api/json_api_test.rb +0 -35
- data/test/adapter/json_api/linked_test.rb +0 -415
- data/test/adapter/json_api/links_test.rb +0 -112
- data/test/adapter/json_api/pagination_links_test.rb +0 -208
- data/test/adapter/json_api/parse_test.rb +0 -139
- data/test/adapter/json_api/relationship_test.rb +0 -399
- data/test/adapter/json_api/resource_meta_test.rb +0 -102
- data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -84
- data/test/adapter/json_api/transform_test.rb +0 -514
- data/test/adapter/json_api/type_test.rb +0 -195
- data/test/adapter/json_test.rb +0 -48
- data/test/adapter/null_test.rb +0 -24
- data/test/adapter/polymorphic_test.rb +0 -220
- data/test/adapter_test.rb +0 -69
- data/test/array_serializer_test.rb +0 -24
- data/test/benchmark/app.rb +0 -67
- data/test/benchmark/benchmarking_support.rb +0 -69
- data/test/benchmark/bm_active_record.rb +0 -83
- data/test/benchmark/bm_adapter.rb +0 -40
- data/test/benchmark/bm_caching.rb +0 -121
- data/test/benchmark/bm_lookup_chain.rb +0 -85
- data/test/benchmark/bm_transform.rb +0 -47
- data/test/benchmark/config.ru +0 -3
- data/test/benchmark/controllers.rb +0 -85
- data/test/benchmark/fixtures.rb +0 -221
- data/test/cache_test.rb +0 -717
- data/test/collection_serializer_test.rb +0 -129
- data/test/fixtures/active_record.rb +0 -115
- data/test/fixtures/poro.rb +0 -227
- data/test/generators/scaffold_controller_generator_test.rb +0 -26
- data/test/generators/serializer_generator_test.rb +0 -77
- data/test/grape_test.rb +0 -198
- data/test/lint_test.rb +0 -51
- data/test/logger_test.rb +0 -22
- data/test/poro_test.rb +0 -11
- data/test/serializable_resource_test.rb +0 -81
- data/test/serializers/association_macros_test.rb +0 -39
- data/test/serializers/associations_test.rb +0 -520
- data/test/serializers/attribute_test.rb +0 -155
- data/test/serializers/attributes_test.rb +0 -54
- data/test/serializers/caching_configuration_test_isolated.rb +0 -172
- data/test/serializers/configuration_test.rb +0 -34
- data/test/serializers/fieldset_test.rb +0 -16
- data/test/serializers/meta_test.rb +0 -204
- data/test/serializers/options_test.rb +0 -34
- data/test/serializers/read_attribute_for_serialization_test.rb +0 -81
- data/test/serializers/reflection_test.rb +0 -481
- data/test/serializers/root_test.rb +0 -23
- data/test/serializers/serialization_test.rb +0 -57
- data/test/serializers/serializer_for_test.rb +0 -138
- data/test/serializers/serializer_for_with_namespace_test.rb +0 -90
- data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/isolated_unit.rb +0 -86
- data/test/support/rails5_shims.rb +0 -55
- data/test/support/rails_app.rb +0 -40
- data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
- data/test/support/schemas/custom/show.json +0 -7
- data/test/support/schemas/hyper_schema.json +0 -93
- data/test/support/schemas/render_using_json_api.json +0 -43
- data/test/support/schemas/simple_json_pointers.json +0 -10
- data/test/support/serialization_testing.rb +0 -81
- data/test/test_helper.rb +0 -72
data/bin/bench
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# ActiveModelSerializers Benchmark driver
|
|
3
|
-
# Adapted from
|
|
4
|
-
# https://github.com/ruby-bench/ruby-bench-suite/blob/8ad567f7e43a044ae48c36833218423bb1e2bd9d/rails/benchmarks/driver.rb
|
|
5
|
-
require 'bundler'
|
|
6
|
-
Bundler.setup
|
|
7
|
-
require 'json'
|
|
8
|
-
require 'pathname'
|
|
9
|
-
require 'optparse'
|
|
10
|
-
require 'digest'
|
|
11
|
-
require 'pathname'
|
|
12
|
-
require 'shellwords'
|
|
13
|
-
require 'logger'
|
|
14
|
-
require 'English'
|
|
15
|
-
|
|
16
|
-
class BenchmarkDriver
|
|
17
|
-
ROOT = Pathname File.expand_path(File.join('..', '..'), __FILE__)
|
|
18
|
-
BASE = ENV.fetch('BASE') { ROOT.join('test', 'benchmark') }
|
|
19
|
-
ESCAPED_BASE = Shellwords.shellescape(BASE)
|
|
20
|
-
|
|
21
|
-
def self.benchmark(options)
|
|
22
|
-
new(options).run
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def self.parse_argv_and_run(argv = ARGV, options = {})
|
|
26
|
-
options = {
|
|
27
|
-
repeat_count: 1,
|
|
28
|
-
pattern: [],
|
|
29
|
-
env: 'CACHE_ON=on'
|
|
30
|
-
}.merge!(options)
|
|
31
|
-
|
|
32
|
-
OptionParser.new do |opts|
|
|
33
|
-
opts.banner = 'Usage: bin/bench [options]'
|
|
34
|
-
|
|
35
|
-
opts.on('-r', '--repeat-count [NUM]', 'Run benchmarks [NUM] times taking the best result') do |value|
|
|
36
|
-
options[:repeat_count] = value.to_i
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
opts.on('-p', '--pattern <PATTERN1,PATTERN2,PATTERN3>', 'Benchmark name pattern') do |value|
|
|
40
|
-
options[:pattern] = value.split(',')
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
opts.on('-e', '--env <var1=val1,var2=val2,var3=vale>', 'ENV variables to pass in') do |value|
|
|
44
|
-
options[:env] = value.split(',')
|
|
45
|
-
end
|
|
46
|
-
end.parse!(argv)
|
|
47
|
-
|
|
48
|
-
benchmark(options)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
attr_reader :commit_hash, :base
|
|
52
|
-
|
|
53
|
-
# Based on logfmt:
|
|
54
|
-
# https://www.brandur.org/logfmt
|
|
55
|
-
# For more complete implementation see:
|
|
56
|
-
# see https://github.com/arachnid-cb/logfmtr/blob/master/lib/logfmtr/base.rb
|
|
57
|
-
# For usage see:
|
|
58
|
-
# https://blog.codeship.com/logfmt-a-log-format-thats-easy-to-read-and-write/
|
|
59
|
-
# https://engineering.heroku.com/blogs/2014-09-05-hutils-explore-your-structured-data-logs/
|
|
60
|
-
# For Ruby parser see:
|
|
61
|
-
# https://github.com/cyberdelia/logfmt-ruby
|
|
62
|
-
def self.summary_logger(device = 'output.txt')
|
|
63
|
-
require 'time'
|
|
64
|
-
logger = Logger.new(device)
|
|
65
|
-
logger.level = Logger::INFO
|
|
66
|
-
logger.formatter = proc { |severity, datetime, progname, msg|
|
|
67
|
-
msg = "'#{msg}'"
|
|
68
|
-
"level=#{severity} time=#{datetime.utc.iso8601(6)} pid=#{Process.pid} progname=#{progname} msg=#{msg}#{$INPUT_RECORD_SEPARATOR}"
|
|
69
|
-
}
|
|
70
|
-
logger
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def self.stdout_logger
|
|
74
|
-
logger = Logger.new(STDOUT)
|
|
75
|
-
logger.level = Logger::INFO
|
|
76
|
-
logger.formatter = proc { |_, _, _, msg| "#{msg}#{$INPUT_RECORD_SEPARATOR}" }
|
|
77
|
-
logger
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def initialize(options)
|
|
81
|
-
@writer = ENV['SUMMARIZE'] ? self.class.summary_logger : self.class.stdout_logger
|
|
82
|
-
@repeat_count = options[:repeat_count]
|
|
83
|
-
@pattern = options[:pattern]
|
|
84
|
-
@commit_hash = options.fetch(:commit_hash) { `git rev-parse --short HEAD`.chomp }
|
|
85
|
-
@base = options.fetch(:base) { ESCAPED_BASE }
|
|
86
|
-
@env = Array(options[:env]).join(' ')
|
|
87
|
-
@rubyopt = options[:rubyopt] # TODO: rename
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def run
|
|
91
|
-
files.each do |path|
|
|
92
|
-
next if !@pattern.empty? && /#{@pattern.join('|')}/ !~ File.basename(path)
|
|
93
|
-
run_single(Shellwords.shellescape(path))
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
private
|
|
98
|
-
|
|
99
|
-
def files
|
|
100
|
-
Dir[File.join(base, 'bm_*')]
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def run_single(path)
|
|
104
|
-
script = "RAILS_ENV=production #{@env} ruby #{@rubyopt} #{path}"
|
|
105
|
-
environment = `ruby -v`.chomp.strip[/\d+\.\d+\.\d+\w+/]
|
|
106
|
-
|
|
107
|
-
runs_output = measure(script)
|
|
108
|
-
if runs_output.empty?
|
|
109
|
-
results = { error: :no_results }
|
|
110
|
-
return
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
results = {}
|
|
114
|
-
results['commit_hash'] = commit_hash
|
|
115
|
-
results['version'] = runs_output.first['version']
|
|
116
|
-
results['rails_version'] = runs_output.first['rails_version']
|
|
117
|
-
results['benchmark_run[environment]'] = environment
|
|
118
|
-
results['runs'] = []
|
|
119
|
-
|
|
120
|
-
runs_output.each do |output|
|
|
121
|
-
results['runs'] << {
|
|
122
|
-
'benchmark_type[category]' => output['label'],
|
|
123
|
-
'benchmark_run[result][iterations_per_second]' => output['iterations_per_second'].round(3),
|
|
124
|
-
'benchmark_run[result][total_allocated_objects_per_iteration]' => output['total_allocated_objects_per_iteration']
|
|
125
|
-
}
|
|
126
|
-
end
|
|
127
|
-
ensure
|
|
128
|
-
results && report(results)
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def report(results)
|
|
132
|
-
@writer.info { 'Benchmark results:' }
|
|
133
|
-
@writer.info { JSON.pretty_generate(results) }
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
def summarize(result)
|
|
137
|
-
puts "#{result['label']} #{result['iterations_per_second']}/ips; #{result['total_allocated_objects_per_iteration']} objects"
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
# FIXME: ` provides the full output but it'll return failed output as well.
|
|
141
|
-
def measure(script)
|
|
142
|
-
results = Hash.new { |h, k| h[k] = [] }
|
|
143
|
-
|
|
144
|
-
@repeat_count.times do
|
|
145
|
-
output = sh(script)
|
|
146
|
-
output.each_line do |line|
|
|
147
|
-
next if line.nil?
|
|
148
|
-
begin
|
|
149
|
-
result = JSON.parse(line)
|
|
150
|
-
rescue JSON::ParserError
|
|
151
|
-
result = { error: line } # rubocop:disable Lint/UselessAssignment
|
|
152
|
-
else
|
|
153
|
-
summarize(result)
|
|
154
|
-
results[result['label']] << result
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
results.map do |_, bm_runs|
|
|
160
|
-
bm_runs.sort_by do |run|
|
|
161
|
-
run['iterations_per_second']
|
|
162
|
-
end.last
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
def sh(cmd)
|
|
167
|
-
`#{cmd}`
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
BenchmarkDriver.parse_argv_and_run if $PROGRAM_NAME == __FILE__
|
data/bin/bench_regression
DELETED
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
require 'fileutils'
|
|
3
|
-
require 'pathname'
|
|
4
|
-
require 'shellwords'
|
|
5
|
-
require 'English'
|
|
6
|
-
|
|
7
|
-
############################
|
|
8
|
-
# USAGE
|
|
9
|
-
#
|
|
10
|
-
# bundle exec bin/bench_regression <ref1> <ref2>
|
|
11
|
-
# <ref1> defaults to the current branch
|
|
12
|
-
# <ref2> defaults to the master branch
|
|
13
|
-
# bundle exec bin/bench_regression current # will run on the current branch
|
|
14
|
-
# bundle exec bin/bench_regression revisions 792fb8a90 master # every revision inclusive
|
|
15
|
-
# bundle exec bin/bench_regression 792fb8a90 master --repeat-count 2 --env CACHE_ON=off
|
|
16
|
-
# bundle exec bin/bench_regression vendor
|
|
17
|
-
###########################
|
|
18
|
-
|
|
19
|
-
class BenchRegression
|
|
20
|
-
ROOT = Pathname File.expand_path(File.join(*['..', '..']), __FILE__)
|
|
21
|
-
TMP_DIR_NAME = File.join('tmp', 'bench')
|
|
22
|
-
TMP_DIR = File.join(ROOT, TMP_DIR_NAME)
|
|
23
|
-
E_TMP_DIR = Shellwords.shellescape(TMP_DIR)
|
|
24
|
-
load ROOT.join('bin', 'bench')
|
|
25
|
-
|
|
26
|
-
attr_reader :source_stasher
|
|
27
|
-
|
|
28
|
-
def initialize
|
|
29
|
-
@source_stasher = SourceStasher.new
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
class SourceStasher
|
|
33
|
-
attr_reader :gem_require_paths, :gem_paths
|
|
34
|
-
attr_writer :vendor
|
|
35
|
-
|
|
36
|
-
def initialize
|
|
37
|
-
@gem_require_paths = []
|
|
38
|
-
@gem_paths = []
|
|
39
|
-
refresh_temp_dir
|
|
40
|
-
@vendor = false
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def temp_dir_empty?
|
|
44
|
-
File.directory?(TMP_DIR) &&
|
|
45
|
-
Dir[File.join(TMP_DIR, '*')].none?
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def empty_temp_dir
|
|
49
|
-
return if @vendor
|
|
50
|
-
return if temp_dir_empty?
|
|
51
|
-
FileUtils.mkdir_p(TMP_DIR)
|
|
52
|
-
Dir[File.join(TMP_DIR, '*')].each do |file|
|
|
53
|
-
if File.directory?(file)
|
|
54
|
-
FileUtils.rm_rf(file)
|
|
55
|
-
else
|
|
56
|
-
FileUtils.rm(file)
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def fill_temp_dir
|
|
62
|
-
vendor_files(Dir[File.join(ROOT, 'test', 'benchmark', '*.{rb,ru}')])
|
|
63
|
-
# vendor_file(File.join('bin', 'bench'))
|
|
64
|
-
housekeeping { empty_temp_dir }
|
|
65
|
-
vendor_gem('benchmark-ips')
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def vendor_files(files)
|
|
69
|
-
files.each do |file|
|
|
70
|
-
vendor_file(file)
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def vendor_file(file)
|
|
75
|
-
FileUtils.cp(file, File.join(TMP_DIR, File.basename(file)))
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def vendor_gem(gem_name)
|
|
79
|
-
directory_name = `bundle exec gem unpack benchmark-ips --target=#{E_TMP_DIR}`[/benchmark-ips.+\d/]
|
|
80
|
-
gem_paths << File.join(TMP_DIR, directory_name)
|
|
81
|
-
gem_require_paths << File.join(TMP_DIR_NAME, directory_name, 'lib')
|
|
82
|
-
housekeeping { remove_vendored_gems }
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def remove_vendored_gems
|
|
86
|
-
return if @vendor
|
|
87
|
-
FileUtils.rm_rf(*gem_paths)
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def refresh_temp_dir
|
|
91
|
-
empty_temp_dir
|
|
92
|
-
fill_temp_dir
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def housekeeping
|
|
96
|
-
at_exit { yield }
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
module RevisionMethods
|
|
101
|
-
module_function
|
|
102
|
-
def current_branch
|
|
103
|
-
@current_branch ||= `cat .git/HEAD | cut -d/ -f3,4,5`.chomp
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def current_revision
|
|
107
|
-
`git rev-parse --short HEAD`.chomp
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def revision_description(rev)
|
|
111
|
-
`git log --oneline -1 #{rev}`.chomp
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def revisions(start_ref, end_ref)
|
|
115
|
-
cmd = "git rev-list --reverse #{start_ref}..#{end_ref}"
|
|
116
|
-
`#{cmd}`.chomp.split("\n")
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
def checkout_ref(ref)
|
|
120
|
-
`git checkout #{ref}`.chomp
|
|
121
|
-
if $CHILD_STATUS
|
|
122
|
-
STDERR.puts "Checkout failed: #{ref}, #{$CHILD_STATUS.exitstatus}" unless $CHILD_STATUS.success?
|
|
123
|
-
$CHILD_STATUS.success?
|
|
124
|
-
else
|
|
125
|
-
true
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
def clean_head
|
|
130
|
-
system('git reset --hard --quiet')
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
module ShellMethods
|
|
134
|
-
|
|
135
|
-
def sh(cmd)
|
|
136
|
-
puts cmd
|
|
137
|
-
# system(cmd)
|
|
138
|
-
run(cmd)
|
|
139
|
-
# env = {}
|
|
140
|
-
# # out = STDOUT
|
|
141
|
-
# pid = spawn(env, cmd)
|
|
142
|
-
# Process.wait(pid)
|
|
143
|
-
# pid = fork do
|
|
144
|
-
# exec cmd
|
|
145
|
-
# end
|
|
146
|
-
# Process.waitpid2(pid)
|
|
147
|
-
# puts $CHILD_STATUS.exitstatus
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
require 'pty'
|
|
151
|
-
# should consider trapping SIGINT in here
|
|
152
|
-
def run(cmd)
|
|
153
|
-
puts cmd
|
|
154
|
-
child_process = ''
|
|
155
|
-
result = ''
|
|
156
|
-
# http://stackoverflow.com/a/1162850
|
|
157
|
-
# stream output of subprocess
|
|
158
|
-
begin
|
|
159
|
-
PTY.spawn(cmd) do |stdin, _stdout, pid|
|
|
160
|
-
begin
|
|
161
|
-
# Do stuff with the output here. Just printing to show it works
|
|
162
|
-
stdin.each do |line|
|
|
163
|
-
print line
|
|
164
|
-
result << line
|
|
165
|
-
end
|
|
166
|
-
child_process = PTY.check(pid)
|
|
167
|
-
rescue Errno::EIO
|
|
168
|
-
puts 'Errno:EIO error, but this probably just means ' \
|
|
169
|
-
'that the process has finished giving output'
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
rescue PTY::ChildExited
|
|
173
|
-
puts 'The child process exited!'
|
|
174
|
-
end
|
|
175
|
-
unless (child_process && child_process.success?)
|
|
176
|
-
exitstatus = child_process.exitstatus
|
|
177
|
-
puts "FAILED: #{child_process.pid} exited with status #{exitstatus.inspect} due to failed command #{cmd}"
|
|
178
|
-
exit exitstatus || 1
|
|
179
|
-
end
|
|
180
|
-
result
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
def bundle(ref)
|
|
184
|
-
system("rm -f Gemfile.lock")
|
|
185
|
-
# This is absolutely critical for bundling to work
|
|
186
|
-
Bundler.with_clean_env do
|
|
187
|
-
system("bundle check ||
|
|
188
|
-
bundle install --local ||
|
|
189
|
-
bundle install ||
|
|
190
|
-
bundle update")
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
# if $CHILD_STATUS
|
|
194
|
-
# STDERR.puts "Bundle failed at: #{ref}, #{$CHILD_STATUS.exitstatus}" unless $CHILD_STATUS.success?
|
|
195
|
-
# $CHILD_STATUS.success?
|
|
196
|
-
# else
|
|
197
|
-
# false
|
|
198
|
-
# end
|
|
199
|
-
end
|
|
200
|
-
end
|
|
201
|
-
include ShellMethods
|
|
202
|
-
include RevisionMethods
|
|
203
|
-
|
|
204
|
-
def benchmark_refs(ref1: nil, ref2: nil, cmd:)
|
|
205
|
-
checking_out = false
|
|
206
|
-
ref0 = current_branch
|
|
207
|
-
ref1 ||= current_branch
|
|
208
|
-
ref2 ||= 'master'
|
|
209
|
-
p [ref0, ref1, ref2, current_revision]
|
|
210
|
-
|
|
211
|
-
run_benchmark_at_ref(cmd, ref1)
|
|
212
|
-
p [ref0, ref1, ref2, current_revision]
|
|
213
|
-
run_benchmark_at_ref(cmd, ref2)
|
|
214
|
-
p [ref0, ref1, ref2, current_revision]
|
|
215
|
-
|
|
216
|
-
checking_out = true
|
|
217
|
-
checkout_ref(ref0)
|
|
218
|
-
rescue Exception # rubocop:disable Lint/RescueException
|
|
219
|
-
STDERR.puts "[ERROR] #{$!.message}"
|
|
220
|
-
checkout_ref(ref0) unless checking_out
|
|
221
|
-
raise
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
def benchmark_revisions(ref1: nil, ref2: nil, cmd:)
|
|
225
|
-
checking_out = false
|
|
226
|
-
ref0 = current_branch
|
|
227
|
-
ref1 ||= current_branch
|
|
228
|
-
ref2 ||= 'master'
|
|
229
|
-
|
|
230
|
-
revisions(ref1, ref2).each do |rev|
|
|
231
|
-
STDERR.puts "Checking out: #{revision_description(rev)}"
|
|
232
|
-
|
|
233
|
-
run_benchmark_at_ref(cmd, rev)
|
|
234
|
-
clean_head
|
|
235
|
-
end
|
|
236
|
-
checking_out = true
|
|
237
|
-
checkout_ref(ref0)
|
|
238
|
-
rescue Exception # rubocop:disable Lint/RescueException
|
|
239
|
-
STDERR.puts "[ERROR]: #{$!.message}"
|
|
240
|
-
checkout_ref(ref0) unless checking_out
|
|
241
|
-
raise
|
|
242
|
-
end
|
|
243
|
-
|
|
244
|
-
def run_benchmark_at_ref(cmd, ref)
|
|
245
|
-
checkout_ref(ref)
|
|
246
|
-
run_benchmark(cmd, ref)
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
def run_benchmark(cmd, ref = nil)
|
|
250
|
-
ref ||= current_revision
|
|
251
|
-
bundle(ref) &&
|
|
252
|
-
benchmark_tests(cmd, ref)
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
def benchmark_tests(cmd, ref)
|
|
256
|
-
base = E_TMP_DIR
|
|
257
|
-
# cmd.sub('bin/bench', 'tmp/revision_runner/bench')
|
|
258
|
-
# bundle = Gem.bin('bunle'
|
|
259
|
-
# Bundler.with_clean_env(&block)
|
|
260
|
-
|
|
261
|
-
# cmd = Shellwords.shelljoin(cmd)
|
|
262
|
-
# cmd = "COMMIT_HASH=#{ref} BASE=#{base} bundle exec ruby -rbenchmark/ips #{cmd}"
|
|
263
|
-
# Add vendoring benchmark/ips to load path
|
|
264
|
-
|
|
265
|
-
# CURRENT THINKING: IMPORTANT
|
|
266
|
-
# Pass into require statement as RUBYOPTS i.e. via env rather than command line argument
|
|
267
|
-
# otherwise, have a 'fast ams benchmarking' module that extends benchmarkings to add the 'ams'
|
|
268
|
-
# method but doesn't depend on benchmark-ips
|
|
269
|
-
options = {
|
|
270
|
-
commit_hash: ref,
|
|
271
|
-
base: base,
|
|
272
|
-
rubyopt: Shellwords.shellescape("-Ilib:#{source_stasher.gem_require_paths.join(':')}")
|
|
273
|
-
}
|
|
274
|
-
BenchmarkDriver.parse_argv_and_run(ARGV.dup, options)
|
|
275
|
-
end
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
if $PROGRAM_NAME == __FILE__
|
|
279
|
-
benchmarking = BenchRegression.new
|
|
280
|
-
|
|
281
|
-
case ARGV[0]
|
|
282
|
-
when 'current'
|
|
283
|
-
# Run current branch only
|
|
284
|
-
|
|
285
|
-
# super simple command line parsing
|
|
286
|
-
args = ARGV.dup
|
|
287
|
-
_ = args.shift # remove 'current' from args
|
|
288
|
-
cmd = args
|
|
289
|
-
benchmarking.run_benchmark(cmd)
|
|
290
|
-
when 'revisions'
|
|
291
|
-
# Runs on every revision
|
|
292
|
-
|
|
293
|
-
# super simple command line parsing
|
|
294
|
-
args = ARGV.dup
|
|
295
|
-
_ = args.shift
|
|
296
|
-
ref1 = args.shift # remove 'revisions' from args
|
|
297
|
-
ref2 = args.shift
|
|
298
|
-
cmd = args
|
|
299
|
-
benchmarking.benchmark_revisions(ref1: ref1, ref2: ref2, cmd: cmd)
|
|
300
|
-
when 'vendor'
|
|
301
|
-
# Just prevents vendored files from being cleaned up
|
|
302
|
-
# at exit. (They are vendored at initialize.)
|
|
303
|
-
benchmarking.source_stasher.vendor = true
|
|
304
|
-
else
|
|
305
|
-
# Default: Compare current_branch to master
|
|
306
|
-
# Optionally: pass in two refs as args to `bin/bench_regression`
|
|
307
|
-
# TODO: Consider checking across more revisions, to automatically find problems.
|
|
308
|
-
|
|
309
|
-
# super simple command line parsing
|
|
310
|
-
args = ARGV.dup
|
|
311
|
-
ref1 = args.shift
|
|
312
|
-
ref2 = args.shift
|
|
313
|
-
cmd = args
|
|
314
|
-
benchmarking.benchmark_refs(ref1: ref1, ref2: ref2, cmd: cmd)
|
|
315
|
-
end
|
|
316
|
-
end
|
data/bin/rubocop
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# Usage:
|
|
4
|
-
# bin/rubocop [-A|-t|-h]
|
|
5
|
-
# bin/rubocop [file or path] [cli options]
|
|
6
|
-
#
|
|
7
|
-
# Options:
|
|
8
|
-
# Autocorrect -A
|
|
9
|
-
# AutoGenConfig -t
|
|
10
|
-
# Usage -h,--help,help
|
|
11
|
-
|
|
12
|
-
set -e
|
|
13
|
-
|
|
14
|
-
case $1 in
|
|
15
|
-
-A)
|
|
16
|
-
echo "Rubocop autocorrect is ON" >&2
|
|
17
|
-
bundle exec rake -f lib/tasks/rubocop.rake rubocop:auto_correct
|
|
18
|
-
;;
|
|
19
|
-
|
|
20
|
-
-t)
|
|
21
|
-
echo "Rubocop is generating a new TODO" >&2
|
|
22
|
-
bundle exec rake -f lib/tasks/rubocop.rake rubocop:auto_gen_config
|
|
23
|
-
;;
|
|
24
|
-
|
|
25
|
-
-h|--help|help)
|
|
26
|
-
sed -ne '/^#/!q;s/.\{1,2\}//;1d;p' < "$0"
|
|
27
|
-
;;
|
|
28
|
-
|
|
29
|
-
*)
|
|
30
|
-
# with no args, run vanilla rubocop
|
|
31
|
-
# else assume we're passing in arbitrary arguments
|
|
32
|
-
if [ -z "$1" ]; then
|
|
33
|
-
bundle exec rake -f lib/tasks/rubocop.rake rubocop
|
|
34
|
-
else
|
|
35
|
-
bundle exec rubocop "$@"
|
|
36
|
-
fi
|
|
37
|
-
;;
|
|
38
|
-
esac
|
data/bin/serve_benchmark
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -e
|
|
3
|
-
|
|
4
|
-
case "$1" in
|
|
5
|
-
|
|
6
|
-
start)
|
|
7
|
-
config="${CONFIG_RU:-test/benchmark/config.ru}"
|
|
8
|
-
bundle exec ruby -Ilib -S rackup "$config" --daemonize --pid tmp/benchmark_app.pid --warn --server webrick
|
|
9
|
-
until [ -f 'tmp/benchmark_app.pid' ]; do
|
|
10
|
-
sleep 0.1 # give it time to start.. I don't know a better way
|
|
11
|
-
done
|
|
12
|
-
cat tmp/benchmark_app.pid
|
|
13
|
-
true
|
|
14
|
-
;;
|
|
15
|
-
|
|
16
|
-
stop)
|
|
17
|
-
if [ -f 'tmp/benchmark_app.pid' ]; then
|
|
18
|
-
kill -TERM $(cat tmp/benchmark_app.pid)
|
|
19
|
-
else
|
|
20
|
-
echo 'No pidfile'
|
|
21
|
-
false
|
|
22
|
-
fi
|
|
23
|
-
;;
|
|
24
|
-
|
|
25
|
-
status)
|
|
26
|
-
if [ -f 'tmp/benchmark_app.pid' ]; then
|
|
27
|
-
kill -0 $(cat tmp/benchmark_app.pid)
|
|
28
|
-
[ "$?" -eq 0 ]
|
|
29
|
-
else
|
|
30
|
-
echo 'No pidfile'
|
|
31
|
-
false
|
|
32
|
-
fi
|
|
33
|
-
;;
|
|
34
|
-
|
|
35
|
-
*)
|
|
36
|
-
echo "Usage: $0 [start|stop|status]"
|
|
37
|
-
;;
|
|
38
|
-
|
|
39
|
-
esac
|
data/docs/README.md
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Docs - ActiveModel::Serializer 0.10.x
|
|
2
|
-
|
|
3
|
-
This is the documentation of ActiveModelSerializers, it's focused on the **0.10.x version.**
|
|
4
|
-
|
|
5
|
-
-----
|
|
6
|
-
|
|
7
|
-
## General
|
|
8
|
-
|
|
9
|
-
- [Getting Started](general/getting_started.md)
|
|
10
|
-
- [Configuration Options](general/configuration_options.md)
|
|
11
|
-
- [Serializers](general/serializers.md)
|
|
12
|
-
- [Adapters](general/adapters.md)
|
|
13
|
-
- [Rendering](general/rendering.md)
|
|
14
|
-
- [Caching](general/caching.md)
|
|
15
|
-
- [Logging](general/logging.md)
|
|
16
|
-
- [Deserialization](general/deserialization.md)
|
|
17
|
-
- [Instrumentation](general/instrumentation.md)
|
|
18
|
-
- JSON API
|
|
19
|
-
- [Schema](jsonapi/schema.md)
|
|
20
|
-
- [Errors](jsonapi/errors.md)
|
|
21
|
-
|
|
22
|
-
## How to
|
|
23
|
-
|
|
24
|
-
- [How to add root key](howto/add_root_key.md)
|
|
25
|
-
- [How to add pagination links](howto/add_pagination_links.md)
|
|
26
|
-
- [How to add relationship links](howto/add_relationship_links.md)
|
|
27
|
-
- [Using ActiveModelSerializers Outside Of Controllers](howto/outside_controller_use.md)
|
|
28
|
-
- [Testing ActiveModelSerializers](howto/test.md)
|
|
29
|
-
- [Passing Arbitrary Options](howto/passing_arbitrary_options.md)
|
|
30
|
-
- [How to serialize a Plain-Old Ruby Object (PORO)](howto/serialize_poro.md)
|
|
31
|
-
- [How to upgrade from `0.8` to `0.10` safely](howto/upgrade_from_0_8_to_0_10.md)
|
|
32
|
-
|
|
33
|
-
## Integrations
|
|
34
|
-
|
|
35
|
-
| Integration | Supported ActiveModelSerializers versions | Gem name and/or link
|
|
36
|
-
|----|-----|----
|
|
37
|
-
| Ember.js | 0.9.x | [active-model-adapter](https://github.com/ember-data/active-model-adapter)
|
|
38
|
-
| Ember.js | 0.10.x + | [docs/integrations/ember-and-json-api.md](integrations/ember-and-json-api.md)
|
|
39
|
-
| Grape | 0.10.x + | [docs/integrations/grape.md](integrations/grape.md) |
|
|
40
|
-
| Grape | 0.9.x | https://github.com/jrhe/grape-active_model_serializers/ |
|
|
41
|
-
| Sinatra | 0.9.x | https://github.com/SauloSilva/sinatra-active-model-serializers/
|
data/docs/STYLE.md
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# STYLE
|
|
2
|
-
|
|
3
|
-
## Code and comments
|
|
4
|
-
|
|
5
|
-
- We are actively working to identify tasks under the label [**Good for New
|
|
6
|
-
Contributors**](https://github.com/rails-api/active_model_serializers/labels/Good%20for%20New%20Contributors).
|
|
7
|
-
- [Changelog
|
|
8
|
-
Missing](https://github.com/rails-api/active_model_serializers/issues?q=label%3A%22Changelog+Missing%22+is%3Aclosed) is
|
|
9
|
-
an easy way to help out.
|
|
10
|
-
|
|
11
|
-
- [Fix a bug](https://github.com/rails-api/active_model_serializers/labels/Ready%20for%20PR).
|
|
12
|
-
- Ready for PR - A well defined bug, needs someone to PR a fix.
|
|
13
|
-
- Bug - Anything that is broken.
|
|
14
|
-
- Regression - A bug that did not exist in previous versions and isn't a new feature (applied in tandem with Bug).
|
|
15
|
-
- Performance - A performance related issue. We could track this as a bug, but usually these would have slightly lower priority than standard bugs.
|
|
16
|
-
|
|
17
|
-
- [Develop new features](https://github.com/rails-api/active_model_serializers/labels/Feature).
|
|
18
|
-
|
|
19
|
-
- [Improve code quality](https://codeclimate.com/github/rails-api/active_model_serializers/code?sort=smell_count&sort_direction=desc).
|
|
20
|
-
|
|
21
|
-
- [Improve amount of code exercised by tests](https://codeclimate.com/github/rails-api/active_model_serializers/coverage?sort=covered_percent&sort_direction=asc).
|
|
22
|
-
|
|
23
|
-
- [Fix RuboCop (Style) TODOS](https://github.com/rails-api/active_model_serializers/blob/master/.rubocop_todo.yml).
|
|
24
|
-
- Delete and offsense, run `rake rubocop` (or possibly `rake rubocop:auto_correct`),
|
|
25
|
-
and [submit a PR](CONTRIBUTING.md#submitting-a-pull-request-pr).
|
|
26
|
-
|
|
27
|
-
- We are also encouraging comments to substantial changes (larger than bugfixes and simple features) under an
|
|
28
|
-
"RFC" (Request for Comments) process before we start active development.
|
|
29
|
-
Look for the [**RFC**](https://github.com/rails-api/active_model_serializers/labels/RFC) label.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
## Pull requests
|
|
33
|
-
|
|
34
|
-
- If the tests pass and the pull request looks good, a maintainer will merge it.
|
|
35
|
-
- If the pull request needs to be changed,
|
|
36
|
-
- you can change it by updating the branch you generated the pull request from
|
|
37
|
-
- either by adding more commits, or
|
|
38
|
-
- by force pushing to it
|
|
39
|
-
- A maintainer can make any changes themselves and manually merge the code in.
|
|
40
|
-
|
|
41
|
-
## Commit messages
|
|
42
|
-
|
|
43
|
-
- [A Note About Git Commit Messages](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
|
|
44
|
-
- [http://stopwritingramblingcommitmessages.com/](http://stopwritingramblingcommitmessages.com/)
|
|
45
|
-
- [ThoughtBot style guide](https://github.com/thoughtbot/guides/tree/master/style#git)
|
|
46
|
-
|
|
47
|
-
#### About Pull Requests (PR's)
|
|
48
|
-
|
|
49
|
-
- [Using Pull Requests](https://help.github.com/articles/using-pull-requests)
|
|
50
|
-
- [Github pull requests made easy](http://www.element84.com/github-pull-requests-made-easy.html)
|
|
51
|
-
- [Exercism Git Workflow](http://help.exercism.io/git-workflow.html).
|
|
52
|
-
- [Level up your Git](http://rakeroutes.com/blog/deliberate-git/)
|
|
53
|
-
- [All Your Open Source Code Are Belong To Us](http://www.benjaminfleischer.com/2013/07/30/all-your-open-source-code-are-belong-to-us/)
|
|
54
|
-
|
|
55
|
-
## Issue Labeling
|
|
56
|
-
|
|
57
|
-
ActiveModelSerializers uses a subset of [StandardIssueLabels](https://github.com/wagenet/StandardIssueLabels) for Github Issues. You can [see our labels here](https://github.com/rails-api/active_model_serializers/labels).
|
|
58
|
-
|