Class: QED::Session

Inherits:
Object
  • Object
show all
Defined in:
lib/qed/session.rb

Overview

Runtime Session

The Session class encapsulates a set of demonstrations and the procedure for looping through them and running each in turn.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(demos, options = {}) ⇒ Session

New demonstration



25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/qed/session.rb', line 25

def initialize(demos, options={})
  require_reporters

  @demos  = [demos].flatten

  @format = :dotprogress
  @trace  = false

  options.each do |k,v|
    __send__("#{k}=", v) if v
  end

  @applique = create_applique
end

Instance Attribute Details

#demosObject (readonly)

Demonstration files.



16
17
18
# File 'lib/qed/session.rb', line 16

def demos
  @demos
end

#formatObject

Output format.



19
20
21
# File 'lib/qed/session.rb', line 19

def format
  @format
end

#traceObject

Trace mode



22
23
24
# File 'lib/qed/session.rb', line 22

def trace
  @trace
end

Instance Method Details

#applique_scriptsObject



118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/qed/session.rb', line 118

def applique_scripts
  locs = []
  demos.each do |demo|
    Dir.ascend(File.dirname(demo)) do |path|
      break if path == Dir.pwd
      dir = File.join(path, 'applique')
      if File.directory?(dir)
        locs << dir
      end
    end
  end
  envs = locs.map{ |loc| Dir[File.join(loc,'**/*.rb')] }
  envs.flatten.compact.uniq
end

#create_appliqueObject

TODO: associate scripts to there applique



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/qed/session.rb', line 98

def create_applique
  applique = Applique.new
  #eval "include QED::DomainLanguage", TOPLEVEL_BINDING
  applique_scripts.each do |file|
    #next if @loadlist.include?(file)
    #case File.extname(file)
    #when '.rb'
      # since scope is just TOPLEVEL now
      #require(file)
      applique.module_eval(File.read(file), file)
      #eval(File.read(file), scope.__binding__, file)  # TODO: for each script!? Nay.
    #else
    #  Script.new(file, scope).run
    #end
    #@loadlist << file
  end
  applique
end

#observersObject



71
72
73
# File 'lib/qed/session.rb', line 71

def observers
  [reporter]
end

#reporterObject

Instance of selected Reporter subclass.



53
54
55
56
57
58
# File 'lib/qed/session.rb', line 53

def reporter
  @reporter ||= (
    name = Reporter.constants.find{ |c| /#{format}/ =~ c.downcase }
    Reporter.const_get(name).new(:trace => trace)
  )
end

#require_reportersObject

TODO: Ultimately use Plugin library.



46
47
48
49
50
# File 'lib/qed/session.rb', line 46

def require_reporters
  Dir[File.dirname(__FILE__) + '/reporter/*'].each do |file|
    require file
  end
end

#runObject

Run session.



76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/qed/session.rb', line 76

def run
  #profile.before_session(self)
  reporter.before_session(self)
  #demos.each do |demo|
  #  script = Script.new(demo, report)
  scripts.each do |script|
    script.run(*observers)
    #pid = fork { script.run(*observers) }
    #Process.detach(pid)
   end
  reporter.after_session(self)
  #profile.after_session(self)
end

#scriptsObject



66
67
68
# File 'lib/qed/session.rb', line 66

def scripts
  @scripts ||= demos.map{ |demo| Script.new(@applique, demo) }
end