limelight 0.0.1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. data/bin/icons/icon.ico +0 -0
  2. data/bin/icons/icon_48.gif +0 -0
  3. data/bin/icons/limelight.icns +0 -0
  4. data/bin/icons/splash.png +0 -0
  5. data/bin/limelight +6 -0
  6. data/bin/ll +10 -0
  7. data/bin/ll.bat +5 -0
  8. data/lib/init.rb +11 -0
  9. data/lib/limelight/build_exception.rb +45 -0
  10. data/lib/limelight/button_group_cache.rb +11 -0
  11. data/lib/limelight/casting_director.rb +72 -0
  12. data/lib/limelight/commands.rb +66 -0
  13. data/lib/limelight/file_chooser.rb +55 -0
  14. data/lib/limelight/file_filter.rb +26 -0
  15. data/lib/limelight/java_util.rb +29 -0
  16. data/lib/limelight/limelight_exception.rb +9 -0
  17. data/lib/limelight/loaders/file_scene_loader.rb +48 -0
  18. data/lib/limelight/menu_bar.rb +49 -0
  19. data/lib/limelight/paint_action.rb +25 -0
  20. data/lib/limelight/pen.rb +53 -0
  21. data/lib/limelight/players/button.rb +29 -0
  22. data/lib/limelight/players/check_box.rb +38 -0
  23. data/lib/limelight/players/combo_box.rb +44 -0
  24. data/lib/limelight/players/radio_button.rb +47 -0
  25. data/lib/limelight/players/text_area.rb +25 -0
  26. data/lib/limelight/players/text_box.rb +25 -0
  27. data/lib/limelight/players.rb +9 -0
  28. data/lib/limelight/producer.rb +141 -0
  29. data/lib/limelight/production.rb +64 -0
  30. data/lib/limelight/production_builder.rb +49 -0
  31. data/lib/limelight/prop.rb +241 -0
  32. data/lib/limelight/prop_builder.rb +60 -0
  33. data/lib/limelight/scene.rb +75 -0
  34. data/lib/limelight/stage.rb +93 -0
  35. data/lib/limelight/stage_builder.rb +62 -0
  36. data/lib/limelight/styles.rb +37 -0
  37. data/lib/limelight/styles_builder.rb +61 -0
  38. data/lib/limelight/theater.rb +42 -0
  39. data/lib/limelight/util.rb +26 -0
  40. data/lib/limelight/version.rb +20 -0
  41. data/lib/limelight.jar +0 -0
  42. data/productions/examples/8thlight.com/about/about.txt +24 -0
  43. data/productions/examples/8thlight.com/about/props.rb +11 -0
  44. data/productions/examples/8thlight.com/about/styles.rb +2 -0
  45. data/productions/examples/8thlight.com/footer.rb +6 -0
  46. data/productions/examples/8thlight.com/home/props.rb +28 -0
  47. data/productions/examples/8thlight.com/home/styles.rb +2 -0
  48. data/productions/examples/8thlight.com/images/anvil.jpg +0 -0
  49. data/productions/examples/8thlight.com/images/bg.jpg +0 -0
  50. data/productions/examples/8thlight.com/images/botticelli.jpg +0 -0
  51. data/productions/examples/8thlight.com/images/button_bg.jpg +0 -0
  52. data/productions/examples/8thlight.com/images/canvas_bg.jpg +0 -0
  53. data/productions/examples/8thlight.com/images/footer_bg.jpg +0 -0
  54. data/productions/examples/8thlight.com/images/header.jpg +0 -0
  55. data/productions/examples/8thlight.com/images/moses.jpg +0 -0
  56. data/productions/examples/8thlight.com/images/statemachine_thumbnail.png +0 -0
  57. data/productions/examples/8thlight.com/images/thumbnail_book.jpg +0 -0
  58. data/productions/examples/8thlight.com/menu.rb +11 -0
  59. data/productions/examples/8thlight.com/services/props.rb +11 -0
  60. data/productions/examples/8thlight.com/services/services.txt +8 -0
  61. data/productions/examples/8thlight.com/services/styles.rb +2 -0
  62. data/productions/examples/8thlight.com/stages.rb +8 -0
  63. data/productions/examples/8thlight.com/styles.rb +205 -0
  64. data/productions/examples/calculator/players/button.rb +24 -0
  65. data/productions/examples/calculator/players/calculator.rb +15 -0
  66. data/productions/examples/calculator/players/calculator_model.rb +13 -0
  67. data/productions/examples/calculator/props.rb +23 -0
  68. data/productions/examples/calculator/styles.rb +38 -0
  69. data/productions/examples/langstons_ant/html_javascript/ant.css +39 -0
  70. data/productions/examples/langstons_ant/html_javascript/ant.html +22 -0
  71. data/productions/examples/langstons_ant/html_javascript/ant.js +23 -0
  72. data/productions/examples/langstons_ant/players/ant.rb +103 -0
  73. data/productions/examples/langstons_ant/players/log.rb +29 -0
  74. data/productions/examples/langstons_ant/players/start_stop_button.rb +37 -0
  75. data/productions/examples/langstons_ant/players/world.rb +61 -0
  76. data/productions/examples/langstons_ant/props.rb +22 -0
  77. data/productions/examples/langstons_ant/styles.rb +105 -0
  78. data/productions/examples/sandbox/click_me/players/chromaton.rb +47 -0
  79. data/productions/examples/sandbox/click_me/props.rb +8 -0
  80. data/productions/examples/sandbox/click_me/styles.rb +12 -0
  81. data/productions/examples/sandbox/floaters/players/floater.rb +92 -0
  82. data/productions/examples/sandbox/floaters/players/surface.rb +17 -0
  83. data/productions/examples/sandbox/floaters/props.rb +10 -0
  84. data/productions/examples/sandbox/floaters/styles.rb +25 -0
  85. data/productions/examples/sandbox/gradients/players/spinner.rb +23 -0
  86. data/productions/examples/sandbox/gradients/players/teaser.rb +26 -0
  87. data/productions/examples/sandbox/gradients/players/wave.rb +26 -0
  88. data/productions/examples/sandbox/gradients/players/waves.rb +26 -0
  89. data/productions/examples/sandbox/gradients/props.rb +13 -0
  90. data/productions/examples/sandbox/gradients/styles.rb +47 -0
  91. data/productions/examples/sandbox/header.rb +15 -0
  92. data/productions/examples/sandbox/homer/players/homer.rb +20 -0
  93. data/productions/examples/sandbox/homer/props.rb +10 -0
  94. data/productions/examples/sandbox/homer/styles.rb +17 -0
  95. data/productions/examples/sandbox/images/arch.jpg +0 -0
  96. data/productions/examples/sandbox/images/beach.jpg +0 -0
  97. data/productions/examples/sandbox/images/homer.jpg +0 -0
  98. data/productions/examples/sandbox/images/limelight_spotlight.jpg +0 -0
  99. data/productions/examples/sandbox/images/marilyn.jpg +0 -0
  100. data/productions/examples/sandbox/inputs/players/button_input.rb +48 -0
  101. data/productions/examples/sandbox/inputs/players/check_box_input.rb +40 -0
  102. data/productions/examples/sandbox/inputs/players/combo_box_input.rb +41 -0
  103. data/productions/examples/sandbox/inputs/players/radio_button_input.rb +43 -0
  104. data/productions/examples/sandbox/inputs/players/text_area_input.rb +36 -0
  105. data/productions/examples/sandbox/inputs/players/text_box_input.rb +36 -0
  106. data/productions/examples/sandbox/inputs/props.rb +40 -0
  107. data/productions/examples/sandbox/inputs/styles.rb +39 -0
  108. data/productions/examples/sandbox/players/sandbox.rb +11 -0
  109. data/productions/examples/sandbox/rounded_corners/players/box.rb +11 -0
  110. data/productions/examples/sandbox/rounded_corners/props.rb +22 -0
  111. data/productions/examples/sandbox/rounded_corners/styles.rb +18 -0
  112. data/productions/examples/sandbox/scrolling/players/cell.rb +16 -0
  113. data/productions/examples/sandbox/scrolling/props.rb +40 -0
  114. data/productions/examples/sandbox/scrolling/styles.rb +25 -0
  115. data/productions/examples/sandbox/sketching/players/sketchpad.rb +46 -0
  116. data/productions/examples/sandbox/sketching/props.rb +25 -0
  117. data/productions/examples/sandbox/sketching/styles.rb +36 -0
  118. data/productions/examples/sandbox/stages.rb +6 -0
  119. data/productions/examples/sandbox/styles.rb +37 -0
  120. data/productions/examples/sandbox/teaser/players/fader.rb +58 -0
  121. data/productions/examples/sandbox/teaser/props.rb +14 -0
  122. data/productions/examples/sandbox/teaser/styles.rb +22 -0
  123. data/productions/examples/tutorials/tutorial_1/players/sample.rb +11 -0
  124. data/productions/examples/tutorials/tutorial_1/props.rb +9 -0
  125. data/productions/examples/tutorials/tutorial_1/styles.rb +27 -0
  126. data/productions/stage_composer/init.rb +10 -0
  127. data/productions/stage_composer/inspector/players/inspector.rb +80 -0
  128. data/productions/stage_composer/inspector/players/prop_row.rb +12 -0
  129. data/productions/stage_composer/inspector/players/prop_tree.rb +33 -0
  130. data/productions/stage_composer/inspector/players/style_table.rb +12 -0
  131. data/productions/stage_composer/inspector/players/style_value.rb +16 -0
  132. data/productions/stage_composer/inspector/props.rb +19 -0
  133. data/productions/stage_composer/inspector/styles.rb +71 -0
  134. data/productions/stage_composer/lib/init.rb +5 -0
  135. data/productions/stage_composer/lib/limelight/composer/controller.rb +51 -0
  136. data/productions/stage_composer/lib/limelight/composer/lethargy.rb +24 -0
  137. data/productions/stage_composer/production.rb +6 -0
  138. data/productions/stage_composer/stages.rb +15 -0
  139. data/productions/startup/props.rb +5 -0
  140. data/spec/casting_director_spec.rb +94 -0
  141. data/spec/commands_spec.rb +33 -0
  142. data/spec/file_chooser_spec.rb +64 -0
  143. data/spec/file_filter_spec.rb +29 -0
  144. data/spec/java_util_spec.rb +53 -0
  145. data/spec/loaders/file_loader_spec.rb +28 -0
  146. data/spec/paint_action_spec.rb +30 -0
  147. data/spec/pen_spec.rb +62 -0
  148. data/spec/players/button_spec.rb +31 -0
  149. data/spec/players/check_box_spec.rb +40 -0
  150. data/spec/players/combo_box_spec.rb +39 -0
  151. data/spec/players/radio_button_spec.rb +75 -0
  152. data/spec/players/text_area_spec.rb +37 -0
  153. data/spec/players/text_box_spec.rb +37 -0
  154. data/spec/producer_spec.rb +157 -0
  155. data/spec/production_builder_spec.rb +48 -0
  156. data/spec/production_spec.rb +75 -0
  157. data/spec/prop_builder_spec.rb +178 -0
  158. data/spec/prop_spec.rb +216 -0
  159. data/spec/scene_spec.rb +34 -0
  160. data/spec/spec_helper.rb +18 -0
  161. data/spec/stage_builder_spec.rb +90 -0
  162. data/spec/stage_spec.rb +57 -0
  163. data/spec/styles_builder_spec.rb +123 -0
  164. data/spec/theater_spec.rb +66 -0
  165. metadata +275 -0
