bowser 0.1.6 → 0.2.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: ac48b6c960c686e0e71ad73fb054d97bb489e952
4
- data.tar.gz: 4e9c12c81572ccce1211749da99ef252751ff7b9
3
+ metadata.gz: 4e07cbed8dbba587239bd6773b8b773d91195bda
4
+ data.tar.gz: a2cb7057cc1c44b61fe984a0a62f894be35e4cd3
5
5
  SHA512:
6
- metadata.gz: d761d6abc3d00bfd153a030d076cf214e3cc2dba5550e6a1dd824b641b5bc6f3e6be7636b2eaf055af7a5d2cda5bd39ed0e95957c2f50db959586fd5d3e77e50
7
- data.tar.gz: efa04ac75ec95bc480b2aebebd064d24f7445b2eb037359e7c37d9c6bdf12ac44e1294d6ae075027a2dad03f8c70b62aff02a69d11d59f553a94e1ec4d26790a
6
+ metadata.gz: cbfbe22f47b55da1d77c8c29613c950143c8604c7eca48c264536f221a3c577109c3a7b17b7e58453d6d27985f606d52065d41604f526cd0c339969def96ac22
7
+ data.tar.gz: 5b5d6a3ef2917d336c47febfea38b0b1c1e14a25a24457d6ef304c42193cb59f032a9273733bfcf13e8069bf313094a21e069673fdbbc379f1fabb3da0d5dfa8
@@ -1,4 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.3
4
- before_install: gem install bundler -v 1.10.6
3
+ - 2.2.5
4
+ - 2.3.1
5
+ - jruby-9.0.5.0
6
+ - jruby-9.1.1.0
7
+ before_install: gem install bundler
@@ -0,0 +1,48 @@
1
+ ## Version 0.2.0
2
+
3
+ - Allow specifying methods for HTTP requests, including file uploads
4
+ - Add `Element#to_n` and `Event#to_n` to unwrap the native objects
5
+ - Make HTTP events just use `Bowser::Event` instead of their own type
6
+ - Proxy all native element/event properties
7
+ - This provides the following types of translations from Ruby method names to JS property names:
8
+ - `element.text_content` in Ruby becomes `element.textContent` in JS
9
+ - Predicates like `element.content_editable?` checks for `contentEditable` and `isContentEditable` properties, preferring the version without `is` if both exist.
10
+ - If the property is a function, it gets called.
11
+ - No wrapping of results is done for proxied properties. You get the raw JS value back.
12
+ - Add `Element#children` to wrap child nodes in `Bowser::Element` objects
13
+ - Add `Bowser.window.location.hash`
14
+ - Add `Bowser.window.has_push_state?`
15
+ - Use `load` event for `Bowser::HTTP::Request` instead of `success`. It was causing problems and `load` is the canonical event to use.
16
+
17
+ ## Version 0.1.5
18
+
19
+ - Fix `animation_frame` polyfill delay
20
+ - Add the abillity to upload files directly from file input elements
21
+ - Allowing this instead of reading the files in first is a HUGE memory savings for large files. It uses the browser's internal streaming capabilities so we don't need to load the full file into memory.
22
+ - Memoize file read data
23
+
24
+ ## Version 0.1.4
25
+
26
+ - Relax Opal version restriction to 0.8-0.11
27
+ - Add `Bowser::HTTP::Response#text` to get the raw response body instead of assuming JSON
28
+ - Fix JSON dependency loading instead of assuming it's there
29
+
30
+ ## Version 0.1.3
31
+
32
+ - Add `Event#stop_propagation`
33
+ - Add first-class support for `file` input fields
34
+
35
+ ## Version 0.1.2
36
+
37
+ - Add `Bowser::Window::Location#href`
38
+ - Fix missing element check for `Document#[]`
39
+
40
+ ## Version 0.1.1
41
+
42
+ - Add `Window#scroll`
43
+ - Add `Window::History#push`
44
+ - Add WebSocket support
45
+
46
+ ## Version 0.1.0
47
+
48
+ - Initial release
@@ -1,3 +1,3 @@
1
1
  module Bowser
