motion-bundler 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c3b46ddc7bfbf054507b9cc9faa9ccbdf66cc1c7
4
- data.tar.gz: 5d5c20b2234f96d586022c5631472228b9332f02
3
+ metadata.gz: a511acdb21993390c91f8d8663bdd3c73e76a656
4
+ data.tar.gz: f66639236864827139db740e12941518992da621
5
5
  SHA512:
6
- metadata.gz: 0ffa0e8ed9ed71638d5fdbeea0a710b882483efdf7a2d086c99919e2f4c11eca84a2e194b9d27964f8290d2cc26740de6b4ae2a5a6efd983d8ef8ab7dbc50d5b
7
- data.tar.gz: 28901834c38dd26658f5175fe589764cf9bd6de6dea8bcf5ec8b3e275ff5f5a7bfd71b1780b40fc81cbb53df4aef6d636db234750e30132f790f60378c5a6cc3
6
+ metadata.gz: 676d574227184e574f1203e65ad6934cd34d3357af328d46e18a25356f77e6c1baf986784c9467a158bdba22b0dcd324def4b147d19c63b651387ef4ba0b157c
7
+ data.tar.gz: d82d00aa08d67cb13b5913980796fe67800d72b4bf2be3c671dbb414a9548f03021f51efa9a790f227585587ea0e9c9909de8027d84054e8ec2ae30ed59a1feb
data/CHANGELOG.rdoc CHANGED
@@ -1,5 +1,16 @@
1
1
  = MotionBundler CHANGELOG
2
2
 
3
+ == Version 0.1.7 (June 19, 2013)
4
+
5
+ * Added MotionBundler::CLI which outputs files, files dependencies and requires as YAML (usage: `bundle exec motion-bundler trace cgi`)
6
+ * Only resolving paths within $LOAD_PATH and gems paths when explicitly requested (only resolving mocks at default)
7
+ * Being able to pass a "scope path" to Ripper.new which determines whether to immediately "rip" an analyzed Ruby source file
8
+ * Being able to trace files which are already required (thanks Geoff Ereth for issuing)
9
+ * Not rescuing LoadError when hooking into the `require` method
10
+ * Renamed REQUIRED to REQUIRES
11
+ * Corrected merging ripper with tracer files dependencies
12
+ * Introduced app.register in case of correcting missing require statements e.g. in REXML (thanks Jeff Enderwick @jeff7091 for issuing)
13
+
3
14
  == Version 0.1.6 (June 14, 2013)
4
15
 
5
16
  * Removed optional `strict` argument within Require.resolve
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.6
1
+ 0.1.7
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "motion-bundler/cli"
5
+
6
+ begin
7
+ MotionBundler::CLI.start
8
+ rescue MotionBundler::CLI::Error => e
9
+ puts "\e[0;#{31};49m#{e.message}\e[0m"
10
+ end
@@ -18,15 +18,15 @@ module MotionBundler
18
18
  Motion::Project::App.setup do |app|
19
19
  touch_motion_bundler
20
20
 
21
- files, files_dependencies, required = app.files, {}, []
22
- ripper_require files, files_dependencies, required
23
- tracer_require files, files_dependencies, required, &block
21
+ files, files_dependencies, requires = app.files, {}, []
22
+ ripper_require files, files_dependencies, requires
23
+ tracer_require files, files_dependencies, requires, &block
24
24
 
25
25
  normalize! files
26
26
  normalize! files_dependencies
27
- required.sort!.uniq!
27
+ requires.sort!.uniq!
28
28
 
29
- write_motion_bundler files, files_dependencies, required
29
+ write_motion_bundler files, files_dependencies, requires
30
30
 
31
31
  app.files = files
32
32
  app.files_dependencies files_dependencies
@@ -59,54 +59,54 @@ private
59
59
  File.open(MOTION_BUNDLER_FILE, "w") {}
60
60
  end
61
61
 
62
- def ripper_require(files, files_dependencies, required)
63
- ripper = Require::Ripper.new *Dir["app/**/*.rb"].collect{|x| "./#{x}"}
62
+ def ripper_require(files, files_dependencies, requires)
63
+ ripper = Require::Ripper.new Dir["app/**/*.rb"].collect{|x| "./#{x}"}
64
64
 
