smuggle 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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