Class: Wedge

Inherits:
Object show all
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/plugins/form.rb,
lib/wedge/plugins/pjax.rb,
lib/wedge/utilis/methods.rb,
lib/wedge/plugins/history.rb,
lib/wedge/plugins/validations.rb,
lib/wedge/utilis/indifferent_hash.rb

Defined Under Namespace

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

Constant Summary collapse

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

Create our own opal instance.

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

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Methods

#client?, included, #server?

Class Method Details

.[](name, *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:



74
75
76
# File 'lib/wedge.rb', line 74

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

.assets_urlObject



29
30
31
32
# File 'lib/wedge.rb', line 29

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

.assets_url_with_hostObject



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

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

.configObject



157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/wedge.rb', line 157

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

    unless RUBY_ENGINE == 'opal'
      args[:path]       = caller.first.gsub(/(?<=\.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



63
64
65
# File 'lib/wedge.rb', line 63

def events
  @events ||= Events.new
end

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

Return the opal javascript.



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/wedge.rb', line 120

def javascript(path_name = 'wedge', options = {})
  if server?
    javascript_cache[path_name] ||= begin
      js = build(path_name, options).javascript

      if path_name == 'wedge'
        compiled_data = Base64.encode64 config.client_data.to_json
        # We need to merge in some data that is only set on the server.
        # i.e. path, assets_key etc....
        js << Opal.compile("Wedge.config.data = HashObject.new(JSON.parse(Base64.decode64('#{compiled_data}')).merge Wedge.config.data.to_h)")
        # load all global plugins into wedge
        config.plugins.each do |path|
          js << Wedge.javascript(path)
        end
      end

      js
    end
  else
    url   = "#{Wedge.assets_url_with_host}/#{options[:path]}.js"
    cache = options[:cache_assets]

    `jQuery.ajax({ url: url, dataType: "script", cache: cache }).done(function() {`
      comp = Wedge.store!(options[:store].indifferent)[options[:name]]

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

      Wedge.trigger_browser_events

     `}).fail(function(jqxhr, settings, exception){ window.console.log(exception); })`
  end
end

.script_tagObject



38
39
40
# File 'lib/wedge.rb', line 38

def script_tag
  "<script src='#{assets_url}/wedge.js'></script>"
end

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



59
60
61
# File 'lib/wedge.rb', line 59

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

Instance Method Details

#append_pathsArray

Append the correct paths to opal.

Returns:

  • (Array)

    List of opal paths.



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

def append_paths
  @append_paths ||= begin
    file     = method(:assets_url).source_location.first.sub('/wedge.rb', '')
    gems_dir = ::Opal.gem_dir.gsub(/(?<=gems)\/opal-.*/, '')
    Wedge::Opal.append_path file
    Wedge::Opal.append_path Dir.pwd
    Dir["#{gems_dir}/**/"].sort.each do |folder|
      Wedge::Opal.append_path "#{folder}/lib"
    end
  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:



94
95
96
# File 'lib/wedge.rb', line 94

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

#javascript_cacheObject



43
44
45
# File 'lib/wedge.rb', line 43

def javascript_cache
  @javascript_cache ||= IndifferentHash.new
end

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

Source maps for the javascript



99
100
101
# File 'lib/wedge.rb', line 99

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

#trigger_browser_eventsObject



49
50
51
52
53
54
55
56
# File 'lib/wedge.rb', line 49

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