smuggle 0.4.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 76c28e234e739e3124cd325d75adcbdfbce6af88b4b48ad55ece82ca5d0db14e
4
- data.tar.gz: 2e5357b380f21f5249e233505c6d67f91b43db50b28bdbdcc04f771af95dd112
3
+ metadata.gz: 889fa2b22dfc67ab693e35df9ed5c6cbe59f24e5f4a0dc53f668852994dd64ce
4
+ data.tar.gz: 70473995af55dd6dcf294e70223944ab2c547c102c955dfd36e61eca326293ab
5
5
  SHA512:
6
- metadata.gz: 8a6b749134917f0b16b745e5678b6332f6f2f24895fd5171c34762c7b8dad848d439fa713b495d860eda326e16a40de31c236d0d252fbfe5af7928c02d43e9a1
7
- data.tar.gz: a91cd6e70449ed729cab625faa84a79d199364abf538de800c4646077709619c93ba33b3aab9ec55d54a937f3e621bc29a595105b53b905b6af5cc094e4b53b6
6
+ metadata.gz: fcfb395b44dbb7fdbcaba150cd96bbbeda3dd6292404870c3a1b341f826ee1d2b3685781873df0a94d3688616df0199b275c5321aa3cd46b86223577ee2b04e4
7
+ data.tar.gz: aa20b7a0657d6280760dc1b5af27daa3818d24d5fb81a3eee7bce6cf9cb10212798170cc2ef70146dd62be8e30ff4aa52218f9c5d0b07bd88ef12979662cdc4f
data/README.md CHANGED
@@ -51,7 +51,7 @@ class User
51
51
  end
52
52
  ```
53
53
 
54
- An exporter can be defined by inheriting from [Smuggle::Exporter::Base](lib/smuggle/exporter/base.rb) and define the attributes to export:
54
+ An exporter can be defined by inheriting from [Smuggle::Exporter::Base](lib/smuggle/exporter/base.rb) and defining the attributes to export:
55
55
 
56
56
  ```ruby
57
57
  class UserExporter < Smuggle::Exporter::Base
@@ -104,31 +104,38 @@ Smuggle::Services::Export.call(scope: users, exporter: UserExporter)
104
104
 
105
105
  ### Importers
106
106
 
107
- Give the following ActiveRecord model:
107
+ Given the following plain old ruby object:
108
108
 
109
109
  ```ruby
110
- class User < ApplicationRecord
111
- validates :full_name, :username, presence: true
110
+ class User
111
+ attr_accessor :name
112
+
113
+ def initialize(name)
114
+ @name = name
115
+ end
112
116
  end
113
117
  ```
114
118
 
115
- To define a importers you need to inherit from [Smuggle::Importer::Base](lib/smuggle/importer/base.rb) and define the attributes to import:
119
+ An importer can be defined by inheriting from [Smuggle::Importer::Base](lib/smuggle/importer/base.rb) and defining the attributes to export:
116
120
 
117
121
  ```ruby
118
122
  class UserImporter < Smuggle::Importer::Base
119
- # List all the attributes you need to import, everything else will be ignored
120
- attributes :full_name, :username
123
+ # If no attributes are defined, the importer will infer them from the model's .attribute_names
124
+ # If any attributes are explicitly defined, all other entries in the CSV are ignored
125
+ attributes :name
121
126
 
122
127
  # Computed attributes from the row data
123
- def full_name
128
+ def name
124
129
  [row[:first_name], row[:last_name]].join(" ")
125
130
  end
126
131
 
127
132
  def persist
128
- # You can implement how to persist the data anyway you prefer
129
- # This is an example using active record
130
- model.create(to_h)
131
- # model.new(to_h).save(validate: false) # Another example skipping validations
133
+ # Create your instance here
134
+ model.new(to_h)
135
+ # The result is collected by the Import service
136
+
137
+ # If you want to persist your data, you can do so here. This is an example using ActiveRecord
138
+ # model.create(to_h)
132
139
  end
133
140
  end
134
141
  ```
@@ -138,16 +145,16 @@ For example:
138
145
  Given the following `users.csv` file:
139
146
 