2
- VERSION = "0.1.6"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -18,24 +18,49 @@ module Bowser
18
18
  `#@native.innerHTML`
19
19
  end
20
20
 
21
- def clear
21
+ def inner_html= html
22
+ `#@native.innerHTML = html`
23
+ end
24
+
25
+ def children
26
+ elements = []
27
+
22
28
  %x{
23
- var native = #@native;
24
-
25
- if(native.nodeName === 'INPUT' || native.nodeName === 'TEXTAREA') {
26
- native.value = null;
27
- } else {
28
- var children = native.children;
29
- for(var i = 0; i < children.length; i++) {
30
- children[i].remove();
31
- }
32
- }
29
+ var children = #@native.children;
30
+ for(var i = 0; i < children.length; i++) {
31
+ elements[i] = #{Element.new(`children[i]`)};
32
+ }
33
33
  }
34
+
35
+ elements
36
+ end
37
+
38
+ def empty?
39
+ `#@native.children.length === 0`
40
+ end
41
+
42
+ def clear
43
+ if %w(input textarea).include? type
44
+ `#@native.value = null`
45
+ else
46
+ children.each do |child|
47
+ remove_child child
48
+ end
49
+ end
50
+
34
51
  self
35
52
  end
36
53
 
54
+ def remove_child child
55
+ `#@native.removeChild(child.native ? child.native : child)`
56
+ end
57
+
58
+ def type
59
+ `#@native.nodeName`.downcase
60
+ end
61
+
37
62
  def append node
38
- `#@native.appendChild(node)`
63
+ `#@native.appendChild(node.native ? node.native : node)`
39
64
  self
40
65
  end
41
66
 
@@ -44,10 +69,6 @@ module Bowser
44
69
  `!!#@native.checked`
45
70
  end
46
71
 
47
- def value
48
- `#@native.value`
49
- end
50
-
51
72
  # Convenience for when you only need a single file
52
73
  def file
53
74
  files.first
@@ -56,5 +77,48 @@ module Bowser
56
77
  def files
57
78
  FileList.new(`#@native.files`)
58
79
  end
80
+
81
+ # Fall back to native properties.
82
+ def method_missing message, *args, &block
83
+ camel_cased_message = message
84
+ .gsub(/_\w/) { |match| match[1].upcase }
85
+ .sub(/=$/, '')
86
+
87
+ # translate setting a property
88
+ if message.end_with? '='
89
+ return `#@native[camel_cased_message] = args[0]`
90
+ end
91
+
92
+ # translate `supported?` to `supported` or `isSupported`
93
+ if message.end_with? '?'
94
+ camel_cased_message = camel_cased_message.chop
95
+ property_type = `typeof(#@native[camel_cased_message])`
96
+ if property_type == 'undefined'
97
+ camel_cased_message = "is#{camel_cased_message[0].upcase}#{camel_cased_message[1..-1]}"
98
+ end
99
+ end
100
+
101
+ # If the native element doesn't have this property, bubble it up
102
+ super if `typeof(#@native[camel_cased_message]) === 'undefined'`
103
+
104
+ property = `#@native[camel_cased_message]`
105
+
106
+ if `property === false`
107
+ return false
108
+ else
109
+ property = `property || nil`
110
+ end
111
+
112
+ # If it's a method, call it. Otherwise, return it.
113
+ if `typeof(property) === 'function'`
114
+ `property.apply(#@native, args)`
115
+ else
116
+ property
117
+ end
118
+ end
119
+
120
+ def to_n
121
+ @native
122
+ end
59
123
  end
60
124
  end
@@ -50,5 +50,9 @@ module Bowser
50
50
  super
51
51
  end
52
52
  end
53
+
54
+ def to_n
55
+ @native
56
+ end
53
57
  end
54
58
  end
@@ -8,9 +8,9 @@ module Bowser
8
8
  module HTTP
9
9
  module_function
10
10
 
11
- def fetch(url)
11
+ def fetch(url, method: :get)
12
12
  promise = Promise.new
13
- request = Request.new(:get, url)
13
+ request = Request.new(method, url)
14
14
 
15
15
  connect_events_to_promise request, promise
16
16
 
@@ -19,9 +19,9 @@ module Bowser
19
19
  promise
20
20
  end
21
21
 
22
- def upload(url, data, content_type: 'application/json')
22
+ def upload(url, data, content_type: 'application/json', method: :post)
23
23
  promise = Promise.new
24
- request = Request.new(:post, url)
24
+ request = Request.new(method, url)
25
25
 
26
26
  connect_events_to_promise request, promise
27
27
 
@@ -30,9 +30,9 @@ module Bowser
30
30
  promise
31
31
  end
32
32
 
33
- def upload_files(url, files, key: 'files', key_suffix: '[]')
33
+ def upload_files(url, files, key: 'files', key_suffix: '[]', method: :post)
34
34
  promise = Promise.new
35
- request = Request.new(:post, url)
35
+ request = Request.new(method, url)
36
36
 
37
37
  connect_events_to_promise request, promise
38
38
 
@@ -46,8 +46,8 @@ module Bowser
46
46
  promise
47
47
  end
48
48
 
49
- def upload_file(url, file, key: 'file')
50
- upload_files(url, [file], key: key, key_suffix: nil)
49
+ def upload_file(url, file, key: 'file', method: :post)
50
+ upload_files(url, [file], key: key, key_suffix: nil, method: method)
51
51
  end
52
52
 
53
53
  def connect_events_to_promise(request, promise)
@@ -1,5 +1,5 @@
1
1
  require 'bowser/http/response'
2
- require 'bowser/http/event'
2
+ require 'bowser/event_target'
3
3
 
4
4
  module Bowser
5
5
  module HTTP
@@ -41,6 +41,14 @@ module Bowser
41
41
  module Location
42
42
  module_function
43
43
 
44
+ def hash
45
+ `window.location.hash`
46
+ end
47
+
48
+ def hash= hash
49
+ `window.location.hash = hash`
50
+ end
51
+
44
52
  def path
45
53
  `window.location.pathname`
46
54
  end
@@ -57,6 +65,10 @@ module Bowser
57
65
  module History
58
66
  module_function
59
67
 
68
+ def has_push_state?
69
+ `!!window.history.pushState`
70
+ end
71
+
60
72
  def push path
61
73
  `window.history.pushState({}, '', path)`
62
74
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bowser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamie Gaskins
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-18 00:00:00.000000000 Z
11
+ date: 2016-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opal
@@ -82,6 +82,7 @@ files:
82
82
  - ".gitignore"
83
83
  - ".rspec"
84
84
  - ".travis.yml"
85
+ - CHANGELOG.md
85
86
  - CODE_OF_CONDUCT.md
86
87
  - Gemfile
87
88
  - LICENSE.md
@@ -99,7 +100,6 @@ files:
99
100
  - opal/bowser/event_target.rb
100
101
  - opal/bowser/file_list.rb
101
102
  - opal/bowser/http.rb
102
- - opal/bowser/http/event.rb
103
103
  - opal/bowser/http/form_data.rb
104
104
  - opal/bowser/http/request.rb
105
105
  - opal/bowser/http/response.rb
@@ -125,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
125
  version: '0'
126
126
  requirements: []
127
127
  rubyforge_project:
128
- rubygems_version: 2.4.5.1
128
+ rubygems_version: 2.6.6
129
129
  signing_key:
130
130
  specification_version: 4
131
131
  summary: Minimalist browser support for Opal apps
@@ -1,9 +0,0 @@
1
- module Bowser
2
- module HTTP
3
- class Event
4
- def initialize native
5
- @native = native
6
- end
7
- end
8
- end
9
- end