Class: Wedge

Inherits:
Object show all
Extended by:
Forwardable
Includes:
Methods
Defined in:
lib/wedge.rb,
lib/wedge/dom.rb,
lib/wedge/html.rb,
lib/wedge/opal.rb,
lib/wedge/config.rb,
lib/wedge/events.rb,
lib/wedge/version.rb,
lib/wedge/component.rb,
lib/wedge/middleware.rb,
lib/wedge/plugins/form.rb,
lib/wedge/plugins/pjax.rb,
lib/wedge/plugins/render.rb,
lib/wedge/utilis/methods.rb,
lib/wedge/plugins/factory.rb,
lib/wedge/plugins/history.rb,
lib/wedge/plugins/uploader.rb,
lib/wedge/plugins/form_backup.rb,
lib/wedge/plugins/ability_list.rb,
lib/wedge/plugins/current_user.rb,
lib/wedge/utilis/indifferent_hash.rb,
lib/wedge/plugins/form/validations.rb

Defined Under Namespace

Modules: HTML, Methods, Plugins Classes: Component, Config, DOM, Events, IndifferentHash, Middleware

Constant Summary collapse

ATTR_ACCESSORS =
%i{scope store config events method_called}
Opal =

Create our own opal instance.

::Opal.dup
VERSION =
'0.1.32'
Form =
Wedge::Plugins::Form

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Methods

#client?, included, #server?

Class Method Details

.[](*args, &block) ⇒ Wedge::Component#method

Used to call a component.

Examples:

Browser[:foo].bar

