spreadsheet_model 0.2.2 → 0.3.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: 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