importu 0.1.0 → 0.2.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.
Files changed (110) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +15 -0
  3. data/.github/workflows/ci.yml +48 -0
  4. data/.gitignore +4 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +311 -0
  7. data/.simplecov +14 -0
  8. data/.yardstick.yml +36 -0
  9. data/Appraisals +22 -0
  10. data/CHANGELOG.md +51 -0
  11. data/CONTRIBUTING.md +86 -0
  12. data/Gemfile +5 -1
  13. data/LICENSE +21 -0
  14. data/README.md +435 -52
  15. data/Rakefile +71 -0
  16. data/UPGRADING.md +188 -0
  17. data/gemfiles/rails_7_2.gemfile +11 -0
  18. data/gemfiles/rails_7_2.gemfile.lock +268 -0
  19. data/gemfiles/rails_8_0.gemfile +11 -0
  20. data/gemfiles/rails_8_0.gemfile.lock +271 -0
  21. data/gemfiles/rails_8_1.gemfile +11 -0
  22. data/gemfiles/rails_8_1.gemfile.lock +269 -0
  23. data/gemfiles/standalone.gemfile +8 -0
  24. data/gemfiles/standalone.gemfile.lock +197 -0
  25. data/importu.gemspec +41 -22
  26. data/lib/importu/backends/active_record.rb +171 -0
  27. data/lib/importu/backends/middleware/duplicate_manager_proxy.rb +41 -0
  28. data/lib/importu/backends/middleware/enforce_allowed_actions.rb +52 -0
  29. data/lib/importu/backends/middleware.rb +11 -0
  30. data/lib/importu/backends.rb +103 -0
  31. data/lib/importu/config_dsl.rb +381 -0
  32. data/lib/importu/converter_context.rb +94 -0
  33. data/lib/importu/converters.rb +119 -64
  34. data/lib/importu/definition.rb +23 -0
  35. data/lib/importu/duplicate_manager.rb +88 -0
  36. data/lib/importu/exceptions.rb +135 -4
  37. data/lib/importu/importer.rb +183 -96
  38. data/lib/importu/record.rb +138 -102
  39. data/lib/importu/sources/csv.rb +122 -0
  40. data/lib/importu/sources/json.rb +106 -0
  41. data/lib/importu/sources/ruby.rb +46 -0
  42. data/lib/importu/sources/xml.rb +133 -0
  43. data/lib/importu/sources.rb +13 -0
  44. data/lib/importu/summary.rb +277 -0
  45. data/lib/importu/version.rb +3 -1
  46. data/lib/importu.rb +45 -9
  47. data/spec/fixtures/books-duplicates/README.md +7 -0
  48. data/spec/fixtures/books-duplicates/infile.csv +7 -0
  49. data/spec/fixtures/books-duplicates/model.json +23 -0
  50. data/spec/fixtures/books-duplicates/summary.json +10 -0
  51. data/spec/fixtures/books-valid/README.md +13 -0
  52. data/spec/fixtures/books-valid/infile.csv +4 -0
  53. data/spec/fixtures/books-valid/infile.json +23 -0
  54. data/spec/fixtures/books-valid/infile.xml +21 -0
  55. data/spec/fixtures/books-valid/model.json +23 -0
  56. data/spec/fixtures/books-valid/record.json +26 -0
  57. data/spec/fixtures/books-valid/summary.json +8 -0
  58. data/spec/fixtures/source-empty-file/infile.csv +0 -0
  59. data/spec/fixtures/source-empty-file/infile.json +0 -0
  60. data/spec/fixtures/source-empty-file/infile.xml +0 -0
  61. data/spec/fixtures/source-empty-records/infile.csv +3 -0
  62. data/spec/fixtures/source-empty-records/infile.json +1 -0
  63. data/spec/fixtures/source-empty-records/infile.xml +6 -0
  64. data/spec/fixtures/source-malformed/infile.csv +1 -0
  65. data/spec/fixtures/source-malformed/infile.json +1 -0
  66. data/spec/fixtures/source-malformed/infile.xml +3 -0
  67. data/spec/fixtures/source-no-records/infile.csv +1 -0
  68. data/spec/fixtures/source-no-records/infile.json +1 -0
  69. data/spec/fixtures/source-no-records/infile.xml +3 -0
  70. data/spec/lib/importu/backends/active_record_spec.rb +150 -0
  71. data/spec/lib/importu/backends/middleware/duplicate_manager_proxy_spec.rb +70 -0
  72. data/spec/lib/importu/backends/middleware/enforce_allowed_actions_spec.rb +70 -0
  73. data/spec/lib/importu/backends_spec.rb +170 -0
  74. data/spec/lib/importu/converters_spec.rb +184 -141
  75. data/spec/lib/importu/definition_spec.rb +248 -0
  76. data/spec/lib/importu/duplicate_manager_spec.rb +92 -0
  77. data/spec/lib/importu/exceptions_spec.rb +69 -16
  78. data/spec/lib/importu/import_context_spec.rb +199 -0
  79. data/spec/lib/importu/importer_spec.rb +95 -0
  80. data/spec/lib/importu/integration_spec.rb +221 -0
  81. data/spec/lib/importu/record_spec.rb +130 -80
  82. data/spec/lib/importu/sources/csv_spec.rb +29 -0
  83. data/spec/lib/importu/sources/importer_source_examples.rb +175 -0
  84. data/spec/lib/importu/sources/json_spec.rb +29 -0
  85. data/spec/lib/importu/sources/ruby_spec.rb +102 -0
  86. data/spec/lib/importu/sources/xml_spec.rb +70 -0
  87. data/spec/lib/importu/summary_spec.rb +186 -0
  88. data/spec/spec_helper.rb +91 -7
  89. data/spec/support/active_record.rb +20 -0
  90. data/spec/support/book_importer.rb +31 -0
  91. data/spec/support/dummy_backend.rb +50 -0
  92. data/spec/support/fixtures_helper.rb +43 -0
  93. data/spec/support/matchers/delegate_matcher.rb +14 -8
  94. metadata +173 -100
  95. data/lib/importu/core_ext/array/deep_freeze.rb +0 -7
  96. data/lib/importu/core_ext/deep_freeze.rb +0 -3
  97. data/lib/importu/core_ext/hash/deep_freeze.rb +0 -7
  98. data/lib/importu/core_ext/object/deep_freeze.rb +0 -6
  99. data/lib/importu/core_ext.rb +0 -3
  100. data/lib/importu/dsl.rb +0 -127
  101. data/lib/importu/importer/csv.rb +0 -52
  102. data/lib/importu/importer/json.rb +0 -45
  103. data/lib/importu/importer/xml.rb +0 -55
  104. data/spec/factories/importer.rb +0 -12
  105. data/spec/factories/importer_record.rb +0 -13
  106. data/spec/factories/json_importer.rb +0 -14
  107. data/spec/factories/xml_importer.rb +0 -12
  108. data/spec/lib/importu/dsl_spec.rb +0 -26
  109. data/spec/lib/importu/importer/json_spec.rb +0 -37
  110. data/spec/lib/importu/importer/xml_spec.rb +0 -14
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+ require "importu/importer"
3
+
4
+ module BookImporterDefinition
5
+ def self.included(base)
6
+ base.class_eval do
7
+ allow_actions :create, :update
8
+
9
+ find_by :isbn10
10
+
11
+ fields :title, :isbn10, :pages, :release_date, :authors
12
+
13
+ field :pages, required: false, &convert_to(:integer)
14
+ field :release_date, &convert_to(:date)
15
+
16
+ field :authors, label: "author" do
17
+ authors = trimmed(:authors).to_s.split(/(?:, )|(?: and )|(?: & )/i)
18
+ raise ArgumentError, "at least one author is required" if authors.none?
19
+ authors
20
+ end
21
+
22
+ field :by_matz, abstract: true do
23
+ field_value(:authors).include?("Yukihiro Matsumoto")
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ class BookImporter < Importu::Importer
30
+ include BookImporterDefinition
31
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+ require "importu/backends"
3
+
4
+ class DummyBackend
5
+ def self.supported_by_definition?(_definition)
6
+ false
7
+ end
8
+
9
+ def initialize(finder_fields:, **)
10
+ @finder_fields = finder_fields
11
+ @objects = []
12
+ @max_id = 0
13
+ end
14
+
15
+ def find(record)
16
+ @finder_fields.detect do |field_group|
17
+ if field_group.respond_to?(:call) # proc
18
+ raise "proc-based finder scopes not supported for dummy backend"
19
+ else
20
+ values = record.values_at(*Array(field_group))
21
+ object = @objects.detect {|o| values == o.values_at(*Array(field_group)) }
22
+ break object if object
23
+ end
24
+ end
25
+ end
26
+
27
+ def unique_id(object)
28
+ object[:id]
29
+ end
30
+
31
+ def create(record)
32
+ object = { id: @max_id += 1 }.merge(record.to_hash)
33
+ @objects << object
34
+ [:created, object]
35
+ end
36
+
37
+ def update(record, object)
38
+ new_object = object.merge(record.to_hash)
39
+
40
+ if new_object == object
41
+ [:unchanged, new_object]
42
+ else
43
+ @objects[object[:id] - 1] = new_object
44
+ [:updated, new_object]
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ Importu::Backends.registry.register(:dummy, DummyBackend)
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+ module FixturesHelper
3
+ def infile(name, ext)
4
+ File.join(fixtures_path, name, "infile.#{ext}")
5
+ end
6
+
7
+ def expected_model_json(name)
8
+ load_fixture_json(name, "model.json")
9
+ end
10
+
11
+ def expected_record_json(name)
12
+ load_fixture_json(name, "record.json")
13
+ end
14
+
15
+ def expected_record_json!(name, records)
16
+ # Dump and re-parse to ensure everything is JSON types w/ string keys
17
+ record_json = JSON.parse(JSON.dump(records.map(&:to_hash)))
18
+ expect(record_json).to eq expected_record_json(name)
19
+ end
20
+
21
+ def expected_summary_json(name)
22
+ load_fixture_json(name, "summary.json")
23
+ end
24
+
25
+ def expected_summary_json!(name, summary)
26
+ summary_json = JSON.parse(JSON.dump(summary.to_hash))
27
+ expect(summary_json).to eq expected_summary_json(name)
28
+ end
29
+
30
+ def fixtures_path
31
+ File.expand_path("../fixtures", __dir__)
32
+ end
33
+
34
+ private def load_fixture_json(*path_parts)
35
+ @fixture_json_cache ||= Hash.new do |_hash, _name|
36
+ data = File.read(File.join(fixtures_path, *path_parts))
37
+ JSON.parse(data)
38
+ end
39
+
40
+ @fixture_json_cache[path_parts]
41
+ end
42
+
43
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # https://gist.github.com/807456
2
3
 
3
4
  # RSpec matcher to spec delegations.
@@ -12,28 +13,33 @@
12
13
 
13
14
  RSpec::Matchers.define :delegate do |method|
14
15
  match do |delegator|
16
+ # Ensure instance vars are defined to suppress warnings about accessing
17
+ # undefined instance variables later on; values get set in matcher chains.
18
+ @prefix = false unless instance_variable_defined?(:@prefix)
19
+ @to = nil unless instance_variable_defined?(:@to)
20
+
15
21
  @method = @prefix ? :"#{@to}_#{method}" : method
16
22
  @delegator = delegator
17
23
  begin
18
24
  @delegator.send(@to)
19
25
  rescue NoMethodError
20
- raise "#{@delegator} does not respond to #{@to}!"
26
+ raise "#{@delegator} does not respond to #{@to}!"
21
27
  end
22
- @delegator.stub(@to).and_return double('receiver')
23
- @delegator.send(@to).stub(method).and_return :called
28
+ allow(@delegator).to receive(@to).and_return double("receiver")
29
+ allow(@delegator.send(@to)).to receive(method).and_return :called
24
30
  @delegator.send(@method) == :called
25
31
  end
26
32
 
27
33
  description do
28
- "delegate :#{@method} to its #{@to}#{@prefix ? ' with prefix' : ''}"
34
+ "delegate :#{@method} to its #{@to}#{@prefix ? " with prefix" : ""}"
29
35
  end
