esri_shapefile 0.0.1

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 (33) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +51 -0
  4. data/Rakefile +2 -0
  5. data/lib/esri_shapefile/byte_model/field.rb +48 -0
  6. data/lib/esri_shapefile/byte_model.rb +43 -0
  7. data/lib/esri_shapefile/models/main_file_header.rb +47 -0
  8. data/lib/esri_shapefile/models/record_header.rb +28 -0
  9. data/lib/esri_shapefile/models/shapes/multi_patch.rb +33 -0
  10. data/lib/esri_shapefile/models/shapes/multi_point.rb +21 -0
  11. data/lib/esri_shapefile/models/shapes/multi_point_m.rb +25 -0
  12. data/lib/esri_shapefile/models/shapes/multi_point_z.rb +29 -0
  13. data/lib/esri_shapefile/models/shapes/null.rb +19 -0
  14. data/lib/esri_shapefile/models/shapes/point.rb +19 -0
  15. data/lib/esri_shapefile/models/shapes/point_m.rb +20 -0
  16. data/lib/esri_shapefile/models/shapes/point_z.rb +21 -0
  17. data/lib/esri_shapefile/models/shapes/poly_line.rb +43 -0
  18. data/lib/esri_shapefile/models/shapes/poly_line_m.rb +50 -0
  19. data/lib/esri_shapefile/models/shapes/poly_line_z.rb +63 -0
  20. data/lib/esri_shapefile/models/shapes/polygon.rb +38 -0
  21. data/lib/esri_shapefile/models/shapes/polygon_m.rb +52 -0
  22. data/lib/esri_shapefile/models/shapes/polygon_z.rb +65 -0
  23. data/lib/esri_shapefile/models/shapes.rb +33 -0
  24. data/lib/esri_shapefile/reader.rb +44 -0
  25. data/lib/esri_shapefile/version.rb +3 -0
  26. data/lib/esri_shapefile.rb +29 -0
  27. data/spec/esri_shapefile/field_spec.rb +95 -0
  28. data/spec/esri_shapefile/model_spec.rb +26 -0
  29. data/spec/esri_shapefile/models/main_file_header_spec.rb +72 -0
  30. data/spec/esri_shapefile/models/record_header_spec.rb +26 -0
  31. data/spec/esri_shapefile/models/shapes/point_spec.rb +24 -0
  32. data/spec/spec_helper.rb +105 -0
  33. metadata +123 -0
