spreadsheet_model 0.2.2 → 0.3.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
  SHA1:
3
- metadata.gz: 10ca8544a607a5f34299e84df3f5468ee6d0f714
4
- data.tar.gz: d0d6ba02cc33e9067a88b8cc5dbc9ef2469dbfe7
3
+ metadata.gz: 40c78687dd4fe2890ef78cc3129d1d936c9d0e42
4
+ data.tar.gz: 304e156c682b03a717e8e10cf4f4b538f42e6319
5
5
  SHA512:
6
- metadata.gz: fc36b3fdc2c616ee43c09ec88c07f6ff586e9a7129aacaf24e64c6ee5c0a8a70f9df5c6bcfe846101a499c84eef1bc8a22800c5ff730ebc62fd7a9789e76c66d
7
- data.tar.gz: 4d549beaa0740591711690b173a84b3adc3a71bce8dfc5072e1fdbeac8334713dba20148df71c92c5e3d84a7e15a9d8415ef270e35f208507cc5c23a28e52a89
6
+ metadata.gz: bbf58b4a25aec6f0ffadb7288a86bb8e59c15d8c5c142b01171856bfa4747ebcd2700c8764c8f904fa5b544a46a579cb7ab2986fb0e91c64ea71677d33c6cb2b
7
+ data.tar.gz: eaa7c50ad7e5e7da5c4590c14a8cc0b0cd470144a94fafea88fd8f6f3c5bb236f82223f9b6afc0b86f80aa89fcb41d03a39380bc39f77ffc6d1ce6565ca0c86d
data/Gemfile.lock CHANGED
@@ -24,6 +24,7 @@ GEM
24
24
  extlib (>= 0.9.15)
25
25
  multi_json (>= 1.0.0)
26
26
  builder (3.2.2)
27
+ coderay (1.1.1)
27
28
  extlib (0.9.16)
28
29
  faraday (0.9.2)
29
30
  multipart-post (>= 1.2, < 3)
@@ -61,6 +62,7 @@ GEM
61
62
  little-plugger (~> 1.1)
62
63
  multi_json (~> 1.10)
63
64
  memoist (0.14.0)
65
+ method_source (0.8.2)
64
66
  mini_portile2 (2.0.0)
65
67
  minitest (5.8.4)
66
68
  multi_json (1.11.2)
@@ -76,6 +78,10 @@ GEM
76
78
  multi_xml (~> 0.5)
77
79
  rack (~> 1.2)
78
80
  os (0.9.6)
81
+ pry (0.10.3)
82
+ coderay (~> 1.1.0)
83
+ method_source (~> 0.8.1)
84
+ slop (~> 3.4)
79
85
  rack (1.6.4)
80
86
  rake (10.5.0)
81
87
  retriable (1.4.1)
@@ -84,6 +90,7 @@ GEM
84
90
  faraday (~> 0.9)
85
91
  jwt (~> 1.5)
86
92
  multi_json (~> 1.10)
93
+ slop (3.6.0)
87
94
  thread_safe (0.3.5)
88
95
  tzinfo (1.2.2)
89
96
  thread_safe (~> 0.1)
@@ -94,6 +101,7 @@ PLATFORMS
94
101
  DEPENDENCIES
95
102
  bundler
96
103
  minitest (~> 5.0)
104
+ pry
97
105
  rake (~> 10.0)
98
106
  spreadsheet_model!
99
107
 
@@ -1,9 +1,9 @@
1
1
  require "spreadsheet_model/version"
2
- require 'google/api_client'
3
2
  require 'google_drive'
4
3
  require 'active_support'
5
4
  require 'active_support/core_ext'
6
5
  require 'active_model'
6
+ require 'google/api_client'
7
7
 
8
8
  module SpreadsheetModel
9
9
  extend ActiveSupport::Concern
@@ -43,25 +43,18 @@ module SpreadsheetModel
43
43
  rows.each do |row|
44
44
  row_hash = Hash[*header.zip(row).flatten]
45
45
  row_hash = @import_callback.call(row_hash) if @import_callback
46
- write_cache(row[0], row_hash) if row_hash.is_a? Hash
46
+ write_rows = [read_cache(row[0]), row_hash].compact.flatten
47
+ write_cache(row[0], write_rows)
47
48
  end