140
147
  ```
141
- "first_name","last_name","username"
142
- "Rick","Sanchez","rsanchez"
143
- "Morty","Smith","msmith"
144
- "Jerry","Smith","jsmith"
148
+ "first_name","last_name"
149
+ "Rick","Sanchez"
150
+ "Morty","Smith"
145
151
  ```
146
152
 
147
153
  Just run:
148
154
 
149
155
  ```ruby
150
156
  Smuggle::Services::Import.call(model: User, filepath: "users.csv")
157
+ # => [#<User name: "Rick Sanchez">, #<User name: "Morty Smith">]
151
158
  ```
152
159
 
153
160
  The importer class will be resolved from the model name, otherwise you could explicitely set the importer like this:
@@ -6,8 +6,8 @@ module Smuggle
6
6
  class << self
7
7
  attr_writer :attributes
8
8
 
9
- def inherited(base)
10
- base.attributes = []
9
+ def inherited(subclass)
10
+ subclass.attributes = []
11
11
  end
12
12
 
13
13
  def attributes(*names)
@@ -40,10 +40,14 @@ module Smuggle
40
40
  end
41
41
  end
42
42
 
43
+ private
44
+
43
45
  def defined_attributes
44
46
  return self.class.attributes if self.class.attributes?
45
47
 
46
- model.attribute_names if model.respond_to?(:attribute_names)
48
+ return model.attribute_names if model.respond_to?(:attribute_names)
49
+
50
+ []
47
51
  end
48
52
  end
49
53
  end
@@ -36,7 +36,10 @@ module Smuggle
36
36
  CSV.generate do |csv|
37
37
  csv << exporter.header
38
38
 
39
- scope.each do |record|
39
+ method = :each
40
+ method = :find_each if scope.respond_to?(:find_each)
41
+
42
+ scope.public_send(method) do |record|
40
43
  csv << exporter.new(record).to_csv
41
44
  end
42
45
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Smuggle
4
- VERSION = "0.4.0"
4
+ VERSION = "0.5.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smuggle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Crivella
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-09-10 00:00:00.000000000 Z
12
+ date: 2019-04-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '1.15'
20
+ version: '2.0'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '1.15'
27
+ version: '2.0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: faker
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -115,42 +115,56 @@ dependencies:
115
115
  requirements:
116
116
  - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: '0.59'
118
+ version: '0.6'
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '0.59'
125
+ version: '0.6'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rubocop-performance
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '1.1'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '1.1'
126
140
  - !ruby/object:Gem::Dependency
127
141
  name: rubocop-rspec
128
142
  requirement: !ruby/object:Gem::Requirement
129
143
  requirements:
130
144
  - - "~>"
131
145
  - !ruby/object:Gem::Version
132
- version: '1.29'
146
+ version: '1.3'
133
147
  type: :development
134
148
  prerelease: false
135
149
  version_requirements: !ruby/object:Gem::Requirement
136
150
  requirements:
137
151
  - - "~>"
138
152
  - !ruby/object:Gem::Version
139
- version: '1.29'
153
+ version: '1.3'
140
154
  - !ruby/object:Gem::Dependency
141
155
  name: simplecov
142
156
  requirement: !ruby/object:Gem::Requirement
143
157
  requirements:
144
158
  - - "~>"
145
159
  - !ruby/object:Gem::Version
146
- version: '0.16'
160
+ version: '0.1'
147
161
  type: :development
148
162
  prerelease: false
149
163
  version_requirements: !ruby/object:Gem::Requirement
150
164
  requirements:
151
165
  - - "~>"
152
166
  - !ruby/object:Gem::Version
153
- version: '0.16'
167
+ version: '0.1'
154
168
  description:
155
169
  email:
156
170
  - pablocrivella@gmail.com
@@ -203,8 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
203
217
  - !ruby/object:Gem::Version
204
218
  version: '0'
205
219
  requirements: []
206
- rubyforge_project:
207
- rubygems_version: 2.7.7
220
+ rubygems_version: 3.0.3
208
221
  signing_key:
209
222
  specification_version: 4
210
223
  summary: It exports and imports all kinds of stuff from and to CSV