30
36
 
31
- failure_message_for_should do |text|
32
- "expected #{@delegator} to delegate :#{@method} to its #{@to}#{@prefix ? ' with prefix' : ''}"
37
+ failure_message do |_text|
38
+ "expected #{@delegator} to delegate :#{@method} to its #{@to}#{@prefix ? " with prefix" : ""}"
33
39
  end
34
40
 
35
- failure_message_for_should_not do |text|
36
- "expected #{@delegator} not to delegate :#{@method} to its #{@to}#{@prefix ? ' with prefix' : ''}"
41
+ failure_message_when_negated do |_text|
42
+ "expected #{@delegator} not to delegate :#{@method} to its #{@to}#{@prefix ? " with prefix" : ""}"
37
43
  end
38
44
 
39
45
  chain(:to) { |receiver| @to = receiver }
metadata CHANGED
@@ -1,218 +1,291 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: importu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Daniel Hedlund
9
- autorequire:
10
8
  bindir: bin
11
9
  cert_chain: []
12
- date: 2013-12-03 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
13
11
  dependencies:
14
12
  - !ruby/object:Gem::Dependency
15
- name: activesupport
13
+ name: bigdecimal
16
14
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
15
  requirements:
19
- - - ! '>='
16
+ - - ">="
20
17
  - !ruby/object:Gem::Version