65
65
  files.replace(
66
66
  ripper.files + files
67
67
  )
68
- files_dependencies.merge!(
69
- ripper.files_dependencies
70
- )
71
- required.concat(
68
+ ripper.files_dependencies.each{|file, paths| (files_dependencies[file] ||= []).concat paths}
69
+ requires.concat(
72
70
  ripper.requires.values.flatten
73
71
  )
74
72
  end
75
73
 
76
- def tracer_require(files, files_dependencies, required)
74
+ def tracer_require(files, files_dependencies, requires)
75
+ config = Config.new
76
+ if block_given?
77
+ yield config
78
+ end
79
+
77
80
  Require.mock_and_trace do
78
81
  require MOTION_BUNDLER_FILE
79
82
  require boot_file
80
83
  Bundler.require :motion
81
- app_requires.delete_if do |file|
82
- require file, "APP"
83
- true
84
- end
85
- if block_given?
86
- config = Config.new
87
- yield config
88
- config.requires.each{|file| require file, "APP"}
89
- end
84
+ app_requires.each{|file| require file, "APP"}
85
+ config.requires.each{|file| require file, "APP"}
90
86
  end
91
87
 
92
88
  files.replace(
93
- Require.files + files - ["APP", "BUNDLER", __FILE__]
89
+ Require.files + config.files + files - ["APP", "BUNDLER", __FILE__]
94
90
  )
95
- files_dependencies.merge!(
96
- Require.files_dependencies.tap do |dependencies|
97
- (dependencies.delete("BUNDLER") || []).each do |file|
98
- (dependencies[file] ||= []).unshift boot_file
99
- end
100
- dependencies.delete("APP")
101
- dependencies.delete(__FILE__)
91
+
92
+ Require.files_dependencies.tap do |dependencies|
93
+ (dependencies.delete("BUNDLER") || []).each do |file|
94
+ (dependencies[file] ||= []).unshift boot_file
102
95
  end
103
- )
104
- required.concat(
105
- Require.requires.values.flatten
96
+ dependencies.delete("APP")
97
+ dependencies.delete(__FILE__)
98
+ end.each do |file, paths|
99
+ (files_dependencies[file] ||= []).concat paths
100
+ end
101
+
102
+ config.files_dependencies.each{|file, paths| (files_dependencies[file] ||= []).concat paths}
103
+
104
+ requires.concat(
105
+ Require.requires.values.flatten + config.requires
106
106
  )
107
107
  end
108
108
 
109
- def write_motion_bundler(files, files_dependencies, required)
109
+ def write_motion_bundler(files, files_dependencies, requires)
110
110
  File.open(MOTION_BUNDLER_FILE, "w") do |file|
111
111
  files_dependencies = files_dependencies.dup.tap do |dependencies|
112
112
  if motion_bundler_dependencies = dependencies.delete(__FILE__)
@@ -117,7 +117,7 @@ private
117
117
  module MotionBundler
118
118
  FILES = #{pretty_inspect files, 2}
119
119
  FILES_DEPENDENCIES = #{pretty_inspect files_dependencies, 2}
120
- REQUIRED = #{pretty_inspect required, 2}
120
+ REQUIRES = #{pretty_inspect requires, 2}
121
121
  end
122
122
  RUBY_CODE
123
123
  end
@@ -0,0 +1,31 @@
1
+ require "yaml"
2
+ require "thor"
3
+ require "motion-bundler"
4
+
5
+ $CLI = true
6
+
7
+ module MotionBundler
8
+ class CLI < Thor
9
+
10
+ default_task :trace
11
+
12
+ desc "trace [FILE]", "Trace files and their mutual dependencies when requiring [FILE]"
13
+ def trace(file)
14
+ Require.mock_and_trace do
15
+ require file, "APP"
16
+ end
17
+ puts YAML.dump({
18
+ "FILES" => Require.files,
19
+ "FILES_DEPENDENCIES" => Require.files_dependencies,
20
+ "REQUIRES" => Require.requires
21
+ })
22
+ end
23
+
24
+ private
25
+
26
+ def method_missing(method, *args)
27
+ raise Error, "Unrecognized command \"#{method}\". Please consult `motion-bundler help`."
28
+ end
29
+
30
+ end
31
+ end
@@ -2,10 +2,22 @@ module MotionBundler
2
2
  class Config
3
3
  def initialize
4
4
  @requires = []
5
+ @files_dependencies = {}
5
6
  end
6
7
  def require(name)
7
8
  @requires << name
8
9
  end
10
+ def register(files_dependencies)
11
+ files_dependencies.each do |file, paths|
12
+ (@files_dependencies[Require.resolve(file, false)] ||= []).concat paths.collect{|file| Require.resolve(file, false)}
13
+ end
14
+ end
15
+ def files
16
+ (@files_dependencies.keys + @files_dependencies.values).flatten.uniq
17
+ end
18
+ def files_dependencies
19
+ @files_dependencies.dup
20
+ end
9
21
  def requires
10
22
  @requires.dup
11
23
  end
@@ -2,10 +2,10 @@ module MotionBundler
2
2
  module Require
3
3
  module Resolve
4
4
 
5
- def resolve(path)
5
+ def resolve(path, only_mocks = true)
6
6
  base_path = path.gsub(/\.rb$/, "")
7
7
 
8
- load_paths.each do |load_path|
8
+ load_paths(only_mocks).each do |load_path|
9
9
  if (file = Dir["#{load_path}/#{base_path}.rb"].first)
10
10
  return file
11
11
  end
@@ -16,8 +16,10 @@ module MotionBundler
16
16
 
17
17
  private
18
18
 
19
- def load_paths
20
- Mocker.dirs + Mocker.dirs.collect_concat{|x| Dir["#{x}/*"]} + $LOAD_PATH + gem_paths
19
+ def load_paths(only_mocks)
20
+ (Mocker.dirs + Mocker.dirs.collect_concat{|x| Dir["#{x}/*"]}).tap do |load_paths|
21
+ load_paths.concat($LOAD_PATH + gem_paths) unless only_mocks
22
+ end
21
23
  end
22
24
 
23
25
  class GemPath
@@ -5,8 +5,9 @@ module MotionBundler
5
5
  module Require
6
6
  class Ripper
7
7
 
8
- def initialize(*sources)
8
+ def initialize(sources, scope = MotionBundler::PROJECT_PATH)
9
9
  @sources = sources
10
+ @scope = scope
10
11
  @files = Set.new
11
12
  @files_dependencies = {}
12
13
  @requires = {}
@@ -41,7 +42,7 @@ module MotionBundler
41
42
  if method == :require_relative
42
43
  File.expand_path("../#{file}.rb", source)
43
44
  else
44
- Require.resolve(file)
45
+ Require.resolve(file, false)
45
46
  end
46
47
  end
47
48
 
@@ -52,7 +53,7 @@ module MotionBundler
52
53
  expanded_path = File.expand_path(file)
53
54
 
54
55
  unless @sources.any?{|x| File.expand_path(x) == expanded_path}
55
- if expanded_path.include?(MotionBundler::PROJECT_PATH)
56
+ if expanded_path.match(/^#{@scope}/)
56
57
  added_sources << file
57
58
  else
58
59
  MotionBundler.app_require file
@@ -30,14 +30,7 @@ module MotionBundler
30
30
  def require_with_mb_trace(path, _caller = nil, _path = nil)
31
31
  result = nil
32
32
  MotionBundler::Require::Tracer.log.register(_caller || caller[0], _path || path) do
33
- result = begin
34
- require_without_mb_trace path
35
- rescue LoadError => e
36
- false
37
- end
38
- unless result
39
- {:required => MotionBundler::Require.resolve(path)}
40
- end
33
+ result = require_without_mb_trace path
41
34
  end
42
35
  result
43
36
  end
@@ -1,3 +1,5 @@
1
+ require "yaml"
2
+
1
3
  module MotionBundler
2
4
  module Require
3
5
  module Tracer
@@ -28,7 +30,7 @@ module MotionBundler
28
30
  end
29
31
 
30
32
  def register(file, path)
31
- return unless file.match(/^(.*\.rb):(\d+)/) || file.match(/^([A-Z]+)$/)
33
+ return if !file.match(/^([A-Z]+)$/) && !file.match(/^(.*\.rb):(\d+)/)
32
34
 
33
35
  file = $1.include?("/bundler/") ? "BUNDLER" : $1
34
36
  line = $1.include?("/bundler/") ? nil : $2
@@ -37,25 +39,37 @@ module MotionBundler
37
39
  dependencies = (@files_dependencies[file] ||= [])
38
40
  index = dependencies.size
39
41
 
40
- loaded_feature = begin
41
- if (result = yield).is_a?(Hash)
42
- result[:required]
43
- else
44
- loaded_features.last
45
- end
46
- end
47
-
48
- if loaded_feature
42
+ if yield
43
+ loaded_feature = loaded_features.last
49
44
  @files << file unless @files.include? file
50
45
  @files << loaded_feature
51
46
  dependencies.insert index, loaded_feature
52
47
  else
53
48
  @files_dependencies.delete file if dependencies.empty?
49
+ if file.match(/^([A-Z]+)$/)
50
+ if $CLI
51
+ ripper = Require::Ripper.new [path], "/"
52
+ merge! ripper.files, ripper.files_dependencies, ripper.requires
53
+ else
54
+ tracer = YAML.load `motion-bundler trace #{path}`
55
+ merge! *tracer.values_at("FILES", "FILES_DEPENDENCIES", "REQUIRES")
56
+ end
57
+ end
54
58
  end
55
59
 
56
60
  true
57
61
  end
58
62
 
63
+ def merge!(files, files_dependencies, requires)
64
+ @files.merge files
65
+ files_dependencies.each do |file, dependencies|
66
+ (@files_dependencies[file] ||= []).concat dependencies
67
+ end
68
+ requires.each do |file, paths|
69
+ (@requires[file] ||= []).concat paths
70
+ end
71
+ end
72
+
59
73
  private
60
74
 
61
75
  def loaded_features
@@ -5,7 +5,7 @@ module MotionBundler
5
5
  class Warning
6
6
  def print
7
7
  if require_statement = [:require, :require_relative, :load, :autoload].include?(@method)
8
- return if MotionBundler::REQUIRED.include? @args.last
8
+ return if MotionBundler::REQUIRES.include? @args.last
9
9
  end
10
10
 
11
11
  warning = "Warning Called `#{[@object, @method].compact.join "."}"
@@ -1,7 +1,7 @@
1
1
  module MotionBundler #:nodoc:
2
2
  MAJOR = 0
3
3
  MINOR = 1
4
- TINY = 6
4
+ TINY = 7
5
5
 
6
6
  VERSION = [MAJOR, MINOR, TINY].join(".")
7
7
  end
@@ -18,4 +18,5 @@ Gem::Specification.new do |gem|
18
18
  gem.add_development_dependency "minitest", "4.6.2"
19
19
  gem.add_development_dependency "mocha", "0.13.2"
20
20
  gem.add_development_dependency "rake"
21
+ gem.add_dependency "thor"
21
22
  end
data/sample_app/Rakefile CHANGED
@@ -11,7 +11,14 @@ Motion::Project::App.setup do |app|
11
11
  app.name = "MBundler"
12
12
  end
13
13
 
14
+ require "/Users/paulengel/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/cgi/html.rb"
15
+
14
16
  # Track and specify files and their mutual dependencies within the :motion Bundler group
15
17
  MotionBundler.setup do |app|
16
18
  app.require "base64"
19
+ app.register({
20
+ "rexml/xmldecl" => ["rexml/child"],
21
+ "rexml/doctype" => ["rexml/child"],
22
+ "rexml/parsers/baseparser" => ["set"]
23
+ })
17
24
  end
@@ -1,3 +1,7 @@
1
+ module REXML
2
+ class Child; end
3
+ end
4
+
1
5
  class AppDelegate
2
6
  def application(application, didFinishLaunchingWithOptions:launchOptions)
3
7
  @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
@@ -3,6 +3,9 @@ require "strscan"
3
3
  require "zlib"
4
4
  require "httparty"
5
5
  require "net/pop"
6
+ require "rexml/document"
7
+ require "socket"
8
+
6
9
  require_relative "../../lib/foo"
7
10
 
8
11
  class AppController < UIViewController
@@ -54,6 +57,58 @@ class AppController < UIViewController
54
57
  p enc
55
58
  p Base64.decode64(enc)
56
59
 
60
+ # Testing REXML::Document
61
+
62
+ xml = <<-XML
63
+ <inventory title="OmniCorp Store #45x10^3">
64
+ <section name="health">
65
+ <item upc="123456789" stock="12">
66
+ <name>Invisibility Cream</name>
67
+ <price>14.50</price>
68
+ <description>Makes you invisible</description>
69
+ </item>
70
+ <item upc="445322344" stock="18">
71
+ <name>Levitation Salve</name>
72
+ <price>23.99</price>
73
+ <description>Levitate yourself for up to 3 hours per application</description>
74
+ </item>
75
+ </section>
76
+ <section name="food">
77
+ <item upc="485672034" stock="653">
78
+ <name>Blork and Freen Instameal</name>
79
+ <price>4.95</price>
80
+ <description>A tasty meal in a tablet; just add water</description>
81
+ </item>
82
+ <item upc="132957764" stock="44">
83
+ <name>Grob winglets</name>
84
+ <price>3.56</price>
85
+ <description>Tender winglets of Grob. Just add water</description>
86
+ </item>
87
+ </section>
88
+ </inventory>
89
+ XML
90
+
91
+ doc = REXML::Document.new xml
92
+ root = doc.root
93
+
94
+ doc.elements.each("inventory/section"){|element| puts element.attributes["name"]}
95
+ # => health
96
+ # => food
97
+ doc.elements.each("*/section/item"){|element| puts element.attributes["upc"]}
98
+ # => 123456789
99
+ # => 445322344
100
+ # => 485672034
101
+ # => 132957764
102
+
103
+ puts root.attributes["title"]
104
+ # => OmniCorp Store #45x10^3
105
+ puts root.elements["section/item[@stock='44']"].attributes["upc"]
106
+ # => 132957764
107
+ puts root.elements["section"].attributes["name"]
108
+ # => health (returns the first encountered matching element)
109
+ puts root.elements[1].attributes["name"]
110
+ # => health (returns the FIRST child element)
111
+
57
112
  # Say thanks
58
113
 
59
114
  alert = UIAlertView.new
File without changes
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: /Users/paulengel/Sources/motion-bundler
3
3
  specs:
4
- motion-bundler (0.1.6)
4
+ motion-bundler (0.1.7)
5
+ thor
5
6
 
6
7
  PATH
7
8
  remote: /Users/paulengel/Sources/motion-bundler/test/gems/slot_machine
@@ -11,6 +12,7 @@ PATH
11
12
  GEM
12
13
  remote: https://rubygems.org/
13
14
  specs:
15
+ thor (0.18.1)
14
16
 
15
17
  PLATFORMS
16
18
  ruby
data/test/lib/e.rb ADDED
File without changes
@@ -22,6 +22,12 @@ module Unit
22
22
  assert_equal "#{mocks_dir}/psych_foo-0.1.0/psych/handler.rb", Require.resolve("psych/handler")
23
23
  assert_equal "#{mocks_dir}/psych_foo-0.1.0/psych/handler.rb", Require.resolve("psych/handler")
24
24
  assert_equal "#{MotionBundler::Require::Mocker::GEM_MOCKS}/httparty.rb", Require.resolve("httparty")
25
+
26
+ require "cgi"
27
+ cgi = $LOADED_FEATURES.detect{|x| x.include? "/cgi.rb"}
28
+
29
+ assert_equal "cgi", Require.resolve("cgi")
30
+ assert_equal cgi, Require.resolve("cgi", false)
25
31
  end
26
32
 
27
33
  end
@@ -41,18 +41,18 @@ module Unit
41
41
  lib_baz_builder.expects(:requires).returns []
42
42
  MotionBundler::Require::Ripper::Builder.expects(:new).with("lib/baz.rb").returns lib_baz_builder
43
43
 
44
- MotionBundler::Require.expects(:resolve).with("stringio").returns("/stdlib/stringio.rb")
45
- MotionBundler::Require.expects(:resolve).with("strscan").returns("mocks/strscan.rb")
46
- MotionBundler::Require.expects(:resolve).with("baz").returns("lib/baz.rb")
44
+ MotionBundler::Require.expects(:resolve).with("stringio", false).returns("/stdlib/stringio.rb")
45
+ MotionBundler::Require.expects(:resolve).with("strscan", false).returns("mocks/strscan.rb")
46
+ MotionBundler::Require.expects(:resolve).with("baz", false).returns("lib/baz.rb")
47
47
 
48
48
  MotionBundler.expects(:app_require).with("/stdlib/stringio.rb")
49
49
 
50
- ripper = MotionBundler::Require::Ripper.new(
50
+ ripper = MotionBundler::Require::Ripper.new([
51
51
  "./app/controllers/app_controller.rb",
52
52
  "./app/controllers/foo_controller.rb",
53
53
  "./app/controllers/baz_controller.rb",
54
54
  "./app/controllers/qux.rb"
55
- )
55
+ ])
56
56
 
57
57
  assert_equal([
58
58
  "./app/controllers/app_controller.rb",
@@ -39,7 +39,7 @@ module Unit
39
39
  loaded_features << "file2"
40
40
  end
41
41
  @log.register "/Sources/lib/foo.rb:12", "qux" do
42
- {:required => false}
42
+ false
43
43
  end
44
44
  loaded_features << "file1"
45
45
  end
@@ -79,6 +79,41 @@ module Unit
79
79
  "/Sources/lib/foo.rb:12" => %w(qux)
80
80
  }, @log.requires)
81
81
  end
82
+
83
+ it "should be able to trace files that are already loaded" do
84
+ self.expects(:require_without_mb_trace).with("cgi").returns(false)
85
+ MotionBundler::Require::Tracer.log.expects(:merge!)
86
+ MotionBundler::Require.mock_and_trace do
87
+ require "cgi", "APP"
88
+ end
89
+
90
+ $CLI = true
91
+ self.expects(:require_without_mb_trace).with("cgi").returns(false)
92
+ File.expects(:read).with("cgi").returns("")
93
+ MotionBundler::Require::Tracer.log.expects(:merge!)
94
+ MotionBundler::Require.mock_and_trace do
95
+ require "cgi", "APP"
96
+ end
97
+ $CLI = false
98
+ end
99
+
100
+ it "should be able to merge files, files dependencies and requires" do
101
+ @log.instance_variable_set :@files, Set.new(%w(a b))
102
+ @log.instance_variable_set :@files_dependencies, {"c" => %w(d e)}
103
+ @log.instance_variable_set :@requires, {"f" => %w(g)}
104
+
105
+ @log.merge! %w(h i), {"c" => %w(j), "k" => %w(l m)}, {"f" => %w(n), "o" => %w(p q)}
106
+
107
+ assert_equal(%w(a b h i), @log.files)
108
+ assert_equal({
109
+ "c" => %w(d e j),
110
+ "k" => %w(l m)
111
+ }, @log.files_dependencies)
112
+ assert_equal({
113
+ "f" => %w(g n),
114
+ "o" => %w(p q)
115
+ }, @log.requires)
116
+ end
82
117
  end
83
118
 
84
119
  end
@@ -7,12 +7,12 @@ module Unit
7
7
 
8
8
  describe MotionBundler::Simulator::Console do
9
9
  before do
10
- MotionBundler.send :remove_const, :REQUIRED if defined?(MotionBundler::REQUIRED)
11
- MotionBundler::REQUIRED = ["baz"]
10
+ MotionBundler.send :remove_const, :REQUIRES if defined?(MotionBundler::REQUIRES)
11
+ MotionBundler::REQUIRES = ["baz"]
12
12
  end
13
13
 
14
14
  after do
15
- MotionBundler.send :remove_const, :REQUIRED
15
+ MotionBundler.send :remove_const, :REQUIRES
16
16
  end
17
17
 
18
18
  it "should print warnings as expected" do
@@ -11,8 +11,19 @@ module Unit
11
11
  config.require "foo"
12
12
  config.require "foo/baz"
13
13
  assert_equal %w(foo foo/baz), config.requires
14
-
15
14
  assert config.requires.object_id != config.requires.object_id
15
+
16
+ cgi = MotionBundler::Require.resolve "cgi", false
17
+ html = MotionBundler::Require.resolve "cgi/html", false
18
+
19
+ config.register({"cgi" => ["cgi/html"]})
20
+ assert_equal([cgi, html], config.files)
21
+ assert_equal({cgi => [html]}, config.files_dependencies)
22
+
23
+ cookie = MotionBundler::Require.resolve "cgi/cookie", false
24
+
25
+ config.instance_variable_get(:@files_dependencies)[cgi].expects(:concat).with([cookie])
26
+ config.register({"cgi" => ["cgi/cookie"]})
16
27
  end
17
28
  end
18
29
 
@@ -46,7 +46,7 @@ module Unit
46
46
  "qux"
47
47
  ]
48
48
  }
49
- REQUIRED = [
49
+ REQUIRES = [
50
50
  "fu",
51
51
  "baz"
52
52
  ]
@@ -65,13 +65,17 @@ module Unit
65
65
  end
66
66
 
67
67
  describe "calling `setup`" do
68
+ before do
69
+ MotionBundler.send(:app_requires).clear
70
+ end
71
+
68
72
  it "should require the :motion Bundler group and mock and trace requires" do
69
73
  object = mock "object"
70
74
  object.expects :do_something
71
75
 
72
76
  Bundler.expects(:require).with(:motion)
73
77
  MotionBundler.setup do |app|
74
- app.require "foo"
78
+ app.require lib_file("e")
75
79
  object.do_something
76
80
  end
77
81
 
@@ -122,7 +126,7 @@ module Unit
122
126
  ]
123
127
  })
