activeresource-google_spreadsheets 0.0.4 → 0.0.5

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: 0ea1d38e730233fa7f2f4458cc08fe708fcd5e84
4
- data.tar.gz: e1dacea922cdaf99b35e14fee4a01fd60d28f6c2
3
+ metadata.gz: ee5a88e671575377719e758fbb016246e7a57442
4
+ data.tar.gz: 9a23675af46c1f18dc10a790ace9ee1cf131bede
5
5
  SHA512:
6
- metadata.gz: ff2927902dfd953d8f91430546ee62c192ca1b9865bd95de630135556aa1a2e4210205ead6052324b999278706c6f9fc14a2501d2f23b01dc2a5a3a4e0644859
7
- data.tar.gz: 5112a41c9a8df397c5c88ceaab92d9cbcd74666042970290bf3cf006d8dc79efd0e1cbfea4b9dd0f3483a3df7fbbf76cd4ab5f2875b53ea14a7d87ab894af32c
6
+ metadata.gz: e9067064a7a0d96b896d5baf966aee497ed628c3b4fa9e37ecfad81c80a2e5a25afdf7fa72be15c9ae16d1215c896d1d5a943119250d2e7a0a4dce37340892de
7
+ data.tar.gz: 1e2f0d7ed3ab42e91028b858583fb4e38fab015d662b5b9622b7ca054db123dc763643b34dd010f67d627f93e2c79058e1ad3d23ea0ea1a82983ba98133b2be0
@@ -3,6 +3,9 @@ module GoogleSpreadsheets
3
3
  module Syncing
4
4
  extend ActiveSupport::Concern
5
5
 
6
+ REL_NAME_SPREADSHEET = 'http://schemas.google.com/spreadsheets/2006#spreadsheet'
7
+ REL_NAME_ROW = 'http://schemas.google.com/spreadsheets/2006#listfeed'
8
+
6
9
  included do
7
10
  class_attribute :synchronizers
8
11
  self.synchronizers = {}
@@ -18,7 +21,8 @@ module GoogleSpreadsheets
18
21
  def sync_with(rows_name, options)
19
22
  options.assert_valid_keys(:spreadsheet_id, :worksheet_title, :class_name)
20
23
  options[:worksheet_title] ||= rows_name.to_s
21
- synchronizer = Synchronizer.new(self, options[:spreadsheet_id], options[:worksheet_title])
24
+ options[:class_name] ||= rows_name.to_s.classify
25
+ synchronizer = Synchronizer.new(self, options[:class_name].safe_constantize, options[:spreadsheet_id], options[:worksheet_title])
22
26
  self.synchronizers.merge!(rows_name => synchronizer)
23
27
 
24
28
  # rows accessor
@@ -42,29 +46,37 @@ module GoogleSpreadsheets
42
46
  end
43
47
 
44
48
  class Synchronizer
45
- attr_reader :klass, :spreadsheet_id, :worksheet_title
49
+ attr_reader :record_class, :row_class, :spreadsheet_id, :worksheet_title
46
50
 
47
- def initialize(klass, spreadsheet_id, worksheet_title)
48
- @klass = klass
51
+ def initialize(record_class, row_class, spreadsheet_id, worksheet_title)
52
+ @record_class = record_class
53
+ @row_class = row_class || default_class_for(REL_NAME_ROW)
49
54
  @spreadsheet_id = spreadsheet_id
50
55
  @worksheet_title = worksheet_title
51
56
  end
52
57
 
53
58
  def all_rows
54
- worksheet.rows
59
+ reflections = worksheet.class.reflections.values.find_all{|ref| ref.is_a?(LinkRelations::LinkRelationReflection) }
60
+ if reflection = reflections.find{|ref| ref.klass == row_class }
61
+ worksheet.send(reflection.name)
62
+ elsif reflection = reflections.find{|ref| ref.options[:rel] == REL_NAME_ROW }
63
+ worksheet.send(reflection.name, as: row_class.to_s)
64
+ else
65
+ raise "Reflection for #{row_class.to_s} not found."
66
+ end
55
67
  end
56
68
 
57
69
  def sync_with_rows
58
70
  reset
59
71
  records = all_rows.map do |row|
60
- @klass.find_or_initialize_by(id: row.id).tap do |record|
72
+ record_class.find_or_initialize_by(id: row.id).tap do |record|
61
73
  row.aliased_attributes.each do |attr|
62
74
  record.send("#{attr}=", row.send(attr))
63
75
  end
64
76
  end
65
77
  end
66
78
  skipping_outbound_sync_of(records) do |records_with_skipped_outbound|
67
- transaction_if_possible(@klass) do
79
+ transaction_if_possible(record_class) do
68
80
  records_with_skipped_outbound.each(&:save)
69
81
  end
70
82
  end
@@ -88,10 +100,10 @@ module GoogleSpreadsheets
88
100
  end
89
101
 
90
102
  def worksheet
91
- @worksheet ||= spreadsheet_class_name.constantize
92
- .find(@spreadsheet_id)
103
+ @worksheet ||= default_class_for(REL_NAME_SPREADSHEET)
104
+ .find(spreadsheet_id)
93
105
  .worksheets
94
- .find_by!(title: @worksheet_title)
106
+ .find_by!(title: worksheet_title)
95
107
  end
96
108
 
97
109
  def reset
@@ -100,8 +112,8 @@ module GoogleSpreadsheets
100
112
  end
101
113
 
102
114
  private
103
- def spreadsheet_class_name(rel_name = 'http://schemas.google.com/spreadsheets/2006#spreadsheet')
104
- LinkRelations.class_name_mappings[rel_name].classify
115
+ def default_class_for(rel_name)
116
+ LinkRelations.class_name_mappings[rel_name].classify.constantize
105
117
  end
106
118
 
107
119
  def transaction_if_possible(origin = self, &block)
@@ -36,15 +36,17 @@ module GoogleSpreadsheets
36
36
  def defines_links_to_many_finder_method(method_name, relation_name, association_model)
37
37
  ivar_name = :"@#{method_name}"
38
38
 
39
- define_method(method_name) do
39
+ define_method(method_name) do |options = {}|
40
+ options.assert_valid_keys(:as)
40
41
  if instance_variable_defined?(ivar_name)
41
42
  instance_variable_get(ivar_name)
42
43
  elsif attributes.include?(method_name)
43
44
  attributes[method_name]
44
45
  else
45
- link = self.link.find{|l| l.rel == relation_name }
46
+ model = options[:as].try{|as| as.to_s.safe_constantize } || association_model
47
+ link = self.link.find{|l| l.rel == relation_name }
46
48
  path = link.href.slice(%r|^https://spreadsheets\.google\.com(/.*)|, 1)
47
- instance_variable_set(ivar_name, association_model.find(:all, from: path))
49
+ instance_variable_set(ivar_name, model.find(:all, from: path))
48
50
  end
49
51
  end
50
52
  end
@@ -1,3 +1,3 @@
1
1
  module GoogleSpreadsheets
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeresource-google_spreadsheets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chihiro Ito
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-09 00:00:00.000000000 Z
12
+ date: 2014-01-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activeresource