21
- version: 3.0.0
18
+ version: '0'
22
19
  type: :runtime
23
20
  prerelease: false
24
21
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
22
  requirements:
27
- - - ! '>='
23
+ - - ">="
28
24
  - !ruby/object:Gem::Version
29
- version: 3.0.0
25
+ version: '0'
30
26
  - !ruby/object:Gem::Dependency
31
- name: activerecord
27
+ name: csv
32
28
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
29
  requirements:
35
- - - ! '>='
30
+ - - ">="
36
31
  - !ruby/object:Gem::Version
37
- version: 3.0.0
32
+ version: '0'
38
33
  type: :runtime
39
34
  prerelease: false
40
35
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
36
  requirements:
43
- - - ! '>='
37
+ - - ">="
44
38
  - !ruby/object:Gem::Version
45
- version: 3.0.0
39
+ version: '0'
46
40
  - !ruby/object:Gem::Dependency
47
- name: multi_json
41
+ name: nokogiri
48
42
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
43
  requirements:
51
- - - ~>
44
+ - - ">="
52
45
  - !ruby/object:Gem::Version
53
- version: '1.0'
46
+ version: 1.18.4
54
47
  type: :runtime
55
48
  prerelease: false
56
49
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
50
  requirements:
59
- - - ~>
51
+ - - ">="
60
52
  - !ruby/object:Gem::Version
61
- version: '1.0'
53
+ version: 1.18.4
62
54
  - !ruby/object:Gem::Dependency
63
- name: nokogiri
55
+ name: appraisal
64
56
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
57
  requirements:
67
- - - ! '>='
58
+ - - ">="
68
59
  - !ruby/object:Gem::Version
69
60
  version: '0'
70
- type: :runtime
61
+ type: :development
71
62
  prerelease: false
72
63
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
64
  requirements:
75
- - - ! '>='
65
+ - - ">="
76
66
  - !ruby/object:Gem::Version
77
67
  version: '0'
