ika 0.0.5 → 0.0.6

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 (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +58 -1
  3. data/lib/ika/version.rb +1 -1
  4. data/lib/ika.rb +60 -4
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4d0ec217230d6ddea57c168e331b1a71d23d0b55
4
- data.tar.gz: 659af8b78ae62edda54922fc1c67986c5a2602e7
3
+ metadata.gz: d39bb3c1e707c8fc018731b5246d46661b3c747f
4
+ data.tar.gz: b7862d008f1095995e4c35c463d439685be3d80e
5
5
  SHA512:
6
- metadata.gz: a2ba78dc93495cb9d1994cf6fbe5f2c96a7ad8ecbfa0813d9a2a11c22f71b13cc22f09dc5e30791dd0c41aecfb817423dec9254e9be06df894f3c40ef96aaea8
7
- data.tar.gz: ea66d319b3832840d3e633851c3b2ee322373b8528876de2a55552250f1060f9e4bf0fa127258a319db647f70054a2939f2e2af12a2a43fcda114c8de3af970c
6
+ metadata.gz: 3e64d100096aa7163ec6f56820ec3858f504b3eb9bd5d3a6a2b176c4711bdb4ea517b4b357b288007a8b20b65ada7aff34fb3dab06707a1a726c5823d8036852
7
+ data.tar.gz: 2d36246b1f9333fdc4a9fa57b7a881cf6b9e28ee3a8d8c7966d854997fc99fe732526bada4af56031d20e20da8b65fb73e18b9ff1389326ebea314ae94ed6c0e
data/README.md CHANGED
@@ -1,3 +1,60 @@
1
- ## Ika
1
+ # Ika
2
+ [![Gem Version](https://badge.fury.io/rb/ika.svg)](http://badge.fury.io/rb/ika)
3
+
4
+ Ika implements the function that export/import ActiveModel data with json.
5
+
6
+ ## Installation
7
+
8
+ In Rails, add it to your Gemfile:
9
+
10
+ ```ruby
11
+ gem 'ika'
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ In case: `Group` has many tags and `User` belongs to multiple groups with `GroupUsers` such as below.
17
+
18
+ ```ruby
19
+ class User < ActiveRecord::Base
20
+ has_many :group_users
21
+ has_many :groups, through: :group_users
22
+ end
23
+
24
+ class GroupUsers < ActiveRecord::Base
25
+ belongs_to :user
26
+ belongs_to :group
27
+ end
28
+
29
+ class Group < ActiveRecord::Base
30
+ has_many :group_users
31
+ has_many :users, through: :group_users
32
+ has_many :tags
33
+ end
34
+
35
+ class Tag < ActiveRecord::Base
36
+ belongs_to :group
37
+ end
38
+ ```
39
+
40
+ Now you can export with `export` method on your model or relation.
41
+
42
+ ```ruby
43
+ require 'json'
44
+ # with no options
45
+
46
+ JSON.parse User.export
47
+ # => [{"id":1,"name":"iruca3"},{"id":2,"name":"inkling"}]
48
+ JSON.parse User.where(id: 1).export
49
+ # => [{"id":1,"name":"iruca3"}]
50
+ JSON.parse User.find(id: 2).export
51
+ # => {"id":2,"name":"inkling"}
52
+
53
+ # with include option
54
+ JSON.parse User.export(include: :groups)
55
+ # => [{"id":1,"name":"iruca3","groups":[{"id":1,"name":"aqutras"},{"id":2,"name":"Splatoon"}]},{"id":2,"name":"inkling","groups":[{"id":2,"name":"Splatoon"}]}]
56
+ JSON.parse User.find(id: 1).export(include: [{groups: [:tags]}])
57
+ # => {"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"}]}]}
58
+ ```
2
59
 
3
60
  This project rocks and uses MIT-LICENSE.
data/lib/ika/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ika
2
- VERSION = '0.0.5'
2
+ VERSION = '0.0.6'
3
3
  end
data/lib/ika.rb CHANGED
@@ -1,14 +1,70 @@
1
1
  module Ika
2
2
  extend ActiveSupport::Concern
3
3
 
4
- def export(options = self.class.reflections.keys)
5
- to_json(include: options)
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
11
+ end
12
+ depth_func.call(self, 0)
13
+ end
6
14
  end
7
15
 
8
16
  module ClassMethods
9
- def export(options = reflections.keys)
10
- includes(options).to_json(include: options)
17
+ def export(options = {}, objects = nil)
18
+ all_symbol = true
19
+ options[:include] ||= []
20
+ options[:include] = [options[:include]] unless options[:include].is_a?(Array)
21
+ objects = self.includes(options[:include]) unless objects
22
+ options[:include].each do |opt|
23
+ all_symbol = false unless opt.is_a?(Symbol)
24
+ end
25
+
26
+ return objects.to_json(include: options[:include]) if all_symbol
27
+
28
+ whole_obj_arr = []
29
+ objects.each do |object|
30
+ obj_arr = {}
31
+ options[:include].each do |relation|
32
+ if relation.is_a?(::Hash)
33
+ relation.keys.each do |property|
34
+ obj_arr[property] = JSON.parse(object.try(property).export({include: relation[property]}, object.try(property)))
35
+ end
36
+ elsif relation.is_a?(Symbol)
37
+ obj_arr[relation] = JSON.parse(object.try(:relation).to_json(include: relation))
38
+ end
39
+ end
40
+ whole_obj_arr.push(obj_arr)
41
+ end
42
+ JSON.generate(whole_obj_arr)
43
+ end
44
+ end
45
+
46
+ def export(options = {}, object = nil)
47
+ objects ||= self
48
+ all_symbol = true
49
+ options[:include] ||= []
50
+ options[:include] = [options[:include]] unless options[:include].is_a?(Array)
51
+ options[:include].each do |opt|
52
+ all_symbol = false unless opt.is_a?(Symbol)
53
+ end
54
+
55
+ return objects.to_json(include: options[:include]) if all_symbol
56
+
57
+ obj_hash = JSON.parse objects.to_json
58
+ options[:include].each do |relation|
59
+ if relation.is_a?(::Hash)
60
+ relation.keys.each do |property|
61
+ obj_hash[property] = JSON.parse(objects.try(property).includes(relation[property]).export({include: relation[property]}, objects.try(property)))
62
+ end
63
+ elsif relation.is_a?(Symbol)
64
+ obj_hash[relation] = JSON.parse(objects.try(relation).to_json)
65
+ end
11
66
  end
67
+ JSON.generate(obj_hash)
12
68
  end
13
69
  end
14
70
 
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.5
4
+ version: 0.0.6
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-18 00:00:00.000000000 Z
12
+ date: 2015-06-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails