ika 0.0.7 → 1.0.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
  SHA1:
3
- metadata.gz: a5facd1d3a28e0e0bc9193df37f96f476a7dac40
4
- data.tar.gz: aee1abc23150b987fe431671b6a0bb5a9c89639c
3
+ metadata.gz: f9d601e456604b7ef58cdc9b299c8be7039e2859
4
+ data.tar.gz: 4083a46fa4be849c07adbf671946cc66beddb4ac
5
5
  SHA512:
6
- metadata.gz: 06bbdf2d0be0e7a02f8a9839821d534c89bc2f86e352296abf14a4932a67b85771b989dc52e0ad763ec880a30cad3d841198090a60eb60d815fd785427d06659
7
- data.tar.gz: 28913becaefd54d77511cc557c9ddf40ec93778da50631de9d6e5963ac3185293471ebdd20cf0e529c09b9955cb4baa5711f1cfd2eb2da0dd81d166c8c865a53
6
+ metadata.gz: 33ce07999c380e9b01f8a01d94b33996e1dc15ddd63b528d32edb1c87a2d9b98fc6cb9689e7e901eceb6b92d29811a760aa4b0c1c768e249398b15276fa2baa9
7
+ data.tar.gz: 22f9e29e4f51c65fa5784e06e529b4a7a7c2931c82e1473592e91910aa1046c1874640a4026b9ac1d0f0ae5598a13f85620152a09f59a34cc9f014d7056839b7
data/MIT-LICENSE CHANGED
@@ -1,20 +1,21 @@
1
- Copyright 2015
1
+ The MIT License (MIT)
2
2
 
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
3
+ Copyright (c) 2015 Aqutras
10
4
 
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
13
11
 
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Circle CI](https://circleci.com/gh/Aqutras/ika.svg?style=shield)](https://circleci.com/gh/Aqutras/ika)
4
4
  [![Coverage Status](https://coveralls.io/repos/Aqutras/ika/badge.svg?branch=master)](https://coveralls.io/r/Aqutras/ika?branch=master)
5
5
 
6
- Ika implements the function that export/import ActiveModel data with json.
6
+ Ika implements the function that export/import ActiveModel data with json. Ika also supports [carrierwave](https://github.com/carrierwaveuploader/carrierwave).
7
7
 
8
8
  ## Installation
9
9
 
@@ -15,6 +15,10 @@ gem 'ika'
15
15
 
16
16
  ## Usage
17
17
 
18
+ You can use `export` or `import` method on your model or relation.
19
+
20
+ ### Example
21
+
18
22
  In case: `Group` has many tags and `User` belongs to multiple groups with `GroupUsers` such as below.
19
23
 
20
24
  ```ruby
@@ -39,7 +43,7 @@ class Tag < ActiveRecord::Base
39
43
  end
40
44
  ```
41
45
 
42
- Now you can export with `export` method on your model or relation.
46
+ Now you can export with `export` method on your model or relation and import with `import` method on your model.
43
47
 
44
48
  ```ruby
45
49
  require 'json'
@@ -55,8 +59,31 @@ JSON.parse User.find(id: 2).export
55
59
  # with include option
56
60
  JSON.parse User.export(include: :groups)
57
61
  # => [{"id":1,"name":"iruca3","groups":[{"id":1,"name":"aqutras"},{"id":2,"name":"Splatoon"}]},{"id":2,"name":"inkling","groups":[{"id":2,"name":"Splatoon"}]}]
58
- JSON.parse User.find(id: 1).export(include: [{groups: [:tags]}])
62
+ data = JSON.parse(User.find(id: 1).export(include: [{groups: [:tags]}]))
59
63
  # => {"id":1,"name":"iruca3","groups":[{"id":1,"name":"aqutras","tags":[{"id":1,"name":"Company"}]},{"id":2,"name":"Splatoon","tags":[{"id":2,"name":"Game"},{"id":3,"name":"Inkling"}]}]}
64
+
65
+ # import (id, created_at and updated_at are completely imported with the same value)
66
+ User.destroy_all
67
+ Group.destroy_all
68
+ Tag.destroy_all
69
+ User.import(data)
70
+
71
+ # sync mode is available.
72
+ User.import(User.where(id: 1).export, sync: true)
73
+ User.exist?(id: 2)
74
+ # => false
60
75
  ```
61
76
 
77
+ ## Others
78
+
79
+ * If the same id exists, Ika uses `UPDATE`.
80
+ * Uploaded files by `carrierwave` will be checked their md5 hash and do nothing if they exist and md5 is matched.
81
+
82
+ ## Not yet implemented features
83
+
84
+ * Sync mode (If class method `import` is called with sync mode, delete all data that are not contained exporting json)
85
+
86
+ ## License
87
+
88
+ Copyright (c) 2015 Aqutras
62
89
  This project rocks and uses MIT-LICENSE.
@@ -0,0 +1,31 @@
1
+ module CarrierWave
2
+ module Base64Uploader
3
+ # https://gist.github.com/hilotter/6a4c356499b55e8eaf9a/
4
+ def base64_conversion(uri_str, filename = 'base64')
5
+ image_data = split_base64(uri_str)
6
+ image_data_string = image_data[:data]
7
+ image_data_binary = Base64.decode64(image_data_string)
8
+
9
+ temp_img_file = Tempfile.new(filename)
10
+ temp_img_file.binmode
11
+ temp_img_file << image_data_binary
12
+ temp_img_file.rewind
13
+
14
+ img_params = {:filename => "#{filename}", :type => image_data[:type], :tempfile => temp_img_file}
15
+ ActionDispatch::Http::UploadedFile.new(img_params)
16
+ end
17
+
18
+ def split_base64(uri_str)
19
+ if uri_str.match(%r{data:(.*?);(.*?),(.*)$})
20
+ uri = Hash.new
21
+ uri[:type] = $1
22
+ uri[:encoder] = $2
23
+ uri[:data] = $3
24
+ uri[:extension] = $1.split('/')[1]
25
+ return uri
26
+ else
27
+ return nil
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ module CarrierWave
2
+ module Uploader
3
+ class Base
4
+ @@json_with_raw_data = false
5
+ def self.json_with_raw_data=(bool)
6
+ @@json_with_raw_data = bool
7
+ end
8
+
9
+ def self.json_with_raw_data
10
+ @@json_with_raw_data
11
+ end
12
+
13
+ def serializable_hash(options = nil)
14
+ if @@json_with_raw_data
15
+ if url
16
+ mime = MIME::Types.type_for(file.file)[0].to_s
17
+ md5 = Digest::MD5.file(file.file).to_s
18
+ filename = Pathname.new(file.file).basename.to_s
19
+ base64 = 'data:' + mime + ';base64,' + Base64.strict_encode64(read)
20
+ {url: url, name: filename, data: base64, md5: md5}
21
+ else
22
+ {url: nil, name: nil, data: nil, md5: nil}
23
+ end
24
+ else
25
+ {"url" => url}.merge Hash[versions.map { |name, version| [name, { "url" => version.url }] }]
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
data/lib/ika/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ika
2
- VERSION = '0.0.7'
2
+ VERSION = '1.0.0'
3
3
  end
data/lib/ika.rb CHANGED
@@ -1,20 +1,62 @@
1
+ if Rails.env == 'test'
2
+ require 'carrierwave'
3
+ end
4
+ require 'carrierwave/serialization'
5
+ require 'carrierwave/base64uploader'
6
+
1
7
  module Ika
2
8
  extend ActiveSupport::Concern
3
9
 
4
- class ::Hash
5
- def max_depth
6
- max_depth = 1
7
- depth_func = ->(hsh, cur_depth) do
8
- max_depth = cur_depth if cur_depth > max_depth
9
- hsh["children"].to_a.each{|h| depth_func.call(h, cur_depth+1)}
10
- max_depth
10
+ module ClassMethods
11
+ include ::CarrierWave::Base64Uploader
12
+
13
+ def import(json_or_array, options = {})
14
+ if json_or_array.is_a?(Array)
15
+ objects = json_or_array
16
+ else
17
+ objects = JSON.parse(json_or_array)
18
+ objects = [objects] unless objects.is_a?(Array)
19
+ end
20
+
21
+ ActiveRecord::Base.transaction do
22
+ if options && options[:sync]
23
+ remove_target_ids = all.pluck(:id)
24
+ else
25
+ remove_target_ids = []
26
+ end
27
+ objects.each do |object|
28
+ record_exists = true if exists?(id: object['id'].to_i)
29
+
30
+ object_params = {}
31
+ object.keys.each do |key|
32
+ if object[key].is_a?(Array)
33
+ reflections[key].klass.import(object[key])
34
+ else
35
+ if new.try(key.to_sym).class.superclass == CarrierWave::Uploader::Base
36
+ need_update = true
37
+ if File.exist?('public' + object[key]['url'])
38
+ md5 = Digest::MD5.file('public' + object[key]['url'])
39
+ need_update = false if md5 == object[key]['md5'] && record_exists == true
40
+ end
41
+ object_params[key] = base64_conversion(object[key]['data'], object[key]['name']) if need_update
42
+ else
43
+ object_params[key] = object[key]
44
+ end
45
+ end
46
+ end
47
+ if record_exists
48
+ where(id: object['id'].to_i).first.update(object_params)
49
+ else
50
+ create(object_params)
51
+ end
52
+ remove_target_ids -= [object['id'].to_i]
53
+ end
54
+ where(id: remove_target_ids).destroy_all
11
55
  end
12
- depth_func.call(self, 0)
13
56
  end
14
- end
15
57
 
16
- module ClassMethods
17
58
  def export(options = {}, objects = nil)
59
+ CarrierWave::Uploader::Base.json_with_raw_data = true
18
60
  all_symbol = true
19
61
  options[:include] ||= []
20
62
  options[:include] = [options[:include]] unless options[:include].is_a?(Array)
@@ -23,7 +65,11 @@ module Ika
23
65
  all_symbol = false unless opt.is_a?(Symbol)
24
66
  end
25
67
 
26
- return objects.to_json(include: options[:include]) if all_symbol
68
+ if all_symbol
69
+ json = objects.to_json(include: options[:include])
70
+ CarrierWave::Uploader::Base.json_with_raw_data = false
71
+ return json
72
+ end
27
73
 
28
74
  whole_obj_arr = []
29
75
  objects.each do |object|
@@ -39,11 +85,13 @@ module Ika
39
85
  end
40
86
  whole_obj_arr.push(obj_arr)
41
87
  end
88
+ CarrierWave::Uploader::Base.json_with_raw_data = false
42
89
  JSON.generate(whole_obj_arr)
43
90
  end
44
91
  end
45
92
 
46
93
  def export(options = {}, object = nil)
94
+ CarrierWave::Uploader::Base.json_with_raw_data = true
47
95
  objects ||= self
48
96
  all_symbol = true
49
97
  options[:include] ||= []
@@ -52,7 +100,11 @@ module Ika
52
100
  all_symbol = false unless opt.is_a?(Symbol)
53
101
  end
54
102
 
55
- return objects.to_json(include: options[:include]) if all_symbol
103
+ if all_symbol
104
+ json = objects.to_json(include: options[:include])
105
+ CarrierWave::Uploader::Base.json_with_raw_data = false
106
+ return json
107
+ end
56
108
 
57
109
  obj_hash = JSON.parse objects.to_json
58
110
  options[:include].each do |relation|
@@ -64,6 +116,7 @@ module Ika
64
116
  obj_hash[relation] = JSON.parse(objects.try(relation).to_json)
65
117
  end
66
118
  end
119
+ CarrierWave::Uploader::Base.json_with_raw_data = false
67
120
  JSON.generate(obj_hash)
68
121
  end
69
122
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ika
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Makoto NAKAYA
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-06-20 00:00:00.000000000 Z
12
+ date: 2015-07-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -95,6 +95,34 @@ dependencies:
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: carrierwave
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: pry-byebug
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
98
126
  description: Implement Import/Export feature to ActiveRecord models.
99
127
  email:
100
128
  - nakaya@aqte.net
@@ -106,6 +134,8 @@ files:
106
134
  - MIT-LICENSE
107
135
  - README.md
108
136
  - Rakefile
137
+ - lib/carrierwave/base64uploader.rb
138
+ - lib/carrierwave/serialization.rb
109
139
  - lib/ika.rb
110
140
  - lib/ika/version.rb
111
141
  - lib/tasks/ika_tasks.rake