78
68
  - !ruby/object:Gem::Dependency
79
69
  name: bundler
80
70
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
71
  requirements:
83
- - - ! '>='
72
+ - - ">="
84
73
  - !ruby/object:Gem::Version
85
- version: 1.0.0
74
+ version: '2.0'
86
75
  type: :development
87
76
  prerelease: false
88
77
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
78
  requirements:
91
- - - ! '>='
79
+ - - ">="
92
80
  - !ruby/object:Gem::Version
93
- version: 1.0.0
81
+ version: '2.0'
94
82
  - !ruby/object:Gem::Dependency
95
83
  name: rspec
96
84
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
85
  requirements:
99
- - - ! '>='
86
+ - - "~>"
100
87
  - !ruby/object:Gem::Version
101
- version: '0'
88
+ version: '3.13'
102
89
  type: :development
103
90
  prerelease: false
104
91
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
92
  requirements:
107
- - - ! '>='
93
+ - - "~>"
108
94
  - !ruby/object:Gem::Version
109
- version: '0'
95
+ version: '3.13'
110
96
  - !ruby/object:Gem::Dependency
111
- name: rdoc
97
+ name: simplecov
112
98
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
99
  requirements:
115
- - - ! '>='
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.22'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.22'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rubocop
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.70'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.70'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rubocop-performance
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.24'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.24'
138
+ - !ruby/object:Gem::Dependency
139
+ name: redcarpet
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
116
143
  - !ruby/object:Gem::Version
117
144
  version: '0'
118
145
  type: :development
119
146
  prerelease: false
120
147
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
148
  requirements:
123
- - - ! '>='
149
+ - - ">="
124
150
  - !ruby/object:Gem::Version
125
151
  version: '0'
126
152
  - !ruby/object:Gem::Dependency
127
- name: factory_girl
153
+ name: yard
128
154
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
155
  requirements:
131
- - - ! '>='
156
+ - - ">="
132
157
  - !ruby/object:Gem::Version
133
- version: 3.5.0
158
+ version: '0'
134
159
  type: :development
135
160
  prerelease: false
136
161
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
162
  requirements:
139
- - - ! '>='
163
+ - - ">="
140
164
  - !ruby/object:Gem::Version
141
- version: 3.5.0
142
- description: Importu is a framework for importing data
165
+ version: '0'
166
+ description: Importu simplifies the process of defining and sharing contracts that
167
+ structured data must conform to in order to be importable into your application.
143
168
  email:
144
- - daniel@lincracy.com
169
+ - daniel@digitree.org
145
170
  executables: []
146
171
  extensions: []
147
172
  extra_rdoc_files: []
148
173
  files:
149
- - .gitignore
174
+ - ".editorconfig"
175
+ - ".github/workflows/ci.yml"
176
+ - ".gitignore"
177
+ - ".rspec"
178
+ - ".rubocop.yml"
179
+ - ".simplecov"
180
+ - ".yardstick.yml"
181
+ - Appraisals
182
+ - CHANGELOG.md
183
+ - CONTRIBUTING.md
150
184
  - Gemfile
185
+ - LICENSE
151
186
  - README.md
187
+ - Rakefile
188
+ - UPGRADING.md
189
+ - gemfiles/rails_7_2.gemfile
190
+ - gemfiles/rails_7_2.gemfile.lock
191
+ - gemfiles/rails_8_0.gemfile
192
+ - gemfiles/rails_8_0.gemfile.lock
193
+ - gemfiles/rails_8_1.gemfile
194
+ - gemfiles/rails_8_1.gemfile.lock
195
+ - gemfiles/standalone.gemfile
196
+ - gemfiles/standalone.gemfile.lock
152
197
  - importu.gemspec
153
198
  - lib/importu.rb