@@ -0,0 +1,75 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ require 'limelight/java_util'
5
+ require 'limelight/prop'
6
+ require 'limelight/button_group_cache'
7
+
8
+ module Limelight
9
+ class Scene < Prop
10
+
11
+ include Java::limelight.ui.Scene
12
+
13
+ attr_reader :button_groups, :styles, :casting_director
14
+ attr_accessor :stage, :loader, :visible, :path, :production
15
+ getters :stage, :loader
16
+ setters :stage
17
+ event :scene_opened
18
+
19
+ def initialize(options={})
20
+ super(options)
21
+ @scene = self
22
+ @button_groups = ButtonGroupCache.new
23
+ illuminate
24
+ end
25
+
26
+ def add_options(options)
27
+ @options = options
28
+ illuminate
29
+ end
30
+
31
+ def illuminate
32
+ @styles = @options.has_key?(:styles) ? @options.delete(:styles) : (@styles || {})
33
+ @casting_director = @options.delete(:casting_director) if @options.has_key?(:casting_director)
34
+ super
35
+ end
36
+
37
+ def has_static_size?
38
+ return is_static?(style.get_width) && is_static?(style.get_height)
39
+ end
40
+
41
+ def menu_bar
42
+ return MenuBar.build(self) do
43
+ menu("File") do
44
+ item("Open", :open_chosen_scene)
45
+ item("Refresh", :reload)
46
+ end
47
+ end
48
+ end
49
+
50
+ def load(path)
51
+ @production.producer.open_scene(path, @stage)
52
+ end
53
+
54
+ private ###############################################
55
+
56
+ def is_static?(value)
57
+ return !(value.to_s.include?("%")) && !(value.to_s == "auto")
58
+ end
59
+
60
+ def open_chosen_scene
61
+ options = { :title => "Open New Limelight Scene", :description => "Limelight Scene", :directory => @directory }
62
+ chosen_file = stage.choose_file(options) { |file| Util.is_limelight_scene?(file) || Util.is_limelight_production?(file) }
63
+ if chosen_file
64
+ @directory = File.dirname(chosen_file)
65
+ producer = Producer.new(chosen_file, @production.theater)
66
+ producer.open
67
+ end
68
+ end
69
+
70
+ def reload
71
+ load(@path)
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,93 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ require 'limelight/java_util'
5
+ require 'limelight/menu_bar'
6
+ require 'limelight/loaders/file_scene_loader'
7
+ require 'limelight/file_chooser'
8
+ require 'limelight/util'
9
+
10
+ module Limelight
11
+
12
+ class Stage
13
+ attr_accessor :default_scene
14
+ attr_reader :frame, :current_scene, :name, :theater
15
+
16
+ include Java::limelight.ui.Stage
17
+
18
+ def public_choose_file
19
+ choose_file
20
+ end
21
+
22
+ def initialize(theater, name="default")
23
+ @theater = theater
24
+ @name = name
25
+ build_frame
26
+ self.title = @name
27
+ end
28
+
29
+ def title
30
+ return @frame.title
31
+ end
32
+
33
+ def title=(value)
34
+ @frame.title = value
35
+ end
36
+
37
+ def size
38
+ return @frame.width, @frame.height
39
+ end
40
+
41
+ def size=(values)
42
+ @frame.set_size(values[0], values[1])
43
+ end
44
+
45
+ def location
46
+ return @frame.location.x, @frame.location.y
47
+ end
48
+
49
+ def location= values
50
+ @frame.set_location(values[0], values[1])
51
+ end
52
+
53
+ def open(scene)
54
+ load_scene(scene)
55
+ @frame.open
56
+ scene.visible = true
57
+ scene.scene_opened(self)
58
+ end
59
+
60
+ def close
61
+ @frame.close
62
+ end
63
+
64
+ def load_scene(scene)
65
+ @frame.setJMenuBar(scene.menu_bar)
66
+ @frame.load(scene.panel)
67
+ scene.stage = self
68
+ scene.panel.set_size(scene.panel.get_preferred_size)
69
+ if(scene.has_static_size?)
70
+ @frame.set_size(scene.panel.get_size)
71
+ end
72
+ @current_scene = scene
73
+ end
74
+
75
+ def choose_file(options={}, &block)
76
+ options[:parent] = @frame
77
+ chooser = FileChooser.new(options, &block)
78
+ return chooser.choose_file
79
+ end
80
+
81
+ private ###############################################
82
+
83
+ def build_frame
84
+ @frame = Java::limelight.ui.Frame.new(self)
85
+ @frame.set_size(800, 800)
86
+ @frame.set_location(200, 25)
87
+ @frame.title = title
88
+ end
89
+
90
+ end
91
+
92
+ end
93
+
@@ -0,0 +1,62 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ require 'limelight/stage'
5
+ require 'limelight/limelight_exception'
6
+
7
+ module Limelight
8
+
9
+ def self.build_stages(theater, &block)
10
+ builder = StagesBuilder.new(theater)
11
+ builder.instance_eval(&block) if block
12
+ return builder.stages
13
+ end
14
+
15
+ class StagesBuilder
16
+
17
+ attr_reader :stages
18
+
19
+ def initialize(theater)
20
+ @theater = theater
21
+ @stages = []
22
+ end
23
+
24
+ def stage(name, &block)
25
+ stage_builder = StageBuilder.new(@theater, name)
26
+ stage_builder.instance_eval(&block) if block
27
+ @stages << stage_builder.stage
28
+ end
29
+
30
+ end
31
+
32
+ class StageBuilder
33
+
34
+ attr_reader :stage
35
+
36
+ def initialize(theater, name)
37
+ if theater[name]
38
+ @stage = theater[name]
39
+ else
40
+ @stage = Stage.new(theater, name)
41
+ theater.add_stage(@stage)
42
+ end
43
+ end
44
+
45
+ def default_scene(scene_name)
46
+ @stage.default_scene = scene_name
47
+ end
48
+
49
+ def method_missing(sym, value)
50
+ setter_sym = "#{sym}=".to_s
51
+ raise StageBuilderException.new(sym) if !@stage.respond_to?(setter_sym)
52
+ @stage.send(setter_sym, value)
53
+ end
54
+ end
55
+
56
+ class StageBuilderException < LimelightException
57
+ def initialize(name)
58
+ super("'#{name}' is not a valid stage property")
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,37 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ require 'yaml'
5
+
6
+ module Limelight
7
+
8
+ class Styles
9
+
10
+ def self.load(content)
11
+ yamalized_content = content.gsub("\t", " ").gsub("#", "pigpen")
12
+ return YAML.load(yamalized_content)
13
+ end
14
+
15
+ def self.load_into_scene(filename, scene)
16
+ content = scene.loader.load(filename)
17
+ style_defs = load(content)
18
+ styles = scene.styles;
19
+
20
+ style_defs.each_pair do |key, value|
21
+ style = create_style(value)
22
+ styles[key] = style
23
+ end
24
+ end
25
+
26
+ def self.create_style(hash)
27
+ style = Java::limelight.ui.FlatStyle.new
28
+ hash.each_pair do |key, value|
29
+ value = value.to_s.gsub("pigpen", "#")
30
+ style.send((key.to_s + "=").to_sym, value)
31
+ end
32
+ return style
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,61 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ module Limelight
5
+
6
+ def self.build_styles(&block)
7
+ builder = StylesBuilder.new
8
+ builder.instance_eval(&block) if block
9
+ return builder.__styles
10
+ end
11
+
12
+ class StylesBuilder
13
+ attr_reader :__styles
14
+
15
+ def initialize
16
+ @__styles = {}
17
+ end
18
+
19
+ def method_missing(sym, &block)
20
+ __add_style(sym.to_s, &block)
21
+ end
22
+
23
+ def __add_style(name, &block)
24
+ builder = StyleBuilder.new(name, self)
25
+ builder.instance_eval(&block) if block
26
+ @__styles[name] = builder.__style
27
+ end
28
+ end
29
+
30
+ class StyleBuilder
31
+ attr_reader :__style
32
+
33
+ def initialize(name, styles_builder)
34
+ @__style = Java::limelight.ui.RichStyle.new
35
+ @__name = name
36
+ @__styles_builder = styles_builder
37
+ end
38
+
39
+ def hover(&block)
40
+ @__styles_builder.__add_style("#{@__name}.hover", &block)
41
+ end
42
+
43
+ def extends(*style_names)
44
+ style_names.each do |style_name|
45
+ extension = @__styles_builder.__styles[style_name.to_s]
46
+ raise StyleBuilderException.new("Can't extend missing style: '#{style_name}'") if extension.nil?
47
+ @__style.add_extension(extension)
48
+ end
49
+ end
50
+
51
+ def method_missing(sym, value)
52
+ setter_sym = "#{sym}=".to_s
53
+ raise StyleBuilderException.new("'#{sym}' is not a valid style") if !@__style.respond_to?(setter_sym)
54
+ @__style.send(setter_sym, value.to_s)
55
+ end
56
+ end
57
+
58
+ class StyleBuilderException < Exception
59
+ end
60
+
61
+ end
@@ -0,0 +1,42 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ require 'limelight/limelight_exception'
5
+
6
+ module Limelight
7
+
8
+ class Theater
9
+
10
+ include Java::limelight.ui.Theater
11
+
12
+ attr_reader :active_stage
13
+
14
+ def initialize
15
+ @stages = {}
16
+ end
17
+
18
+ def stages
19
+ return @stages.values
20
+ end
21
+
22
+ def [](stage_name)
23
+ return @stages[stage_name]
24
+ end
25
+
26
+ def add_stage(stage)
27
+ raise LimelightException.new("Duplicate stage name: '#{stage.name}'") if @stages[stage.name]
28
+ @stages[stage.name] = stage
29
+ end
30
+
31
+ def stage_activated(stage)
32
+ @active_stage = stage
33
+ end
34
+
35
+ def default_stage
36
+ add_stage(Stage.new(self, "Limelight")) if self["Limelight"].nil?
37
+ return self["Limelight"]
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,26 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ module Limelight
5
+
6
+ module Util
7
+
8
+ def self.is_limelight_scene?(file)
9
+ return is_directory_containing_file?(file, "props.rb")
10
+ end
11
+
12
+ def self.is_limelight_production?(file)
13
+ return is_directory_containing_file?(file, "stages.rb")
14
+ end
15
+
16
+ def self.is_directory_containing_file?(file, file_name)
17
+ if file.is_a? String
18
+ return File.directory?(file) && File.exists?(File.join(file, file_name))
19
+ else
20
+ return file.isDirectory() && File.exists?(File.join(file.absolute_path, file_name))
21
+ end
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,20 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ module Limelight
5
+ module VERSION #:nodoc:
6
+ unless defined? MAJOR
7
+ MAJOR = 0
8
+ MINOR = 0
9
+ TINY = 1
10
+
11
+ STRING = [MAJOR, MINOR, TINY].join('.')
12
+ TAG = "REL_" + [MAJOR, MINOR, TINY].join('_')
13
+
14
+ NAME = "Limelight"
15
+ URL = "http://limelight.8thlight.com"
16
+
17
+ DESCRIPTION = "#{NAME}-#{STRING} - Limelight\n#{URL}"
18
+ end
19
+ end
20
+ end
data/lib/limelight.jar ADDED
Binary file
@@ -0,0 +1,24 @@
1
+ You may ask, "Where does the name '8th Light' come from?" To answer that, let's first discuss the foundational principles held by 8th Light.
2
+
3
+ Craftsmanship
4
+ The folks at 8th Light consider themselves as software craftsmen rather than software engineers or software scientists. Clearly, engineering skills and scientific understanding are required to write good software. It is the application of these skills in combination with a pragmatic attitude and a sense of quality that define craftsmanship.
5
+
6
+ As craftsmen, our style of software development differs from traditional styles of software development. For one, we maintain close collaboration with the customers or end users of the systems we build. We are continually refining and improving every bit of the code base as the system evolves. Every member of our team works together in an open and synergistic workspace. To ensure a well designed system with almost no defects we drive development though tests. Feedback during development is extremely valuable which is why we work in iterations delivering working functionality regularly.
7
+
8
+ Perhaps the most important aspect of our work is pride. We build software that we are proud to have built and that our clients are proud to have.
9
+
10
+ Apprenticeship
11
+ It has been known for decades that the best way to become a good software developer is to learn from a good software developer. This is in line with the craftsmanship model. In any craft, newcomers start out as apprentices. 8th Light hires only apprentices.
12
+
13
+ This serves two purposes. The first is that of maintaining quality. Starting out as an apprentice allows newcomers to focus on nothing but learning as much as possible by working with senior 8th Light developers. When an apprentice concludes his apprenticeship he is able to build quality software.
14
+
15
+ The second reason is uniformity and consistency. Studies have shown that good developers are consistent and uniform in their style of coding. Every good developer has a different style but each one is consistent with themself. Inconsistencies in a software system add complexity and decrease productivity. Therefore, 8th Light strives to build development teams that practice the same style of development. In this way our teams remain productive and our software remains simple.
16
+
17
+ 8th Light
18
+ The values described above are not unlike those of martial arts. The name '8th Light' holds special meaning to Micah (the company's founder) who trained in the Eighth Light school of Jujitsu called Hakkoryu. 8th Light was chosen as a name for this company because we share much of the spirit and values of martial arts, particularly Hakkoryu Jujitsu.
19
+
20
+ "The name "Hakkoryu" is based on a philosophical Japanese view of the color spectrum as being divided into nine bands of light. The eighth shade is infrared, which is invisible to the naked eye but extremely powerful, as are Hakkoryu techniques. The number eight in Japan also has associated with it numerous philosophical and religious meanings that are beyond the scope of this brief introduction."
21
+
22
+ - hakkoryu.com
23
+
24
+ Coincidentally, the number eight also has special meaning in the world of software.
@@ -0,0 +1,11 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ __ :name => "page"
5
+ main_column do
6
+ __install "menu.rb"
7
+ about_tagline :text => "By the work one knows the workmen.\nJean De La Fontaine"
8
+ section_title :text => "About Us"
9
+ section_body :text => __loader__.read("about/about.txt")
10
+ __install "footer.rb"
11
+ end
@@ -0,0 +1,2 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
@@ -0,0 +1,6 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ footer do
5
+ copyright :text => "8th Light, Inc. Copyright 2007"
6
+ end
@@ -0,0 +1,28 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ __ :name => "page"
5
+ main_column do
6
+ __install "menu.rb"
7
+ tag_line
8
+ spot_light do
9
+ spot_light_title :text => "In the spotlight"
10
+ book_news do
11
+ book_news_img
12
+ book_news_text :text => "Micah coathors Agile Principles, Patterns, and Practices in C# with Unclebob."
13
+ end
14
+ sm_news do
15
+ sm_news_img
16
+ sm_news_text :text => "Check out the Statemachine Ruby Gem and Rails plugin."
17
+ end
18
+ end
19
+ news do
20
+ news_title :text => "Recent News"
21
+ new_item :text => "07.07 8th Light welcomes Doug Bradbury to the team!"
22
+ new_item :text => "07.07 8th Light doing Agile Rails Fest at Agile Conference in August."
23
+ new_item :text => "02.07 Eric Smith Joins the 8th Light team!"
24
+ new_item :text => "01.07 Jim Suchy Joins the 8th Light team!"
25
+ new_item :text => "01.07 Micah Martin contributes article on FitNesse to the just released \"Windows Developer Power Tools\" book."
26
+ end
27
+ __install "footer.rb"
28
+ end
@@ -0,0 +1,2 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
@@ -0,0 +1,11 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ header
5
+ menu do
6
+ link :on_mouse_clicked => "scene.load('home')", :text => "Home"
7
+ link :on_mouse_clicked => "scene.load('services')", :text => "Services"
8
+ link :on_mouse_clicked => "scene.load('about')", :text => "About"
9
+ link :text => "Blog"
10
+ link :text => "Contact"
11
+ end
@@ -0,0 +1,11 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ __ :name => "page"
5
+ main_column do
6
+ __install "menu.rb"
7
+ services_tagline :text => "Pleasure in the job puts perfection in the work.\n\tAristotle"
8
+ section_title :text => "services"
9
+ section_body :text => __loader__.read("services/services.txt")
10
+ __install "footer.rb"
11
+ end
@@ -0,0 +1,8 @@
1
+ At 8th Light, we use a unique process of actuating ideas, accepting the best and most efficient practices, and synthesizing those practices into an effectual and coherent method. Communication, quality, and innovation drive the decisions in this process, and the end goal is to produce impressive software for clients according to their specifications.
2
+
3
+ Values
4
+ Communication is a priority. We believe that working closely with the customer is the only way to ensure that a product is created in sync with both the customer’s vision and their desired outcome. Daily interactions with the customer are preferred, as is working on site. We create with the understanding that each finished product is the result of its own specific evolution, and that the software being written should constantly be subject to modifications of concept and conclusion. Each iteration produces more business value, as with each brush stroke the image on a canvas is further disclosed. At 8th Light, we employ a creative process that highlights cooperation and consideration, and we appreciate that this practice is the difference between good software and great software.
5
+
6
+ The quality of code in an application indicates many things; high-quality code makes your product easier to extend and maintain, as changes to the code are embraced by the framework and design. Moving fast becomes easier, and the customer is able to stay ahead of their competitors as well as adapt to changes quickly and efficiently.
7
+
8
+ Commitment, creativity, and innovation form the bridge between discipline and art at 8th Light. A customer once expressed to our team, “we hired you as problem solvers,” and this focus on innovation—the idea that problems extend beyond the technical realm of computer programming—is what continues to drive our professional attitude. We believe that innovation in software happens when one dives into the business domain, imaginatively solving those problems first, and then figures out how to write code after what they have learned there. When software developers allow themselves to think in an open and inspired manner, that originality and complexity of thought enables them to meaningfully connect the dots between business and implementation.
@@ -0,0 +1,2 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
@@ -0,0 +1,8 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ stage "8th Light" do
5
+ default_scene "home"
6
+ size [900, 800]
7
+ location [300, 100]
8
+ end