@@ -0,0 +1,52 @@
1
+ require 'esri_shapefile/byte_model'
2
+
3
+ module EsriShapefile
4
+ module Shapes
5
+ #
6
+ # A PolygonM consists of a number of rings. A ring is a closed,
7
+ # non-self-intersecting loop. A PolygonZ may contain multiple outer rings.
8
+ # The rings of a PolygonZ are referred to as its parts.
9
+ #
10
+ # The PolygonM structure is identical to the PolyLineM structure
11
+ #
12
+ class PolygonM
13
+ extend EsriShapefile::ByteModel
14
+
15
+ field :shape_type, position: 0, type: :integer, byte_order: :little
16
+ field :x_min, position: 4, type: :double, byte_order: :little
17
+ field :y_min, position: 12, type: :double, byte_order: :little
18
+ field :x_max, position: 20, type: :double, byte_order: :little
19
+ field :y_max, position: 28, type: :double, byte_order: :little
20
+
21
+ # The number of parts in the PolyLine
22
+ field :num_parts, position: 36, type: :integer, byte_order: :little
23
+
24
+ # The total number of points for all parts.
25
+ field :num_points, position: 40, type: :integer, byte_order: :little
26
+
27
+ # An array of length num_parts. Stores, for each PolyLine, the index of
28
+ # its first point in the points array. Array indexes are with respect to 0.
29
+ field :parts, position: 44, type: :integer, byte_order: :little, number: :num_parts
30
+
31
+ # An array of length NumPoints. The points for each part in the PolyLine
32
+ # are stored end to end. The points for Part 2 follow the points for
33
+ # Part 1, and so on. The parts array holds the array index of the starting
34
+ # point for each part. There is no delimiter in the points array between parts.
35
+ field :points, position: :x, type: :point, byte_order: :little, number: :num_points
36
+
37
+ # The minimum measure for the PolyLineZ
38
+ field :m_min, position: :z, type: :double, byte_order: :little
39
+
40
+ # The maximum measure for the PolyLineZ
41
+ field :m_max, position: :z_plus_8, type: :double, byte_order: :little
42
+
43
+ # An array of length num_points. The measures for each part in the
44
+ # PolyLineZ are stored end to end. The measures for Part 2 follow the
45
+ # measures for Part 1, and so on. The parts array holds the array index of
46
+ # the starting measure for each part. There is no delimited in the measure
47
+ # array between parts.
48
+ field :m_array, position: :z_plus_16, type: :double, byte_order: :little, number: :num_points
49
+ end
50
+ end
51
+ end
52
+
@@ -0,0 +1,65 @@
1
+ require 'esri_shapefile/byte_model'
2
+
3
+ module EsriShapefile
4
+ module Shapes
5
+ #
6
+ # A PolygonZ consists of a number of rings. A ring is a closed,
7
+ # non-self-intersecting loop. A PolygonZ may contain multiple outer rings.
8
+ # The rings of a PolygonZ are referred to as its parts.
9
+ #
10
+ # The PolygonZ structure is identical to the PolyLineZ structure
11
+ #
12
+ class PolygonZ
13
+ extend EsriShapefile::ByteModel
14
+
15
+ field :shape_type, position: 0, type: :integer, byte_order: :little
16
+ field :x_min, position: 4, type: :double, byte_order: :little
17
+ field :y_min, position: 12, type: :double, byte_order: :little
18
+ field :x_max, position: 20, type: :double, byte_order: :little
19
+ field :y_max, position: 28, type: :double, byte_order: :little
20
+
21
+ # The number of parts in the PolyLine
22
+ field :num_parts, position: 36, type: :integer, byte_order: :little
23
+
24
+ # The total number of points for all parts.
25
+ field :num_points, position: 40, type: :integer, byte_order: :little
26
+
27
+ # An array of length num_parts. Stores, for each PolyLine, the index of
28
+ # its first point in the points array. Array indexes are with respect to 0.
29
+ field :parts, position: 44, type: :integer, byte_order: :little, number: :num_parts
30
+
31
+ # An array of length NumPoints. The points for each part in the PolyLine
32
+ # are stored end to end. The points for Part 2 follow the points for
33
+ # Part 1, and so on. The parts array holds the array index of the starting
34
+ # point for each part. There is no delimiter in the points array between parts.
35
+ field :points, position: :x, type: :point, byte_order: :little, number: :num_points
36
+
37
+ # The minimum Z value for the PolyLineZ
38
+ field :z_min, position: :y, type: :double, byte_order: :little
39
+
40
+ # The maximum Z value for the PoliyLineZ
41
+ field :z_max, position: :y_plus_8, type: :double, byte_order: :little
42
+
43
+ # An array of length num_points. the Z values for each part in the
44
+ # PolyLineZ are stored end to end. The Z values for Part 2 follow the Z
45
+ # values for Part 1, and so on. The parts array holds the array index of
46
+ # the starting point for each part. There is no delimited in the Z array
47
+ # between parts.
48
+ field :z_array, position: :y_plus_16, type: :double, byte_order: :little, number: :num_points
49
+
50
+ # The minimum measure for the PolyLineZ
51
+ field :m_min, position: :z, type: :double, byte_order: :little
52
+
53
+ # The maximum measure for the PolyLineZ
54
+ field :m_max, position: :z_plus_8, type: :double, byte_order: :little
55
+
56
+ # An array of length num_points. The measures for each part in the
57
+ # PolyLineZ are stored end to end. The measures for Part 2 follow the
58
+ # measures for Part 1, and so on. The parts array holds the array index of
59
+ # the starting measure for each part. There is no delimited in the measure
60
+ # array between parts.
61
+ field :m_array, position: :z_plus_16, type: :double, byte_order: :little, number: :num_points
62
+ end
63
+ end
64
+ end
65
+
@@ -0,0 +1,33 @@
1
+ module EsriShapefile
2
+ module Shapes
3
+
4
+ # Shape types not specified below (2, 4, 6, etc., and up to 33) are
5
+ # reserved for future use
6
+ SHAPES = {
7
+ 0 => Shapes::Null,
8
+ 1 => Shapes::Point,
9
+ 3 => Shapes::PolyLine,
10
+ 5 => Shapes::Polygon,
11
+ 8 => Shapes::MultiPoint,
12
+ 11 => Shapes::PointZ,
13
+ 13 => Shapes::PolyLineZ,
14
+ 15 => Shapes::PolygonZ,
15
+ 18 => Shapes::MultiPointZ,
16
+ 21 => Shapes::PointM,
17
+ 23 => Shapes::PolyLineM,
18
+ 25 => Shapes::PolygonM,
19
+ 28 => Shapes::MultiPointM,
20
+ 31 => Shapes::MultiPatch,
21
+ }
22
+
23
+ def self.find_by_type(shape_type)
24
+ SHAPES.fetch(shape_type)
25
+ end
26
+
27
+ def self.find_by_bytes(bytes)
28
+ shape_type = bytes.unpack('l<').first
29
+ find_by_type(shape_type)
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,44 @@
1
+ module EsriShapefile
2
+ class Reader
3
+
4
+ MAIN_FILE_HEADER_BYTESIZE = 100
5
+ RECORD_HEADER_BYTESIZE = 8
6
+
7
+ attr_reader :main_file_header
8
+
9
+ def initialize(path_to_shapefile)
10
+ @path_to_shapefile = path_to_shapefile
11
+ @main_file_header = parse_main_file_header
12
+ end
13
+
14
+ def each_record
15
+ File.open(@path_to_shapefile) do |file|
16
+ file.pos = MAIN_FILE_HEADER_BYTESIZE
17
+
18
+ (0..Float::INFINITY).lazy.reduce(file.pos) do |current_offset, number|
19
+ break if current_offset >= main_file_header.file_length_bytes
20
+
21
+ record_header_bytes = file.read(RECORD_HEADER_BYTESIZE)
22
+ record_header = RecordHeader.from_bytes(record_header_bytes)
23
+
24
+ shape_bytes = file.read(record_header.content_length_bytes)
25
+ shape_class = Shapes.find_by_bytes(shape_bytes)
26
+ shape = shape_class.from_bytes(shape_bytes)
27
+
28
+ yield record_header, shape
29
+
30
+ file.pos
31
+ end
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def parse_main_file_header
38
+ main_file_header_bytes = File.binread(@path_to_shapefile, 100, 0)
39
+ MainFileHeader.from_bytes(main_file_header_bytes)
40
+ end
41
+
42
+ end
43
+ end
44
+
@@ -0,0 +1,3 @@
1
+ module EsriShapefile
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,29 @@
1
+ require "esri_shapefile/version"
2
+ require "esri_shapefile/byte_model"
3
+ require "esri_shapefile/byte_model/field"
4
+
5
+ require "esri_shapefile/models/shapes/null"
6
+ require "esri_shapefile/models/shapes/point"
7
+ require "esri_shapefile/models/shapes/point_m"
8
+ require "esri_shapefile/models/shapes/point_z"
9
+ require "esri_shapefile/models/shapes/multi_point"
10
+ require "esri_shapefile/models/shapes/multi_point_m"
11
+ require "esri_shapefile/models/shapes/multi_point_z"
12
+ require "esri_shapefile/models/shapes/poly_line"
13
+ require "esri_shapefile/models/shapes/poly_line_m"
14
+ require "esri_shapefile/models/shapes/poly_line_z"
15
+ require "esri_shapefile/models/shapes/polygon"
16
+ require "esri_shapefile/models/shapes/polygon_m"
17
+ require "esri_shapefile/models/shapes/polygon_z"
18
+ require "esri_shapefile/models/shapes/multi_patch"
19
+ require "esri_shapefile/models/shapes"
20
+
21
+ require "esri_shapefile/models/main_file_header"
22
+ require "esri_shapefile/models/record_header"
23
+
24
+ require "esri_shapefile/reader"
25
+
26
+ module EsriShapefile
27
+ # Your code goes here...
28
+ end
29
+
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ module EsriShapefile
4
+ module ByteModel
5
+ describe Field do
6
+
7
+ describe "type" do
8
+ describe "integer" do
9
+ it "has a bytesize of 4" do
10
+ integer_field = Field.new(:integer_field, type: :integer, byte_order: :little, position: 0)
11
+ expect(integer_field.bytesize).to eql(4)
12
+ end
13
+
14
+ it "correctly identifies the unpack format for the little byte order" do
15
+ integer_field = Field.new(:integer_field, type: :integer, byte_order: :little, position: 0)
16
+ expect(integer_field.unpack_format).to eql('l<1')
17
+ end
18
+
19
+ it "correctly identifies the unpack format for the big byte order" do
20
+ integer_field = Field.new(:integer_field, type: :integer, byte_order: :big, position: 0)
21
+ expect(integer_field.unpack_format).to eql('l>1')
22
+ end
23
+ end
24
+
25
+ describe "double" do
26
+ it "has a bytesize of 8" do
27
+ integer_field = Field.new(:integer_field, type: :double, byte_order: :little, position: 0)
28
+ expect(integer_field.bytesize).to eql(8)
29
+ end
30
+
31
+ it "correctly identifies the unpack format for the little byte order" do
32
+ integer_field = Field.new(:integer_field, type: :double, byte_order: :little, position: 0)
33
+ expect(integer_field.unpack_format).to eql('E1')
34
+ end
35
+
36
+ it "correctly identifies the unpack format for the big byte order" do
37
+ integer_field = Field.new(:integer_field, type: :double, byte_order: :big, position: 0)
38
+ expect(integer_field.unpack_format).to eql('G1')
39
+ end
40
+ end
41
+
42
+ describe "point" do
43
+ it "has a bytesize of 16" do
44
+ integer_field = Field.new(:integer_field, type: :point, byte_order: :little, position: 0)
45
+ expect(integer_field.bytesize).to eql(16)
46
+ end
47
+
48
+ it "correctly identifies the unpack format for the little byte order" do
49
+ integer_field = Field.new(:integer_field, type: :point, byte_order: :little, position: 0)
50
+ expect(integer_field.unpack_format).to eql('E2')
51
+ end
52
+
53
+ it "correctly identifies the unpack format for the big byte order" do
54
+ integer_field = Field.new(:integer_field, type: :point, byte_order: :big, position: 0)
55
+ expect(integer_field.unpack_format).to eql('G2')
56
+ end
57
+ end
58
+ end
59
+
60
+ describe "list" do
61
+ it "is a list when a number is provided" do
62
+ field = Field.new(:field, number: 0, type: :point, byte_order: :big, position: 0)
63
+ expect(field).to be_a_list
64
+ end
65
+
66
+ it "is NOT a list when a number is NOT provided" do
67
+ field = Field.new(:field, type: :point, byte_order: :big, position: 0)
68
+ expect(field).to_not be_a_list
69
+ end
70
+ end
71
+
72
+ describe "number attribute" do
73
+ it "is optional" do
74
+ field = Field.new(:field_without_number, type: :double, byte_order: :little, position: 0)
75
+ expect(field.number).to eql(1)
76
+ expect(field).to_not be_number_depends_on_field
77
+ end
78
+
79
+ it "can be an integer" do
80
+ field = Field.new(:field_with_number, number: 42, type: :double, byte_order: :little, position: 0)
81
+ expect(field.number).to eql(42)
82
+ expect(field).to_not be_number_depends_on_field
83
+ end
84
+
85
+ it "can depend upon the value of another field" do
86
+ field = Field.new(:field_with_depended_number, number: :num_foo, type: :double, byte_order: :little, position: 0)
87
+ expect(field.number).to eql(:num_foo)
88
+ expect(field).to be_number_depends_on_field
89
+ end
90
+ end
91
+
92
+ end
93
+ end
94
+
95
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe EsriShapefile::ByteModel do
4
+
5
+ describe "declaring fields" do
6
+ let(:example_model) do
7
+ Class.new do
8
+ extend EsriShapefile::ByteModel
9
+ field :foo, position: 0, type: :integer, byte_order: :little
10
+ end
11
+ end
12
+
13
+ it "allows them to be accessed" do
14
+ model = example_model.new
15
+ model.foo = "Bar"
16
+
17
+ expect(model.foo).to eql("Bar")
18
+ end
19
+
20
+ it "adds them to the list of fields" do
21
+ expect(example_model.fields.size).to eql(1)
22
+ expect(example_model.fields.first.name).to eql(:foo)
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ module EsriShapefile
4
+ describe MainFileHeader do
5
+
6
+ let(:main_file_header_bytes) do
7
+ bytes = "\x00\x00'\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
8
+ bytes << "\x00\x00\x00\x00\x00\x00\x00\x01|\xD2t\xE8\x03\x00\x00\x05\x00"
9
+ bytes << "\x00\x00\xFA\xD6`\x02\xB7df\xC0\x80\xEC\xBCA?\xE92@\x12\x9A\xE3N"
10
+ bytes << "\xE9xf@\xF2\xB4\x02\xD3\xE8\xD8Q@\x00\x00\x00\x00\x00\x00\x00\x00"
11
+ bytes << "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
12
+ bytes << "\x00\x00\x00\x00\x00\x00\x00\x00"
13
+ bytes
14
+ end
15
+
16
+ describe "from_bytes" do
17
+ let(:main_file_header) do
18
+ MainFileHeader.from_bytes(main_file_header_bytes)
19
+ end
20
+
21
+ it "sets the file code" do
22
+ expect(main_file_header.file_code).to eql(9994)
23
+ end
24
+
25
+ it "sets the file length" do
26
+ expect(main_file_header.file_length).to eql(24957556)
27
+ end
28
+
29
+ it "sets the version" do
30
+ expect(main_file_header.version).to eql(1000)
31
+ end
32
+
33
+ it "sets the shape type" do
34
+ expect(main_file_header.shape_type).to eql(5)
35
+ end
36
+
37
+ it "sets the x_min" do
38
+ expect(main_file_header.x_min).to eql(-179.1473400012399)
39
+ end
40
+
41
+ it "sets the y_min" do
42
+ expect(main_file_header.y_min).to eql(18.911121472000104)
43
+ end
44
+
45
+ it "sets the x_max" do
46
+ expect(main_file_header.x_max).to eql(179.7784800000523)
47
+ end
48
+
49
+ it "sets the y_max" do
50
+ expect(main_file_header.y_max).to eql(71.38921046509111)
51
+ end
52
+
53
+ it "sets the z_min" do
54
+ expect(main_file_header.z_min).to eql(0.0)
55
+ end
56
+
57
+ it "sets the z_max" do
58
+ expect(main_file_header.z_min).to eql(0.0)
59
+ end
60
+
61
+ it "sets the m_min" do
62
+ expect(main_file_header.m_min).to eql(0.0)
63
+ end
64
+
65
+ it "sets the m_max" do
66
+ expect(main_file_header.m_max).to eql(0.0)
67
+ end
68
+ end
69
+
70
+ end
71
+ end
72
+
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ module EsriShapefile
4
+ describe RecordHeader do
5
+
6
+ let(:record_header_bytes) do
7
+ "\x00\x00\x00\x01\x00\x00\x00\x04"
8
+ end
9
+
10
+ describe "from_bytes" do
11
+ let(:record_header) do
12
+ RecordHeader.from_bytes(record_header_bytes)
13
+ end
14
+
15
+ it "sets the record number" do
16
+ expect(record_header.record_number).to eql(1)
17
+ end
18
+
19
+ it "sets the content length" do
20
+ expect(record_header.content_length).to eql(4)
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+
@@ -0,0 +1,24 @@
1
+ module EsriShapefile
2
+ module Shapes
3
+ describe Point do
4
+
5
+ describe "from_bytes" do
6
+ let(:point_bytes) { [1, 42, 57].pack('l<EE') }
7
+ let(:point) { Point.from_bytes(point_bytes) }
8
+
9
+ it "sets the shape_type" do
10
+ expect(point.shape_type).to eql(1)
11
+ end
12
+
13
+ it "sets the x coordinate" do
14
+ expect(point.x).to eql(42.0)
15
+ end
16
+
17
+ it "sets the y coordinate" do
18
+ expect(point.y).to eql(57.0)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
@@ -0,0 +1,105 @@
1
+ require 'esri_shapefile'
2
+
3
+ # This file was generated by the `rspec --init` command. Conventionally, all
4
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
5
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
6
+ # this file to always be loaded, without a need to explicitly require it in any
7
+ # files.
8
+ #
9
+ # Given that it is always loaded, you are encouraged to keep this file as
10
+ # light-weight as possible. Requiring heavyweight dependencies from this file
11
+ # will add to the boot time of your test suite on EVERY test run, even for an
12
+ # individual file that may not need all of that loaded. Instead, consider making
13
+ # a separate helper file that requires the additional dependencies and performs
14
+ # the additional setup, and require it from the spec files that actually need
15
+ # it.
16
+ #
17
+ # The `.rspec` file also contains a few flags that are not defaults but that
18
+ # users commonly want.
19
+ #
20
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
21
+ RSpec.configure do |config|
22
+ # rspec-expectations config goes here. You can use an alternate
23
+ # assertion/expectation library such as wrong or the stdlib/minitest
24
+ # assertions if you prefer.
25
+ config.expect_with :rspec do |expectations|
26
+ # This option will default to `true` in RSpec 4. It makes the `description`
27
+ # and `failure_message` of custom matchers include text for helper methods
28
+ # defined using `chain`, e.g.:
29
+ # be_bigger_than(2).and_smaller_than(4).description
30
+ # # => "be bigger than 2 and smaller than 4"
31
+ # ...rather than:
32
+ # # => "be bigger than 2"
33
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
34
+ end
35
+
36
+ # rspec-mocks config goes here. You can use an alternate test double
37
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
38
+ config.mock_with :rspec do |mocks|
39
+ # Prevents you from mocking or stubbing a method that does not exist on
40
+ # a real object. This is generally recommended, and will default to
41
+ # `true` in RSpec 4.
42
+ mocks.verify_partial_doubles = true
43
+ end
44
+
45
+ # This option will default to `:apply_to_host_groups` in RSpec 4 (and will
46
+ # have no way to turn it off -- the option exists only for backwards
47
+ # compatibility in RSpec 3). It causes shared context metadata to be
48
+ # inherited by the metadata hash of host groups and examples, rather than
49
+ # triggering implicit auto-inclusion in groups with matching metadata.
50
+ config.shared_context_metadata_behavior = :apply_to_host_groups
51
+
52
+ # The settings below are suggested to provide a good initial experience
53
+ # with RSpec, but feel free to customize to your heart's content.
54
+ =begin
55
+ # This allows you to limit a spec run to individual examples or groups
56
+ # you care about by tagging them with `:focus` metadata. When nothing
57
+ # is tagged with `:focus`, all examples get run. RSpec also provides
58
+ # aliases for `it`, `describe`, and `context` that include `:focus`
59
+ # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
60
+ config.filter_run_when_matching :focus
61
+
62
+ # Allows RSpec to persist some state between runs in order to support
63
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
64
+ # you configure your source control system to ignore this file.
65
+ config.example_status_persistence_file_path = "spec/examples.txt"
66
+
67
+ # Limits the available syntax to the non-monkey patched syntax that is
68
+ # recommended. For more details, see:
69
+ # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
70
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
71
+ # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
72
+ config.disable_monkey_patching!
73
+
74
+ # This setting enables warnings. It's recommended, but in some cases may
75
+ # be too noisy due to issues in dependencies.
76
+ config.warnings = true
77
+
78
+ # Many RSpec users commonly either run the entire suite or an individual
79
+ # file, and it's useful to allow more verbose output when running an
80
+ # individual spec file.
81
+ if config.files_to_run.one?
82
+ # Use the documentation formatter for detailed output,
83
+ # unless a formatter has already been configured
84
+ # (e.g. via a command-line flag).
85
+ config.default_formatter = 'doc'
86
+ end
87
+
88
+ # Print the 10 slowest examples and example groups at the
89
+ # end of the spec run, to help surface which specs are running
90
+ # particularly slow.
91
+ config.profile_examples = 10
92
+
93
+ # Run specs in random order to surface order dependencies. If you find an
94
+ # order dependency and want to debug it, you can fix the order by providing
95
+ # the seed, which is printed after each run.
96
+ # --seed 1234
97
+ config.order = :random
98
+
99
+ # Seed global randomization in this process using the `--seed` CLI option.
100
+ # Setting this allows you to use `--seed` to deterministically reproduce
101
+ # test failures related to randomization by passing the same `--seed` value
102
+ # as the one that triggered the failure.
103
+ Kernel.srand config.seed
104
+ =end
105
+ end