199
+ - lib/importu/backends.rb
200
+ - lib/importu/backends/active_record.rb
201
+ - lib/importu/backends/middleware.rb
202
+ - lib/importu/backends/middleware/duplicate_manager_proxy.rb
203
+ - lib/importu/backends/middleware/enforce_allowed_actions.rb
204
+ - lib/importu/config_dsl.rb
205
+ - lib/importu/converter_context.rb
154
206
  - lib/importu/converters.rb
155
- - lib/importu/core_ext.rb
156
- - lib/importu/core_ext/array/deep_freeze.rb
157
- - lib/importu/core_ext/deep_freeze.rb
158
- - lib/importu/core_ext/hash/deep_freeze.rb
159
- - lib/importu/core_ext/object/deep_freeze.rb
160
- - lib/importu/dsl.rb
207
+ - lib/importu/definition.rb
208
+ - lib/importu/duplicate_manager.rb
161
209
  - lib/importu/exceptions.rb
162
210
  - lib/importu/importer.rb
163
- - lib/importu/importer/csv.rb
164
- - lib/importu/importer/json.rb
165
- - lib/importu/importer/xml.rb
166
211
  - lib/importu/record.rb
212
+ - lib/importu/sources.rb
213
+ - lib/importu/sources/csv.rb
214
+ - lib/importu/sources/json.rb
215
+ - lib/importu/sources/ruby.rb
216
+ - lib/importu/sources/xml.rb
217
+ - lib/importu/summary.rb
167
218
  - lib/importu/version.rb
168
- - spec/factories/importer.rb
169
- - spec/factories/importer_record.rb
170
- - spec/factories/json_importer.rb
171
- - spec/factories/xml_importer.rb
219
+ - spec/fixtures/books-duplicates/README.md
220
+ - spec/fixtures/books-duplicates/infile.csv
221
+ - spec/fixtures/books-duplicates/model.json
222
+ - spec/fixtures/books-duplicates/summary.json
223
+ - spec/fixtures/books-valid/README.md
224
+ - spec/fixtures/books-valid/infile.csv
225
+ - spec/fixtures/books-valid/infile.json
226
+ - spec/fixtures/books-valid/infile.xml
227
+ - spec/fixtures/books-valid/model.json
228
+ - spec/fixtures/books-valid/record.json
229
+ - spec/fixtures/books-valid/summary.json
230
+ - spec/fixtures/source-empty-file/infile.csv
231
+ - spec/fixtures/source-empty-file/infile.json
232
+ - spec/fixtures/source-empty-file/infile.xml
233
+ - spec/fixtures/source-empty-records/infile.csv
234
+ - spec/fixtures/source-empty-records/infile.json
235
+ - spec/fixtures/source-empty-records/infile.xml
236
+ - spec/fixtures/source-malformed/infile.csv
237
+ - spec/fixtures/source-malformed/infile.json
238
+ - spec/fixtures/source-malformed/infile.xml
239
+ - spec/fixtures/source-no-records/infile.csv
240
+ - spec/fixtures/source-no-records/infile.json
241
+ - spec/fixtures/source-no-records/infile.xml
242
+ - spec/lib/importu/backends/active_record_spec.rb
243
+ - spec/lib/importu/backends/middleware/duplicate_manager_proxy_spec.rb
244
+ - spec/lib/importu/backends/middleware/enforce_allowed_actions_spec.rb
245
+ - spec/lib/importu/backends_spec.rb
172
246
  - spec/lib/importu/converters_spec.rb
173
- - spec/lib/importu/dsl_spec.rb
247
+ - spec/lib/importu/definition_spec.rb
248
+ - spec/lib/importu/duplicate_manager_spec.rb
174
249
  - spec/lib/importu/exceptions_spec.rb
175
- - spec/lib/importu/importer/json_spec.rb
176
- - spec/lib/importu/importer/xml_spec.rb
250
+ - spec/lib/importu/import_context_spec.rb
251
+ - spec/lib/importu/importer_spec.rb
252
+ - spec/lib/importu/integration_spec.rb
177
253
  - spec/lib/importu/record_spec.rb