48
49
  end
49
50
  write_cache('__cached', true)
50
51
  end
51
52
 
52
- def self.find(key)
53
+ # inspired by:
54
+ # https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/relation/finder_methods.rb#L66
55
+ def self.find(*args)
53
56
  import unless cached?
54
- row = read_cache(key)
55
- return nil unless row
56
- attributes = row.select { |key, _| @@column_names.include?(key.to_sym) }
57
-
58
- if attributes['type'].to_s.present?
59
- instance = attributes['type'].constantize.new(attributes)
60
- else
61
- instance = self.new(attributes)
62
- end
63
- instance.instance_variable_set(:@__row, row)
64
- instance
57
+ find_with_ids(*args)
65
58
  end
66
59
 
67
60
  def self.cached?
@@ -70,6 +63,46 @@ module SpreadsheetModel
70
63
 
71
64
  private
72
65
 
66
+ # inspired by:
67
+ # https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/relation/finder_methods.rb#L411
68
+ def self.find_with_ids(*ids)
69
+ expects_array = ids.first.kind_of?(Array)
70
+ ids = ids.flatten.compact.uniq
71
+
72
+ case ids.size
73
+ when 0
74
+ raise RecordNotFound
75
+ when 1
76
+ if expects_array
77
+ result = find_some([ids.first])
78
+ else
79
+ result = find_one(ids.first)
80
+ end
81
+ else
82
+ find_some(ids)
83
+ end
84
+
85
+ end
86
+
87
+ # inspired by:
88
+ # https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/relation/finder_methods.rb#L432
89
+ def self.find_one(id)
90
+ rows = read_cache(id)
91
+ return nil unless rows
92
+
93
+ row_to_instance(rows[0])
94
+ end
95
+
96
+ # inspired by:
97
+ # https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/relation/finder_methods.rb#L449
98
+ def self.find_some(ids)
99
+ records = ids.map do |id|
100
+ read_cache(id).map do |row|
101
+ row_to_instance(row)
102
+ end
103
+ end.flatten
104
+ end
105
+
73
106
  def self.cache
74
107
  @@cache = Rails.cache if defined? Rails
75
108
  @@cache ||= ActiveSupport::Cache::MemoryStore.new
@@ -100,5 +133,19 @@ module SpreadsheetModel
100
133
  session = ::GoogleDrive.login_with_oauth(auth_token.token)
101
134
  session.spreadsheet_by_key(sheet_key).worksheets
102
135
  end
136
+
137
+ def self.row_to_instance(row)
138
+ attributes = row.select { |key, _| @@column_names.include?(key.to_sym) }
139
+
140
+ if attributes['type'].to_s.present?
141
+ instance = attributes['type'].constantize.new(attributes)
142
+ else
143
+ instance = self.new(attributes)
144
+ end
145
+
146
+ instance.instance_variable_set(:@__row, row)
147
+ instance
148
+ end
149
+
103
150
  end
104
151
  end
@@ -1,3 +1,3 @@
1
1
  module SpreadsheetModel
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -22,7 +22,8 @@ Gem::Specification.new do |spec|
22
22
  spec.add_dependency 'google_drive', '~> 1.0'
23
23
  spec.add_dependency 'activesupport'
24
24
  spec.add_dependency 'activemodel'
25
- spec.add_development_dependency "bundler"
26
- spec.add_development_dependency "rake", "~> 10.0"
27
- spec.add_development_dependency "minitest", "~> 5.0"
25
+ spec.add_development_dependency 'bundler'
26
+ spec.add_development_dependency 'rake', '~> 10.0'
27
+ spec.add_development_dependency 'minitest', '~> 5.0'
28
+ spec.add_development_dependency 'pry'
28
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spreadsheet_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - zucay
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-01-25 00:00:00.000000000 Z
11
+ date: 2016-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google_drive
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '5.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  description: model-like class without database using google spreadsheet
98
112
  email:
99
113
  - y.kawarazuka@gmail.com
@@ -134,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
148
  version: '0'
135
149
  requirements: []
136
150
  rubyforge_project:
137
- rubygems_version: 2.4.5.1
151
+ rubygems_version: 2.5.1
138
152
  signing_key:
139
153
  specification_version: 4
140
154
  summary: model-like class without database using google spreadsheet