opal 0.3.42 → 0.3.43
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +29 -0
- data/CONTRIBUTING.md +9 -1
- data/Rakefile +58 -21
- data/config.ru +14 -0
- data/examples/rack/Gemfile +3 -0
- data/examples/rack/README.md +22 -0
- data/examples/rack/app/app.rb +5 -0
- data/examples/rack/config.ru +20 -0
- data/examples/rack/index.html +12 -0
- data/examples/server/Gemfile +3 -0
- data/examples/server/README.md +22 -0
- data/examples/server/app/app.rb +18 -0
- data/examples/server/config.ru +10 -0
- data/examples/server/index.html.erb +10 -0
- data/lib/opal.rb +4 -1
- data/lib/opal/erb.rb +41 -0
- data/lib/opal/lexer.rb +1 -1
- data/lib/opal/parser.rb +5 -12
- data/lib/opal/processor.rb +70 -0
- data/lib/opal/server.rb +93 -0
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +1 -1
- data/opal/{opal/date.rb → date.rb} +0 -0
- data/opal/erb.rb +19 -0
- data/{spec → opal}/fileutils.rb +0 -0
- data/{spec → opal}/iconv.rb +0 -0
- data/opal/observer.rb +202 -0
- data/opal/opal-browser/local_storage.rb +27 -0
- data/opal/opal-browser/script_loader.rb +40 -0
- data/opal/opal-eventable.rb +26 -0
- data/opal/opal-parser.js.erb +8 -3
- data/opal/{opal/template.rb → opal-template.rb} +0 -0
- data/opal/opal.rb +20 -18
- data/opal/opal/array.rb +1 -1
- data/opal/opal/class.rb +6 -1
- data/opal/opal/kernel.rb +1 -1
- data/opal/opal/native.rb +91 -5
- data/opal/opal/runtime.js +39 -8
- data/{spec → opal}/pp.rb +0 -0
- data/opal/{opal/racc.rb → racc.rb} +0 -0
- data/{spec → opal}/rbconfig.rb +0 -0
- data/opal/{opal/strscan.rb → strscan.rb} +0 -0
- data/{spec → opal}/yaml.rb +0 -0
- data/spec/{core_ext → opal}/array/element_reference_spec.rb +0 -0
- data/spec/{core_ext → opal}/array/equal_value_spec.rb +0 -0
- data/spec/{core_ext → opal}/array/fill_spec.rb +0 -0
- data/spec/{core_ext → opal}/array/reduce_spec.rb +0 -0
- data/spec/{core_ext → opal}/array/to_json_spec.rb +0 -0
- data/spec/{core_ext → opal}/basic_object/send_spec.rb +0 -0
- data/spec/{core_ext → opal}/boolean/singleton_class_spec.rb +0 -0
- data/spec/{core_ext → opal}/boolean/to_json_spec.rb +0 -0
- data/spec/opal/browser/local_storage_spec.rb +55 -0
- data/spec/{core_ext → opal}/class/_inherited_spec.rb +0 -0
- data/spec/{core_ext → opal}/class/proc_methods_spec.rb +0 -0
- data/spec/{core_ext → opal}/class/singleton_methods_spec.rb +0 -0
- data/spec/{core_ext → opal}/constants_spec.rb +0 -0
- data/spec/opal/erb/erb_spec.rb +31 -0
- data/spec/opal/eventable_spec.rb +75 -0
- data/spec/{core_ext → opal}/method_missing_spec.rb +0 -0
- data/spec/opal/native/element_reference_spec.rb +40 -0
- data/spec/opal/native/equal_spec.rb +17 -0
- data/spec/opal/native/fixtures/classes.rb +27 -0
- data/spec/opal/native/global_spec.rb +12 -0
- data/spec/opal/native/initialize_spec.rb +8 -0
- data/spec/opal/native/method_missing_spec.rb +53 -0
- data/spec/{core_ext → opal}/native/to_native_spec.rb +1 -1
- data/spec/{core_ext → opal}/nil/to_json_spec.rb +0 -0
- data/spec/opal/runtime/eval_spec.rb +5 -0
- data/spec/opal/runtime/send_spec.rb +34 -0
- data/spec/ospec/main.rb.erb +9 -3
- data/spec/ospec/runner.rb +132 -5
- data/spec/{grammar → parser}/alias_spec.rb +0 -0
- data/spec/{grammar → parser}/and_spec.rb +0 -0
- data/spec/{grammar → parser}/array_spec.rb +0 -0
- data/spec/{grammar → parser}/attrasgn_spec.rb +0 -0
- data/spec/{grammar → parser}/begin_spec.rb +0 -0
- data/spec/{grammar → parser}/block_spec.rb +0 -0
- data/spec/{grammar → parser}/break_spec.rb +0 -0
- data/spec/{grammar → parser}/call_spec.rb +0 -0
- data/spec/{grammar → parser}/class_spec.rb +0 -0
- data/spec/{grammar → parser}/const_spec.rb +0 -0
- data/spec/{grammar → parser}/cvar_spec.rb +0 -0
- data/spec/{grammar → parser}/def_spec.rb +0 -0
- data/spec/{grammar → parser}/false_spec.rb +0 -0
- data/spec/{grammar → parser}/file_spec.rb +0 -0
- data/spec/{grammar → parser}/gvar_spec.rb +0 -0
- data/spec/{grammar → parser}/hash_spec.rb +0 -0
- data/spec/{grammar → parser}/iasgn_spec.rb +0 -0
- data/spec/{grammar → parser}/if_spec.rb +0 -0
- data/spec/{grammar → parser}/iter_spec.rb +0 -0
- data/spec/{grammar → parser}/ivar_spec.rb +0 -0
- data/spec/{grammar → parser}/lambda_spec.rb +0 -0
- data/spec/{grammar → parser}/lasgn_spec.rb +0 -0
- data/spec/{grammar → parser}/line_spec.rb +0 -0
- data/spec/{grammar → parser}/lvar_spec.rb +0 -0
- data/spec/{grammar → parser}/masgn_spec.rb +0 -0
- data/spec/{grammar → parser}/module_spec.rb +0 -0
- data/spec/{grammar → parser}/nil_spec.rb +0 -0
- data/spec/{grammar → parser}/not_spec.rb +0 -0
- data/spec/{grammar → parser}/nth_ref_spec.rb +0 -0
- data/spec/{grammar → parser}/op_asgn1_spec.rb +0 -0
- data/spec/{grammar → parser}/op_asgn2_spec.rb +0 -0
- data/spec/{grammar → parser}/or_spec.rb +0 -0
- data/spec/{grammar → parser}/parser_spec.rb +0 -0
- data/spec/{grammar → parser}/return_spec.rb +0 -0
- data/spec/{grammar → parser}/sclass_spec.rb +0 -0
- data/spec/{grammar → parser}/self_spec.rb +0 -0
- data/spec/{grammar → parser}/str_spec.rb +0 -0
- data/spec/{grammar → parser}/string_spec.rb +0 -0
- data/spec/{grammar → parser}/strscan/check_spec.rb +0 -0
- data/spec/{grammar → parser}/strscan/scan_spec.rb +0 -0
- data/spec/{grammar → parser}/super_spec.rb +0 -0
- data/spec/{grammar → parser}/true_spec.rb +0 -0
- data/spec/{grammar → parser}/undef_spec.rb +0 -0
- data/spec/{grammar → parser}/unless_spec.rb +0 -0
- data/spec/{grammar → parser}/while_spec.rb +0 -0
- data/spec/{grammar → parser}/xstr_spec.rb +0 -0
- data/spec/{grammar → parser}/yield_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/allocate_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/append_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/array_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/assoc_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/at_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/choice_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/clear_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/clone_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/collect_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/combination_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/compact_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/comparison_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/concat_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/constructor_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/count_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/delete_at_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/delete_if_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/delete_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/drop_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/drop_while_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/dup_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/each_index_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/each_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/empty_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/eql_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/fetch_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/find_index_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/first_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/fixtures/classes.rb +0 -0
- data/spec/{core → rubyspec/core}/array/flatten_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/frozen_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/include_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/index_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/insert_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/inspect_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/intersection_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/join_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/keep_if_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/last_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/length_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/map_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/minus_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/multiply_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/new_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/ntimes_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/plus_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/pop_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/push_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/rassoc_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/reject_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/replace_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/reverse_each_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/reverse_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/rindex_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/select_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shared/collect.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shared/enumeratorize.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shared/eql.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shared/index.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shared/inspect.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shared/join.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shared/keep_if.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shared/length.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shared/replace.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shared/slice.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shift_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/shuffle_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/size_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/slice_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/sort_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/take_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/take_while_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/to_a_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/to_ary_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/try_convert_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/uniq_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/unshift_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/array/zip_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/class/bridge_class_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/class/extend_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/class/fixtures/classes.rb +0 -0
- data/spec/{core → rubyspec/core}/class/instance_methods_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/class/last_value_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/class/new_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/all_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/any_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/collect_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/count_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/detect_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/drop_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/drop_while_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/each_slice_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/each_with_index_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/each_with_object_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/entries_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/find_all_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/find_index_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/find_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/first_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/fixtures/classes.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/grep_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/group_by_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/select_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/take_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerable/to_a_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerator/each_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerator/new_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerator/next_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/enumerator/rewind_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/false/and_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/false/inspect_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/false/or_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/false/to_s_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/false/xor_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/allocate_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/assoc_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/clear_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/clone_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/constructor_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/default_proc_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/default_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/delete_if_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/delete_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/dup_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/each_key_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/each_pair_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/each_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/each_value_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/element_reference_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/element_set_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/empty_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/fetch_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/flatten_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/has_key_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/has_value_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/include_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/index_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/indexes_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/indices_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/invert_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/keep_if_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/key_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/keys_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/length_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/member_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/merge_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/new_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/rassoc_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/reject_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/replace_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/select_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/shift_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/size_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/to_a_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/to_json_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/to_native_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/update_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/value_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/values_at_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/hash/values_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/json/parse_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/Array_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/block_given.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/class_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/define_singleton_method_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/eql_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/equal_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/equal_value_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/extend_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/format_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/instance_eval_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/instance_variable_get_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/instance_variable_set_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/loop_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/match_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/method_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/methods_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/nil_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/p_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/printf_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/proc_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/rand_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/respond_to_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/send_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/sprintf_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/tap_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/to_json_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/kernel/to_s_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/matchdata/to_a_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/module/alias_method_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/module/ancestors_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/module/append_features_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/module/const_get_spec.rb +0 -0
- data/spec/rubyspec/core/module/const_missing_spec.rb +18 -0
- data/spec/{core → rubyspec/core}/module/const_set_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/module/fixtures/classes.rb +0 -0
- data/spec/{core → rubyspec/core}/module/method_defined_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/module/module_function_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/module/undef_method_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/nil/and_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/nil/dup_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/nil/inspect_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/nil/nil_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/nil/or_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/nil/to_a_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/nil/to_f_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/nil/to_h_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/nil/to_i_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/nil/to_s_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/nil/xor_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/abs_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/bit_and_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/bit_or_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/bit_xor_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/ceil_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/chr_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/comparison_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/complement_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/divide_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/downto_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/eql_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/equal_value_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/even_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/exponent_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/floor_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/gt_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/gte_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/integer_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/left_shift_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/lt_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/lte_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/magnitude_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/minus_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/modulo_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/multiply_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/next_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/odd_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/ord_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/plus_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/pred_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/right_shift_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/succ_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/times_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/to_f_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/to_i_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/to_json_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/to_s_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/uminus_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/upto_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/numeric/zero_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/proc/call_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/proc/element_reference_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/proc/proc_tricks_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/range/begin_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/range/case_compare_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/range/end_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/regexp/match_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/runtime/call_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/runtime/class_hierarchy_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/runtime/def_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/runtime/defined_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/runtime/super_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/capitalize_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/casecmp_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/chomp_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/chop_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/chr_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/comparison_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/demodulize_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/downcase_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/element_reference_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/empty_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/end_with_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/fixtures/classes.rb +0 -0
- data/spec/{core → rubyspec/core}/string/format_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/gsub_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/include_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/intern_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/length_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/lstrip_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/match_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/next_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/ord_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/partition_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/reverse_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/rstrip_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/size_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/slice_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/split_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/start_with_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/strip_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/sub_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/succ_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/sum_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/swapcase_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/to_a_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/to_f_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/to_i_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/to_json_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/to_s_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/to_str_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/to_sym_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/underscore_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/string/upcase_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/symbol/to_proc_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/time/at_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/time/day_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/time/friday_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/time/hour_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/time/min_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/time/monday_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/time/month_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/time/now_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/time/saturday_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/true/and_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/true/inspect_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/true/or_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/true/to_s_spec.rb +0 -0
- data/spec/{core → rubyspec/core}/true/xor_spec.rb +0 -0
- data/spec/rubyspec/filters/bugs/alias.rb +6 -0
- data/spec/{filters → rubyspec/filters/bugs}/ancestors.rb +0 -0
- data/spec/rubyspec/filters/bugs/array.rb +5 -0
- data/spec/{filters → rubyspec/filters/bugs}/array_delete.rb +0 -0
- data/spec/{filters → rubyspec/filters/bugs}/array_fetch.rb +0 -0
- data/spec/{filters → rubyspec/filters/bugs}/array_first.rb +0 -0
- data/spec/{filters → rubyspec/filters/bugs}/array_flatten.rb +0 -0
- data/spec/{filters → rubyspec/filters/bugs}/array_intersection.rb +0 -0
- data/spec/{filters → rubyspec/filters/bugs}/array_join.rb +0 -0
- data/spec/{filters → rubyspec/filters/bugs}/block_args.rb +0 -0
- data/spec/rubyspec/filters/bugs/break.rb +10 -0
- data/spec/rubyspec/filters/bugs/case.rb +8 -0
- data/spec/{filters → rubyspec/filters/bugs}/coerce_integer.rb +0 -0
- data/spec/rubyspec/filters/bugs/kernel/instance_variables.rb +3 -0
- data/spec/rubyspec/filters/bugs/language/class.rb +11 -0
- data/spec/rubyspec/filters/bugs/language/class_variables.rb +12 -0
- data/spec/rubyspec/filters/bugs/module/class_variables.rb +6 -0
- data/spec/rubyspec/filters/bugs/public_methods.rb +3 -0
- data/spec/{filters → rubyspec/filters/mspec}/mocks.rb +0 -0
- data/spec/rubyspec/filters/mspec/ruby_exe.rb +5 -0
- data/spec/{filters → rubyspec/filters/mspec}/should_receive.rb +1 -0
- data/spec/rubyspec/filters/parser/block_args.rb +51 -0
- data/spec/{filters → rubyspec/filters/unsupported}/array_subclasses.rb +0 -0
- data/spec/{filters → rubyspec/filters/unsupported}/frozen.rb +0 -0
- data/spec/{filters → rubyspec/filters/unsupported}/tainted.rb +0 -0
- data/spec/{fixtures → rubyspec/fixtures}/class.rb +0 -0
- data/spec/{fixtures → rubyspec/fixtures}/class_variables.rb +0 -0
- data/spec/rubyspec/fixtures/constants.rb +20 -0
- data/spec/{language → rubyspec/language}/alias_spec.rb +7 -7
- data/spec/{language → rubyspec/language}/and_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/array_spec.rb +3 -3
- data/spec/{language → rubyspec/language}/block_spec.rb +59 -59
- data/spec/{language → rubyspec/language}/break_spec.rb +15 -19
- data/spec/{language → rubyspec/language}/case_spec.rb +6 -6
- data/spec/{language → rubyspec/language}/class_spec.rb +16 -18
- data/spec/{language → rubyspec/language}/class_variable_spec.rb +10 -10
- data/spec/{language → rubyspec/language}/def_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/defined_spec.rb +2 -2
- data/spec/{language → rubyspec/language}/ensure_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/execution_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/array.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/block.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/break.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/ensure.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/literal_lambda.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/metaclass.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/module.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/next.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/return.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/send.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/send_1.9.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/super.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/variables.rb +0 -0
- data/spec/{language → rubyspec/language}/fixtures/yield.rb +0 -0
- data/spec/{language → rubyspec/language}/for_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/hash_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/if_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/literal_lambda_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/loop_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/metaclass_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/module_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/next_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/not_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/numbers_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/or_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/order_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/precedence_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/predefined_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/proc_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/redo_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/regexp_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/rescue_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/retry_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/return_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/send_spec.rb +0 -1
- data/spec/{language → rubyspec/language}/singleton_class_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/string_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/super_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/symbol_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/undef_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/unless_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/until_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/variables_spec.rb +3 -3
- data/spec/{language → rubyspec/language}/versions/array_1.9.rb +0 -0
- data/spec/{language → rubyspec/language}/versions/case_1.9.rb +0 -0
- data/spec/{language → rubyspec/language}/versions/hash_1.9.rb +0 -0
- data/spec/{language → rubyspec/language}/versions/literal_lambda_1.9.rb +0 -0
- data/spec/{language → rubyspec/language}/versions/not_1.9.rb +0 -0
- data/spec/{language → rubyspec/language}/versions/send_1.9.rb +0 -0
- data/spec/{language → rubyspec/language}/versions/symbol_1.9.rb +0 -0
- data/spec/{language → rubyspec/language}/versions/variables_1.9.rb +0 -0
- data/spec/{language → rubyspec/language}/while_spec.rb +0 -0
- data/spec/{language → rubyspec/language}/yield_spec.rb +0 -0
- data/spec/{library → rubyspec/library}/date/new_spec.rb +0 -0
- data/spec/{library → rubyspec/library}/date/to_s_spec.rb +0 -0
- data/spec/{library → rubyspec/library}/date/today_spec.rb +0 -0
- data/spec/rubyspec/library/observer/add_observer_spec.rb +31 -0
- data/spec/rubyspec/library/observer/count_observers_spec.rb +33 -0
- data/spec/rubyspec/library/observer/delete_observer_spec.rb +19 -0
- data/spec/rubyspec/library/observer/delete_observers_spec.rb +19 -0
- data/spec/rubyspec/library/observer/fixtures/classes.rb +25 -0
- data/spec/rubyspec/library/observer/notify_observers_spec.rb +31 -0
- data/spec/rubyspec/spec_helper.rb +59 -0
- data/spec/simple_erb_template.opalerb +1 -0
- data/spec/spec_helper.rb +0 -59
- data/spec/templates/foo/bar.opalerb +1 -0
- data/spec/templates/prefixed.opalerb +1 -0
- metadata +1028 -961
- data/opal/opal/browser_loader.js +0 -57
- data/spec/core_ext/native/fixtures/classes.rb +0 -5
- data/spec/core_ext/native/initialize_spec.rb +0 -8
- data/spec/core_ext/native/method_missing_spec.rb +0 -8
- data/spec/date.rb +0 -0
- data/spec/fixtures/constants.rb +0 -0
- data/spec/ospec/filter.rb +0 -32
- data/spec/ospec/phantom.rb +0 -97
data/lib/opal/server.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module Opal
|
4
|
+
class Server
|
5
|
+
|
6
|
+
attr_accessor :debug, :index_path, :main, :public_dir, :sprockets
|
7
|
+
|
8
|
+
def initialize(debug = true)
|
9
|
+
@sprockets = ::Sprockets::Environment.new
|
10
|
+
Opal.paths.each { |p| @sprockets.append_path p }
|
11
|
+
|
12
|
+
@public_dir = '.'
|
13
|
+
@debug = debug
|
14
|
+
|
15
|
+
yield self if block_given?
|
16
|
+
create_app
|
17
|
+
end
|
18
|
+
|
19
|
+
def append_path(path)
|
20
|
+
@sprockets.append_path path
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_app
|
24
|
+
server, sprockets = self, @sprockets
|
25
|
+
|
26
|
+
@app = Rack::Builder.app do
|
27
|
+
map('/assets') { run sprockets }
|
28
|
+
use Index, server
|
29
|
+
run Rack::Directory.new(server.public_dir)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(env)
|
34
|
+
@app.call env
|
35
|
+
end
|
36
|
+
|
37
|
+
class Index
|
38
|
+
|
39
|
+
def initialize(app, server)
|
40
|
+
@app = app
|
41
|
+
@server = server
|
42
|
+
@index_path = server.index_path
|
43
|
+
end
|
44
|
+
|
45
|
+
def call(env)
|
46
|
+
if %w[/ /index.html].include? env['PATH_INFO']
|
47
|
+
[200, { 'Content-Type' => 'text/html' }, [html]]
|
48
|
+
else
|
49
|
+
@app.call env
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def html
|
54
|
+
source = if @index_path
|
55
|
+
raise "index does not exist: #{@index_path}" unless File.exist?(@index_path)
|
56
|
+
File.read @index_path
|
57
|
+
else
|
58
|
+
SOURCE
|
59
|
+
end
|
60
|
+
|
61
|
+
::ERB.new(source).result binding
|
62
|
+
end
|
63
|
+
|
64
|
+
def javascript_include_tag(source)
|
65
|
+
if @server.debug
|
66
|
+
assets = @server.sprockets[source].to_a
|
67
|
+
|
68
|
+
raise "Cannot find asset: #{source}" if assets.empty?
|
69
|
+
|
70
|
+
scripts = assets.map do |a|
|
71
|
+
%Q{<script src="/assets/#{ a.logical_path }?body=1"></script>}
|
72
|
+
end
|
73
|
+
|
74
|
+
scripts.join "\n"
|
75
|
+
else
|
76
|
+
"<script src=\"/assets/#{source}.js\"></script>"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
SOURCE = <<-HTML
|
81
|
+
<!DOCTYPE html>
|
82
|
+
<html>
|
83
|
+
<head>
|
84
|
+
<title>Opal Server</title>
|
85
|
+
</head>
|
86
|
+
<body>
|
87
|
+
<%= javascript_include_tag @server.main %>
|
88
|
+
</body>
|
89
|
+
</html>
|
90
|
+
HTML
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/opal/version.rb
CHANGED
data/opal.gemspec
CHANGED
File without changes
|
data/opal/erb.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Provides Template module for registering erb templates
|
2
|
+
require 'opal-template'
|
3
|
+
|
4
|
+
class ERB
|
5
|
+
def initialize(name, &body)
|
6
|
+
@body = body
|
7
|
+
@name = name
|
8
|
+
Template[name] = self
|
9
|
+
end
|
10
|
+
|
11
|
+
def inspect
|
12
|
+
"#<ERB: name=#{@name.inspect}>"
|
13
|
+
end
|
14
|
+
|
15
|
+
def render(ctx = self)
|
16
|
+
ctx.instance_eval(&@body)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
data/{spec → opal}/fileutils.rb
RENAMED
File without changes
|
data/{spec → opal}/iconv.rb
RENAMED
File without changes
|
data/opal/observer.rb
ADDED
@@ -0,0 +1,202 @@
|
|
1
|
+
#
|
2
|
+
# Implementation of the _Observer_ object-oriented design pattern. The
|
3
|
+
# following documentation is copied, with modifications, from "Programming
|
4
|
+
# Ruby", by Hunt and Thomas; http://www.ruby-doc.org/docs/ProgrammingRuby/html/lib_patterns.html.
|
5
|
+
#
|
6
|
+
# See Observable for more info.
|
7
|
+
|
8
|
+
# The Observer pattern (also known as publish/subscribe) provides a simple
|
9
|
+
# mechanism for one object to inform a set of interested third-party objects
|
10
|
+
# when its state changes.
|
11
|
+
#
|
12
|
+
# == Mechanism
|
13
|
+
#
|
14
|
+
# The notifying class mixes in the +Observable+
|
15
|
+
# module, which provides the methods for managing the associated observer
|
16
|
+
# objects.
|
17
|
+
#
|
18
|
+
# The observers must implement a method called +update+ to receive
|
19
|
+
# notifications.
|
20
|
+
#
|
21
|
+
# The observable object must:
|
22
|
+
# * assert that it has +#changed+
|
23
|
+
# * call +#notify_observers+
|
24
|
+
#
|
25
|
+
# === Example
|
26
|
+
#
|
27
|
+
# The following example demonstrates this nicely. A +Ticker+, when run,
|
28
|
+
# continually receives the stock +Price+ for its <tt>@symbol</tt>. A +Warner+
|
29
|
+
# is a general observer of the price, and two warners are demonstrated, a
|
30
|
+
# +WarnLow+ and a +WarnHigh+, which print a warning if the price is below or
|
31
|
+
# above their set limits, respectively.
|
32
|
+
#
|
33
|
+
# The +update+ callback allows the warners to run without being explicitly
|
34
|
+
# called. The system is set up with the +Ticker+ and several observers, and the
|
35
|
+
# observers do their duty without the top-level code having to interfere.
|
36
|
+
#
|
37
|
+
# Note that the contract between publisher and subscriber (observable and
|
38
|
+
# observer) is not declared or enforced. The +Ticker+ publishes a time and a
|
39
|
+
# price, and the warners receive that. But if you don't ensure that your
|
40
|
+
# contracts are correct, nothing else can warn you.
|
41
|
+
#
|
42
|
+
# require "observer"
|
43
|
+
#
|
44
|
+
# class Ticker ### Periodically fetch a stock price.
|
45
|
+
# include Observable
|
46
|
+
#
|
47
|
+
# def initialize(symbol)
|
48
|
+
# @symbol = symbol
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# def run
|
52
|
+
# lastPrice = nil
|
53
|
+
# loop do
|
54
|
+
# price = Price.fetch(@symbol)
|
55
|
+
# print "Current price: #{price}\n"
|
56
|
+
# if price != lastPrice
|
57
|
+
# changed # notify observers
|
58
|
+
# lastPrice = price
|
59
|
+
# notify_observers(Time.now, price)
|
60
|
+
# end
|
61
|
+
# sleep 1
|
62
|
+
# end
|
63
|
+
# end
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
# class Price ### A mock class to fetch a stock price (60 - 140).
|
67
|
+
# def Price.fetch(symbol)
|
68
|
+
# 60 + rand(80)
|
69
|
+
# end
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
# class Warner ### An abstract observer of Ticker objects.
|
73
|
+
# def initialize(ticker, limit)
|
74
|
+
# @limit = limit
|
75
|
+
# ticker.add_observer(self)
|
76
|
+
# end
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
# class WarnLow < Warner
|
80
|
+
# def update(time, price) # callback for observer
|
81
|
+
# if price < @limit
|
82
|
+
# print "--- #{time.to_s}: Price below #@limit: #{price}\n"
|
83
|
+
# end
|
84
|
+
# end
|
85
|
+
# end
|
86
|
+
#
|
87
|
+
# class WarnHigh < Warner
|
88
|
+
# def update(time, price) # callback for observer
|
89
|
+
# if price > @limit
|
90
|
+
# print "+++ #{time.to_s}: Price above #@limit: #{price}\n"
|
91
|
+
# end
|
92
|
+
# end
|
93
|
+
# end
|
94
|
+
#
|
95
|
+
# ticker = Ticker.new("MSFT")
|
96
|
+
# WarnLow.new(ticker, 80)
|
97
|
+
# WarnHigh.new(ticker, 120)
|
98
|
+
# ticker.run
|
99
|
+
#
|
100
|
+
# Produces:
|
101
|
+
#
|
102
|
+
# Current price: 83
|
103
|
+
# Current price: 75
|
104
|
+
# --- Sun Jun 09 00:10:25 CDT 2002: Price below 80: 75
|
105
|
+
# Current price: 90
|
106
|
+
# Current price: 134
|
107
|
+
# +++ Sun Jun 09 00:10:25 CDT 2002: Price above 120: 134
|
108
|
+
# Current price: 134
|
109
|
+
# Current price: 112
|
110
|
+
# Current price: 79
|
111
|
+
# --- Sun Jun 09 00:10:25 CDT 2002: Price below 80: 79
|
112
|
+
module Observable
|
113
|
+
|
114
|
+
#
|
115
|
+
# Add +observer+ as an observer on this object. so that it will receive
|
116
|
+
# notifications.
|
117
|
+
#
|
118
|
+
# +observer+:: the object that will be notified of changes.
|
119
|
+
# +func+:: Symbol naming the method that will be called when this Observable
|
120
|
+
# has changes.
|
121
|
+
#
|
122
|
+
# This method must return true for +observer.respond_to?+ and will
|
123
|
+
# receive <tt>*arg</tt> when #notify_observers is called, where
|
124
|
+
# <tt>*arg</tt> is the value passed to #notify_observers by this
|
125
|
+
# Observable
|
126
|
+
def add_observer(observer, func=:update)
|
127
|
+
@observer_peers = {} unless defined? @observer_peers
|
128
|
+
unless observer.respond_to? func
|
129
|
+
raise NoMethodError, "observer does not respond to `#{func.to_s}'"
|
130
|
+
end
|
131
|
+
@observer_peers[observer] = func
|
132
|
+
end
|
133
|
+
|
134
|
+
#
|
135
|
+
# Remove +observer+ as an observer on this object so that it will no longer
|
136
|
+
# receive notifications.
|
137
|
+
#
|
138
|
+
# +observer+:: An observer of this Observable
|
139
|
+
def delete_observer(observer)
|
140
|
+
@observer_peers.delete observer if defined? @observer_peers
|
141
|
+
end
|
142
|
+
|
143
|
+
#
|
144
|
+
# Remove all observers associated with this object.
|
145
|
+
#
|
146
|
+
def delete_observers
|
147
|
+
@observer_peers.clear if defined? @observer_peers
|
148
|
+
end
|
149
|
+
|
150
|
+
#
|
151
|
+
# Return the number of observers associated with this object.
|
152
|
+
#
|
153
|
+
def count_observers
|
154
|
+
if defined? @observer_peers
|
155
|
+
@observer_peers.size
|
156
|
+
else
|
157
|
+
0
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
#
|
162
|
+
# Set the changed state of this object. Notifications will be sent only if
|
163
|
+
# the changed +state+ is +true+.
|
164
|
+
#
|
165
|
+
# +state+:: Boolean indicating the changed state of this Observable.
|
166
|
+
#
|
167
|
+
def changed(state=true)
|
168
|
+
@observer_state = state
|
169
|
+
end
|
170
|
+
|
171
|
+
#
|
172
|
+
# Returns true if this object's state has been changed since the last
|
173
|
+
# #notify_observers call.
|
174
|
+
#
|
175
|
+
def changed?
|
176
|
+
if defined? @observer_state and @observer_state
|
177
|
+
true
|
178
|
+
else
|
179
|
+
false
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
#
|
184
|
+
# Notify observers of a change in state *if* this object's changed state is
|
185
|
+
# +true+.
|
186
|
+
#
|
187
|
+
# This will invoke the method named in #add_observer, passing <tt>*arg</tt>.
|
188
|
+
# The changed state is then set to +false+.
|
189
|
+
#
|
190
|
+
# <tt>*arg</tt>:: Any arguments to pass to the observers.
|
191
|
+
def notify_observers(*arg)
|
192
|
+
if defined? @observer_state and @observer_state
|
193
|
+
if defined? @observer_peers
|
194
|
+
@observer_peers.each do |k, v|
|
195
|
+
k.send v, *arg
|
196
|
+
end
|
197
|
+
end
|
198
|
+
@observer_state = false
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Browser
|
2
|
+
module LocalStorage
|
3
|
+
def self.[](key)
|
4
|
+
%x{
|
5
|
+
var val = localStorage.getItem(key);
|
6
|
+
return val === null ? nil : val;
|
7
|
+
}
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.[]=(key, value)
|
11
|
+
`localStorage.setItem(key, value)`
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.clear
|
15
|
+
`localStorage.clear()`
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.delete(key)
|
20
|
+
%x{
|
21
|
+
var val = localStorage.getItem(key);
|
22
|
+
localStorage.removeItem(key);
|
23
|
+
return val === null ? nil : val;
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class BrowserScriptLoader
|
2
|
+
def initialize
|
3
|
+
@doc = Native.global.document
|
4
|
+
@win = Native.global
|
5
|
+
end
|
6
|
+
|
7
|
+
def run
|
8
|
+
handler = proc { find_scripts }
|
9
|
+
|
10
|
+
if @win.key? :addEventListener
|
11
|
+
@win.addEventListener 'DOMContentLoaded', handler, false
|
12
|
+
else
|
13
|
+
@win.attachEvent 'onload', handler
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def find_scripts
|
18
|
+
ruby_scripts.each do |script|
|
19
|
+
if src = script.src and src != ""
|
20
|
+
puts "Cannot currently load script src: #{src}"
|
21
|
+
else
|
22
|
+
run_ruby script.innerHTML
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def ruby_scripts
|
28
|
+
all = @doc.getElementsByTagName 'script'
|
29
|
+
all.to_a.select { |s| s.type == "text/ruby" }
|
30
|
+
end
|
31
|
+
|
32
|
+
def run_ruby str
|
33
|
+
Native.global.Opal.eval str
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
if Native.global.key? :window and Native.global.key? :document
|
38
|
+
BrowserScriptLoader.new.run
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# A simple event registering/triggering module to mix into classes.
|
2
|
+
# Events are stored in the `@events` ivar.
|
3
|
+
module Eventable
|
4
|
+
|
5
|
+
# Register a handler for the given event name.
|
6
|
+
#
|
7
|
+
# obj.on(:foo) { puts "foo was called" }
|
8
|
+
#
|
9
|
+
# @param [String, Symbol] name event name
|
10
|
+
def on(name, &handler)
|
11
|
+
@events ||= Hash.new { |hash, key| hash[key] = [] }
|
12
|
+
@events[name] << handler
|
13
|
+
end
|
14
|
+
|
15
|
+
# Trigger the given event name and passes all args to each handler
|
16
|
+
# for this event.
|
17
|
+
#
|
18
|
+
# obj.trigger(:foo)
|
19
|
+
# obj.trigger(:foo, 1, 2, 3)
|
20
|
+
#
|
21
|
+
# @param [String, Symbol] name event name to trigger
|
22
|
+
def trigger(name, *args)
|
23
|
+
@events ||= Hash.new { |hash, key| hash[key] = [] }
|
24
|
+
@events[name].each { |handler| handler.call(*args) }
|
25
|
+
end
|
26
|
+
end
|
data/opal/opal-parser.js.erb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
|
-
<% require_asset 'opal/
|
2
|
-
<% require_asset '
|
3
|
-
<% require_asset '
|
1
|
+
<% require_asset 'opal-browser/script_loader' %>
|
2
|
+
<% require_asset 'racc' %>
|
3
|
+
<% require_asset 'strscan' %>
|
4
4
|
|
5
5
|
// We need (some) of the libs from our real ruby parser (not in sprockets load path)
|
6
6
|
<% %w(opal/grammar opal/lexer opal/parser opal/target_scope opal/core_ext opal/lexer_scope opal/grammar_helpers opal/parser opal).each do |f| %>
|
7
7
|
<%= Opal.parse File.read(File.join Opal.core_dir, '..', 'lib', "#{f}.rb") %>
|
8
8
|
<% end %>
|
9
|
+
|
10
|
+
Opal.eval = function(str) {
|
11
|
+
var js = Opal.Opal.Parser.$new().$parse(str);
|
12
|
+
return eval(js);
|
13
|
+
};
|