254
+ - spec/lib/importu/sources/csv_spec.rb
255
+ - spec/lib/importu/sources/importer_source_examples.rb
256
+ - spec/lib/importu/sources/json_spec.rb
257
+ - spec/lib/importu/sources/ruby_spec.rb
258
+ - spec/lib/importu/sources/xml_spec.rb
259
+ - spec/lib/importu/summary_spec.rb
178
260
  - spec/spec_helper.rb
261
+ - spec/support/active_record.rb
262
+ - spec/support/book_importer.rb
263
+ - spec/support/dummy_backend.rb
264
+ - spec/support/fixtures_helper.rb
179
265
  - spec/support/matchers/delegate_matcher.rb
180
- homepage: https://github.com/lincracy/importu
266
+ homepage: https://github.com/dhedlund/importu
181
267
  licenses:
182
268
  - MIT
183
- post_install_message:
269
+ metadata:
270
+ homepage_uri: https://github.com/dhedlund/importu
271
+ source_code_uri: https://github.com/dhedlund/importu
272
+ changelog_uri: https://github.com/dhedlund/importu/blob/master/CHANGELOG.md
273
+ bug_tracker_uri: https://github.com/dhedlund/importu/issues
184
274
  rdoc_options: []
185
275
  require_paths:
186
276
  - lib
187
277
  required_ruby_version: !ruby/object:Gem::Requirement
188
- none: false
189
278
  requirements:
190
- - - ! '>='
279
+ - - ">="
191
280
  - !ruby/object:Gem::Version
192
- version: '0'
281
+ version: '3.1'
193
282
  required_rubygems_version: !ruby/object:Gem::Requirement
194
- none: false
195
283
  requirements:
196
- - - ! '>='
284
+ - - ">="
197
285
  - !ruby/object:Gem::Version
198
286
  version: '0'
199
287
  requirements: []
200
- rubyforge_project:
201
- rubygems_version: 1.8.23
202
- signing_key:
203
- specification_version: 3
204
- summary: A framework for importing data
205
- test_files:
206
- - spec/factories/importer.rb
207
- - spec/factories/importer_record.rb
208
- - spec/factories/json_importer.rb
209
- - spec/factories/xml_importer.rb
210
- - spec/lib/importu/converters_spec.rb
211
- - spec/lib/importu/dsl_spec.rb
212
- - spec/lib/importu/exceptions_spec.rb
213
- - spec/lib/importu/importer/json_spec.rb
214
- - spec/lib/importu/importer/xml_spec.rb
215
- - spec/lib/importu/record_spec.rb
216
- - spec/spec_helper.rb
217
- - spec/support/matchers/delegate_matcher.rb
218
- has_rdoc:
288
+ rubygems_version: 4.0.3
289
+ specification_version: 4
290
+ summary: Because an import should be defined by a contract, not a sequence of commands
291
+ test_files: []
@@ -1,7 +0,0 @@
1
- class Array
2
- def deep_freeze
3
- return self if frozen?
4
- each(&:deep_freeze)
5
- freeze
6
- end
7
- end
@@ -1,3 +0,0 @@
1
- require 'importu/core_ext/object/deep_freeze'
2
- require 'importu/core_ext/array/deep_freeze'
3
- require 'importu/core_ext/hash/deep_freeze'
@@ -1,7 +0,0 @@
1
- class Hash
2
- def deep_freeze
3
- return self if frozen?
4
- values.each(&:deep_freeze)
5
- freeze
6
- end
7
- end
@@ -1,6 +0,0 @@
1
- class Object
2
- def deep_freeze
3
- instance_variables.each{|v| instance_variable_get(v).freeze }
4
- freeze
5
- end
6
- end
@@ -1,3 +0,0 @@
1
- Dir["#{File.dirname(__FILE__)}/core_ext/*.rb"].sort.each do |path|
2
- require "importu/core_ext/#{File.basename(path, '.rb')}"
3
- end