attache_rails 0.1.0 → 0.1.2

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: 0c7546fc76fade2bf70f9075fe87be7b71fffa6f
4
- data.tar.gz: ee7f0526cbebe7292f685cb86ed501721d46f7b2
3
+ metadata.gz: 71bdf794a1a45cfb4a1c5a1f009a6b0986c2f036
4
+ data.tar.gz: aa0fd8c6977c2e78ae9114d3e53aa9a24ac3972e
5
5
  SHA512:
6
- metadata.gz: 76d9c2a0aeec9e6de2980cd752bcf4e7fc83720426e073d60e85073e5d6a97e2ef4211733a0e415fd9af9280c49da0e7af52a8678bc72ce27548b6b442983290
7
- data.tar.gz: 1b955d139c9fda1b3828e6f91a7ace1d8b213a92085cce02af4e0936c16b273558ee040082815dc93c391c1bc03530a5eed3a94ec9346d5b28e77999c488bf7d
6
+ metadata.gz: f83391852c79448f278812211b2fb9dbc9f61302da3049e3e9f1a80e346c515c0bcbe4ab4fd12e859f2d0df9c246c3692d296bd320268a3a613a36f3d3afcee0
7
+ data.tar.gz: d6a3d6c02e9d3aaf54beb9567da08238b91464270d4daf4edd8ce6602c4d279d8284e88f836e309b166135e221e22f67355190af8919356dfdb4deddc88fd194
@@ -24,7 +24,7 @@ var AttacheFileInput = React.createClass({displayName: "AttacheFileInput",
24
24
  onChange: function() {
25
25
  var file_element = this.getDOMNode().firstChild;
26
26
  // user cancelled file chooser dialog. ignore
27
- if (file_element.files.length == 0) return;
27
+ if (! file_element || file_element.files.length == 0) return;
28
28
  if (! this.props.multiple) this.state.files = {};
29
29
 
30
30
  this.setState(this.state);
@@ -24,7 +24,7 @@ var AttacheFileInput = React.createClass({
24
24
  onChange: function() {
25
25
  var file_element = this.getDOMNode().firstChild;
26
26
  // user cancelled file chooser dialog. ignore
27
- if (file_element.files.length == 0) return;
27
+ if (! file_element || file_element.files.length == 0) return;
28
28
  if (! this.props.multiple) this.state.files = {};
29
29
 
30
30
  this.setState(this.state);
@@ -1,9 +1,18 @@
1
- require "net/http"
1
+ require "cgi"
2
2
  require "uri"
3
+ require "httpclient"
3
4
 
4
5
  module AttacheRails
5
6
  module Utils
6
7
  class << self
8
+ def attache_upload_and_get_json(readable)
9
+ uri = URI.parse(ATTACHE_UPLOAD_URL)
10
+ uri.query = { file: (readable.try(:original_filename) || 'noname'), **attache_auth_options }.collect {|k,v|
11
+ CGI.escape(k.to_s) + "=" + CGI.escape(v.to_s)
12
+ }.join('&')
13
+ HTTPClient.post(uri, readable, {'Content-Type' => 'binary/octet-stream'}).body
14
+ end
15
+
7
16
  def attache_url_for(json_string, geometry)
8
17
  JSON.parse(json_string).tap do |attrs|
9
18
  prefix, basename = File.split(attrs['path'])
@@ -47,13 +56,18 @@ module AttacheRails
47
56
  end
48
57
 
49
58
  def attaches_discard!(files = attaches_discarded)
59
+ files.reject! &:blank?
60
+ files.uniq!
50
61
  if files.present?
51
62
  logger.info "DELETE #{files.inspect}"
52
- Net::HTTP.post_form(
63
+ HTTPClient.post_content(
53
64
  URI.parse(ATTACHE_DELETE_URL),
54
65
  Utils.attache_auth_options.merge(paths: files.join("\n"))
55
66
  )
56
67
  end
68
+ rescue Exception
69
+ raise if ENV['ATTACHE_DISCARD_FAILURE_RAISE_ERROR']
70
+ logger.warn [$!, $@]
57
71
  end
58
72
 
59
73
  module ClassMethods
@@ -62,6 +76,18 @@ module AttacheRails
62
76
  define_method "#{name}_options", -> (geometry, options = {}) { Utils.attache_options(geometry, [self.send("#{name}_attributes", geometry)], multiple: false, **options) }
63
77
  define_method "#{name}_url", -> (geometry) { self.send("#{name}_attributes", geometry).try(:[], 'url') }
64
78
  define_method "#{name}_attributes", -> (geometry) { str = self.send(name); Utils.attache_url_for(str, geometry) if str; }
79
+ define_method "#{name}=", -> (value) {
80
+ new_value = (value.respond_to?(:read) ? Utils.attache_upload_and_get_json(value) : value)
81
+ super(new_value)
82
+ }
83
+ define_method "#{name}_discard_was",-> do
84
+ new_value = self.send("#{name}")
85
+ old_value = self.send("#{name}_was")
86
+ obsoleted = [*old_value].collect {|x| JSON.parse(x)['path'] } - [*new_value].collect {|x| JSON.parse(x)['path'] }
87
+ self.attaches_discarded ||= []
88
+ self.attaches_discarded.push(*obsoleted)
89
+ end
90
+ after_update "#{name}_discard_was"
65
91
  define_method "#{name}_discard", -> do
66
92
  self.attaches_discarded ||= []
67
93
  self.attaches_discarded.push(self.send("#{name}_attributes", 'original')['path'])
@@ -78,6 +104,18 @@ module AttacheRails
78
104
  sum + (str.blank? ? [] : [Utils.attache_url_for(str, geometry)])
79
105
  end
80
106
  }
107
+ define_method "#{name}=", -> (array) {
108
+ new_value = ((array || []).reject(&:blank?).collect {|value| value.respond_to?(:read) ? Utils.attache_upload_and_get_json(value) : value })
109
+ super(new_value)
110
+ }
111
+ define_method "#{name}_discard_was",-> do
112
+ new_value = self.send("#{name}")
113
+ old_value = [*self.send("#{name}_was")]
114
+ obsoleted = old_value.collect {|x| JSON.parse(x)['path'] } - new_value.collect {|x| JSON.parse(x)['path'] }
115
+ self.attaches_discarded ||= []
116
+ obsoleted.each {|path| self.attaches_discarded.push(path) }
117
+ end
118
+ after_update "#{name}_discard_was"
81
119
  define_method "#{name}_discard", -> do
82
120
  self.attaches_discarded ||= []
83
121
  self.send("#{name}_attributes", 'original').each {|attrs| self.attaches_discarded.push(attrs['path']) }
@@ -1,3 +1,3 @@
1
1
  module AttacheRails
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.2"
3
3
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attache_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - choonkeat
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-25 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2015-04-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httpclient
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  description:
14
28
  email:
15
29
  - choonkeat@gmail.com