class Wedge

require 'wedge/require'

uses drop.js

Constants

ATTR_ACCESSORS
Form
Opal

Create our own opal instance.

VERSION

Public Class Methods

[](*args, &block) click to toggle source

Used to call a component.

@example

Browser[:foo].bar

@param name [String, Symbol, to_s] The unique name given to a component. @return [Wedge::Component#method] Last line of the method called.

# File lib/wedge.rb, line 167
def [](*args, &block)
  name = args.shift
  config.component_class[name.to_sym].wedge_new self, *args, &block
end
append_paths() click to toggle source

Append the correct paths to opal.

@return [Array] List of opal paths.

# File lib/wedge.rb, line 201
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}"

    true
  end
end
assets_url() click to toggle source
# File lib/wedge.rb, line 69
def assets_url
  url = config.assets_url.gsub(%r{^(http(|s)://[^\/]*\/|\/)}, '/')
  url.gsub /\n/, ''
end
assets_url_regex() click to toggle source
# File lib/wedge.rb, line 74
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}/(.*)\.(.*)$}
  end
end
assets_url_with_host() click to toggle source
# File lib/wedge.rb, line 83
def assets_url_with_host
  "#{config.assets_url}#{config.cache_assets ? "/#{config.assets_key}" : ''}"
end
build(path = 'wedge', options = {}) click to toggle source

Returns the build object for opal.

@param path [String] require path to file to build. @return [String, Opal::Builder#build]

# File lib/wedge.rb, line 189
def build(path = 'wedge', options = {})
  Opal::Builder.build(path, options) if append_paths
end
config() click to toggle source
# File lib/wedge.rb, line 253
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] = ::File.exist?('.wedge_assets_key') ? ::File.read('.wedge_assets_key') : nil
    end

    Config.new(args)
  end
end
create_assets_key() click to toggle source
# File lib/wedge.rb, line 245
def create_assets_key
  o = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten
  key = (0...50).map { o[rand(o.length)] }.join
  ::FileUtils.mkdir_p(File.dirname('.wedge_assets_key'))
  ::File.open('.wedge_assets_key', 'wb'){|f| f.write(key) }
  config.assets_key = key
end
events() click to toggle source
# File lib/wedge.rb, line 156
def events
  @events ||= Events.new
end
get_asset_urls(name) click to toggle source
# File lib/wedge.rb, line 118
def get_asset_urls name
  sprockets = Wedge.config.opal[:server].sprockets
  prefix = Wedge.assets_url_with_host
  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
html!(scope = false, &block) click to toggle source
# File lib/wedge.rb, line 87
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 = {}, url = false) click to toggle source

Return the opal javascript.

# File lib/wedge.rb, line 212
def javascript(path_name = 'wedge', options = {}, url = false)
  path_name = path_name.to_s

  if server?
    javascript_cache[path_name] ||= begin
      build(path_name, options).to_s
    end
  else
    trigger_javascript_loaded path_name, options
  end
end
javascript_cache() click to toggle source
# File lib/wedge.rb, line 136
def javascript_cache
  @javascript_cache ||= IndifferentHash.new
end
load_settings(settings) click to toggle source
# File lib/wedge.rb, line 42
def load_settings settings
  return unless settings

  case settings
  when Proc
    Wedge.config.instance_eval &settings
  else
    settings.each { |k, v| Wedge.config.send "#{k}=", v }
  end

  Wedge.config.opal = { server: Wedge::Opal::Server.new { |s|
    s.append_path "#{Dir.pwd}/#{Wedge.config.app_dir}"
    s.prefix  = Wedge.assets_url
    s.debug   = Wedge.config.debug
    s.headers = Wedge.config.assets_headers
    s.gzip    = Wedge.config.gzip_assets
  }}

  if Wedge.config.debug
    Wedge.config.opal[:sprockets]   = Wedge.config.opal[:server].sprockets
    Wedge.config.opal[:maps_prefix] = "#{Wedge.assets_url}/__OPAL_SOURCE_MAPS__"
    Wedge.config.opal[:maps_app]    = Opal::SourceMapServer.new Wedge.config.opal[:sprockets], Wedge.config.opal[:maps_prefix]

    Wedge::Opal::Sprockets::SourceMapHeaderPatch.inject! Wedge.config.opal[:maps_prefix]
  end
end
script_tag(name = 'wedge') click to toggle source

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

# File lib/wedge.rb, line 103
def script_tag name = 'wedge'
  sprockets = Wedge.config.opal[:server].sprockets
  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::Sprockets.load_asset(name, sprockets)}</script>}

  scripts.join "\n"
end
source_map(path = 'wedge', options = {}) click to toggle source

Source maps for the javascript

# File lib/wedge.rb, line 194
def source_map(path = 'wedge', options = {})
  build(path, options).source_map
end
trigger(wedge_name, event_name, *args) click to toggle source
# File lib/wedge.rb, line 152
def trigger(wedge_name, event_name, *args)
  events.trigger wedge_name, event_name, *args
end
trigger_browser_events() click to toggle source
# File lib/wedge.rb, line 142
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
trigger_javascript_loaded(path_name, options) click to toggle source
# File lib/wedge.rb, line 224
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
version() click to toggle source
# File lib/wedge/opal.rb, line 89
def self.version
  Wedge::VERSION
end