Parameters:

  • name (String, Symbol, #to_s)

    The unique name given to a component.

Returns:



134
135
136
# File 'lib/wedge.rb', line 134

def [](*args, &block)
  config.component_class[args.shift].wedge_new self, *args, &block
end

.assets_urlObject



35
36
37
38
# File 'lib/wedge.rb', line 35

def assets_url
  url = config.assets_url.gsub(%r{^(http(|s)://[^\/]*\/|\/)}, '/')
  "#{url}#{config.cache_assets ? "/#{config.assets_key}" : ''}"
end

.assets_url_regexObject



40
41
42
43
44
45
46
47
# File 'lib/wedge.rb', line 40

def assets_url_regex
  @assets_url_regex ||= begin
    assets_url = ::Wedge.assets_url.gsub(%r{^\/}, '')
    # # We also allow for no assets key so when we post server methods there
    # # isn't an error if the key has been changed since a browser refresh.
    %r{(?:#{assets_url}|#{assets_url.sub("#{::Wedge.config.assets_key}/", '')})/(.*)\.(.*)$}
  end
end

.assets_url_with_hostObject



49
50
51
# File 'lib/wedge.rb', line 49

def assets_url_with_host
  "#{config.assets_url}#{config.cache_assets ? "/#{config.assets_key}" : ''}"
end

.configObject



237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/wedge.rb', line 237

def config
  @config ||= begin
    args = { component_class: IndifferentHash.new }

    unless RUBY_ENGINE == 'opal'
      args[:path]       = method(:assets_url).source_location.first.sub('/wedge.rb', '')
      args[:assets_key] = begin
        if defined?(PlatformAPI) && ENV['HEROKU_TOKEN'] && ENV['HEROKU_APP']
          heroku = PlatformAPI.connect_oauth(ENV['HEROKU_TOKEN'], default_headers: {'Range' => 'version ..; order=desc'})
          slug_id = heroku.release.list(ENV['HEROKU_APP']).first["slug"]["id"]
          heroku.slug.info(ENV['HEROKU_APP'], slug_id)["commit"]
        else
          `git rev-parse HEAD 2>/dev/null`.to_s.strip
        end
      end
    end

    Config.new(args)
  end
end

.eventsObject



123
124
125
# File 'lib/wedge.rb', line 123

def events
  @events ||= Events.new
end

.html!(scope = false, &block) ⇒ Object



53
54
55
56
57
58
59
60
61
# File 'lib/wedge.rb', line 53

def html!(scope = false, &block)
  if !block_given?
    html = HTML::DSL.html(&scope).to_html
  else
    html = HTML::DSL.scope!(scope).html(&block).to_html
  end

  DOM.new html
end

.javascript(path_name = 'wedge', options = {}) ⇒ Object

Return the opal javascript.



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
# File 'lib/wedge.rb', line 176

def javascript(path_name = 'wedge', options = {})
  path_name = path_name.to_s

  if server?
    javascript_cache[path_name] ||= begin
      build(path_name, options).to_s
    end
  else
    # note: ?body=1 is a hack for sprockets to make source maps work # correctly.
    # url   = "#{url}?body=1" if Wedge.config.debug
    cache = options[:cache_assets]

    if !Wedge.config.debug
      url = "#{Wedge.assets_url_with_host}/#{options[:path]}.js"

      `jQuery.ajax({ url: url, dataType: "script", cache: cache }).done(function() {`
        trigger_javascript_loaded path_name, options
       `}).fail(function(jqxhr, settings, exception){ window.console.log(exception); })`
    else
      url     = "#{Wedge.assets_url_with_host}/wedge/list_assets.call"
      payload = { path_name: path_name}
      headers = {
        'X-CSRF-TOKEN' => Element.find('meta[name=_csrf]').attr('content'),
      }
      HTTP.post(url, dataType: 'json', headers: headers, payload:  payload) do |response|
        res  = JSON.from_object(`response`)

        res[:body][:urls].each do |url|
          `jQuery.ajax({url: url, dataType: "script", cache: cache, async: false})`
        end

        code = res[:body][:code]
        `jQuery.globalEval(code);`

        trigger_javascript_loaded path_name, options
      end
    end
  end
end

.trigger(wedge_name, event_name, *args) ⇒ Object



119
120
121
# File 'lib/wedge.rb', line 119

def trigger(wedge_name, event_name, *args)
  events.trigger wedge_name, event_name, *args
end

.trigger_javascript_loaded(path_name, options) ⇒ Object



216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
# File 'lib/wedge.rb', line 216

def trigger_javascript_loaded path_name, options
  # fix: at the moment to_js called from the server will set the class
  # store for whatever method it calls.  we need to think of a better idea
  # for global and local data store.
  Wedge.config.component_class[options[:name]].config.store = options[:store].indifferent

  if initialize_args = options.delete(:initialize_args)
    comp = Wedge[options[:name], *initialize_args]
  else
    comp = Wedge[options[:name]]
  end

  if options[:method_args].any?
    comp.send(options[:method_called], options[:method_args])
  else
    comp.send(options[:method_called])
  end

  Wedge.trigger_browser_events
end

.versionObject



83
84
85
# File 'lib/wedge/opal.rb', line 83

def self.version
  Wedge::VERSION
end

Instance Method Details

#append_pathsArray

Append the correct paths to opal.

Returns:

  • (Array)

    List of opal paths.



167
168
169
170
171
172
# File 'lib/wedge.rb', line 167

def append_paths
  @append_paths ||= begin
    Wedge::Opal.append_path method(:assets_url).source_location.first.sub('/wedge.rb', '')
    Wedge::Opal.append_path "#{Dir.pwd}/#{config.app_dir}"
  end
end

#build(path = 'wedge', options = {}) ⇒ String, Opal::Builder#build

Returns the build object for opal.

Parameters:

  • path (String) (defaults to: 'wedge')

    require path to file to build.

Returns:



155
156
157
# File 'lib/wedge.rb', line 155

def build(path = 'wedge', options = {})
  Opal::Builder.build(path, options) if append_paths
end

#get_asset_urls(name) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/wedge.rb', line 85

def get_asset_urls name
  sprockets = Wedge.config.opal[:server].sprockets
  prefix = Wedge.config.opal[:server].prefix
  asset = sprockets[name]
  raise "Cannot find asset: #{name}" if asset.nil?
  urls = []

  if Wedge.config.opal[:server].debug
    asset.to_a.map do |dependency|
      urls << %{#{prefix}/#{dependency.logical_path}?body=1}
    end
  else
    urls << %{#{prefix}/#{name}.js}
  end

  urls
end

#javascript_cacheObject



103
104
105
# File 'lib/wedge.rb', line 103

def javascript_cache
  @javascript_cache ||= IndifferentHash.new
end

#script_tag(name = 'wedge') ⇒ Object

def script_tag

# note: ?body=1 is a hack for sprockets to make source maps work # correctly.
"<script src='#{assets_url_with_host}/wedge.js#{Wedge.config.debug ? '?body=1' : ''}' type='text/javascript'></script>"

end



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/wedge.rb', line 69

def script_tag name = 'wedge'
  sprockets = Wedge.config.opal[:server].sprockets
  prefix = Wedge.config.opal[:server].prefix
  asset = sprockets[name]
  raise "Cannot find asset: #{name}" if asset.nil?
  scripts = []

  get_asset_urls(name).each do |url|
    scripts << %{<script src="#{url}"></script>}
  end

  scripts << %{<script>#{Wedge::Opal::Processor.load_asset_code(sprockets, name)}</script>}

  scripts.join "\n"
end

#source_map(path = 'wedge', options = {}) ⇒ Object

Source maps for the javascript



160
161
162
# File 'lib/wedge.rb', line 160

def source_map(path = 'wedge', options = {})
  build(path, options).source_map
end

#trigger_browser_eventsObject



109
110
111
112
113
114
115
116
# File 'lib/wedge.rb', line 109

def trigger_browser_events
  config.component_class.each do |k, klass|
    next if klass.config.triggered_browser_events
    klass.config.triggered_browser_events = true

    Wedge.trigger klass.config.name, :browser_events
  end
end