124
128
 
125
- Motion::Project::App.any_instance.expects(:files=).with(expand_paths [
129
+ Motion::Project::App.any_instance.expects(:files=).with(expand_paths([
126
130
  motion_bundler_file("motion-bundler/simulator/boot.rb"),
127
131
  motion_bundler_file("motion-bundler/simulator/core_ext.rb"),
128
132
  motion_bundler_file("motion-bundler/simulator/motion-bundler.rb"),
@@ -132,7 +136,7 @@ module Unit
132
136
  "ruby/foo.rb",
133
137
  "delegate.rb",
134
138
  "controller.rb"
135
- ])
139
+ ]))
136
140
 
137
141
  Motion::Project::App.any_instance.expects(:files_dependencies).with(expand_paths({
138
142
  motion_bundler_file("motion-bundler/simulator/boot.rb") => [
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motion-bundler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Engel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-13 00:00:00.000000000 Z
11
+ date: 2013-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -52,10 +52,25 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Use Ruby gems and mock require statements within RubyMotion applications
56
70
  email:
57
71
  - paul.engel@holder.nl
58
- executables: []
72
+ executables:
73
+ - motion-bundler
59
74
  extensions: []
60
75
  extra_rdoc_files: []
61
76
  files:
@@ -67,7 +82,9 @@ files:
67
82
  - README.md
68
83
  - Rakefile
69
84
  - VERSION
85
+ - bin/motion-bundler
70
86
  - lib/motion-bundler.rb
87
+ - lib/motion-bundler/cli.rb
71
88
  - lib/motion-bundler/config.rb
72
89
  - lib/motion-bundler/device/boot.rb
73
90
  - lib/motion-bundler/device/core_ext.rb
@@ -103,7 +120,7 @@ files:
103
120
  - sample_app/mocks/httparty.rb
104
121
  - sample_app/mocks/net/protocol.rb
105
122
  - sample_app/mocks/openssl.rb
106
- - sample_app/mocks/socket.rb
123
+ - sample_app/mocks/socket.so.rb
107
124
  - sample_app/mocks/timeout.rb
108
125
  - sample_app/resources/Icon.png
109
126
  - sample_app/resources/Icon.pxm
@@ -146,6 +163,7 @@ files:
146
163
  - test/lib/d/b/a/a.rb
147
164
  - test/lib/d/b/b.rb
148
165
  - test/lib/d/c.rb
166
+ - test/lib/e.rb
149
167
  - test/mocks/net/http.rb
150
168
  - test/mocks/psych_foo-0.1.0/psych/handler.rb
151
169
  - test/mocks/yaml.rb
@@ -227,6 +245,7 @@ test_files:
227
245
  - test/lib/d/b/a/a.rb
228
246
  - test/lib/d/b/b.rb
229
247
  - test/lib/d/c.rb
248
+ - test/lib/e.rb
230
249
  - test/mocks/net/http.rb
231
250
  - test/mocks/psych_foo-0.1.0/psych/handler.rb
232
251
  - test/mocks/yaml.rb