straightedge 0.1.0 → 0.1.1

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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +7 -0
  5. data/README.md +44 -2
  6. data/gemspec.yml +3 -0
  7. data/lib/straightedge.rb +33 -11
  8. data/lib/straightedge/aspects.rb +3 -0
  9. data/lib/straightedge/aspects/colorable.rb +8 -0
  10. data/lib/straightedge/aspects/figural.rb +12 -0
  11. data/lib/straightedge/aspects/positional.rb +10 -0
  12. data/lib/straightedge/colors.rb +72 -0
  13. data/lib/straightedge/config.rb +6 -0
  14. data/lib/straightedge/director.rb +39 -0
  15. data/lib/straightedge/extend/array.rb +2 -13
  16. data/lib/straightedge/figures.rb +8 -0
  17. data/lib/straightedge/{adapters.rb → figures/circle.rb} +0 -0
  18. data/lib/straightedge/figures/figure.rb +44 -0
  19. data/lib/straightedge/figures/grid.rb +65 -0
  20. data/lib/straightedge/figures/grid_cell.rb +0 -0
  21. data/lib/straightedge/figures/hexagon.rb +33 -0
  22. data/lib/straightedge/figures/label.rb +13 -0
  23. data/lib/straightedge/figures/line.rb +25 -0
  24. data/lib/straightedge/figures/mark.rb +23 -0
  25. data/lib/straightedge/figures/quadrilateral.rb +20 -0
  26. data/lib/straightedge/motor/adapter.rb +54 -0
  27. data/lib/straightedge/motor/engine.rb +16 -0
  28. data/lib/straightedge/origin.rb +3 -0
  29. data/lib/straightedge/presenter.rb +29 -0
  30. data/lib/straightedge/scene.rb +20 -0
  31. data/lib/straightedge/surface.rb +21 -0
  32. data/lib/straightedge/toolkit/compass.rb +19 -0
  33. data/lib/straightedge/toolkit/rose.rb +60 -0
  34. data/lib/straightedge/toolkit/ruler.rb +23 -0
  35. data/lib/straightedge/tools.rb +3 -0
  36. data/lib/straightedge/version.rb +1 -1
  37. data/spec/spec_helper.rb +4 -1
  38. data/spec/straightedge/adapter_spec.rb +14 -0
  39. data/spec/straightedge/director_spec.rb +10 -0
  40. data/spec/straightedge/extend/array_spec.rb +1 -6
  41. data/spec/straightedge/{figure_spec.rb → figures/figure_spec.rb} +0 -5
  42. data/spec/straightedge/figures/grid_spec.rb +31 -0
  43. data/spec/straightedge/figures/hexagon_spec.rb +7 -0
  44. data/spec/straightedge/motor/engine_spec.rb +11 -0
  45. data/spec/straightedge/scene_spec.rb +27 -0
  46. data/spec/straightedge/{compass_spec.rb → toolkit/compass_spec.rb} +0 -4
  47. data/spec/straightedge/{rose_spec.rb → toolkit/rose_spec.rb} +0 -5
  48. data/spec/straightedge/toolkit/ruler_spec.rb +14 -0
  49. data/spec/straightedge_spec.rb +35 -0
  50. metadata +54 -16
  51. data/.rvmrc +0 -1
  52. data/lib/straightedge/compass.rb +0 -17
  53. data/lib/straightedge/figure.rb +0 -28
  54. data/lib/straightedge/grid.rb +0 -34
  55. data/lib/straightedge/line.rb +0 -21
  56. data/lib/straightedge/mark.rb +0 -26
  57. data/lib/straightedge/rose.rb +0 -44
  58. data/lib/straightedge/ruler.rb +0 -21
  59. data/spec/straightedge/grid_spec.rb +0 -33
  60. data/spec/straightedge/ruler_spec.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0a4391ab9503098a88e8fcdc920ac529b241afe5
4
- data.tar.gz: 5dcff1efdb2e6a442648b381aa124640c72de1f5
3
+ metadata.gz: f8b2f60d62255936247fe75932dc27426760a1e9
4
+ data.tar.gz: 05cc12291ebbf0518a608b1f1e0f3ef6f0ca376d
5
5
  SHA512:
6
- metadata.gz: 9c5a50dc8f32b28f4a07659b29c4a73a6731230bedf5f99b38b93b4d98961ae2602b8d962d195b307ca4d50d35e770be94a58a19ff999fd0706fe53296235ae7
7
- data.tar.gz: 33cceb0569dd5753bc4fd886839f180be98aac6ab87b281053b1626fe0dc0e1177c0f4a69d5a955643398894e7e09180d8990e297251dfa77aeef649b02d49c1
6
+ metadata.gz: 176f4ae297d81ab3c94e6daf7a0ea0aa3ad94cd12594ead81123822e0704ba6b7dd56f2026a1e9094e5840eb0320fc7c64c2e8b49787e1468f52e2e2c8e059aa
7
+ data.tar.gz: 8e600b22c8cf4463e7a55e5d1883da258e81ea4668e8e686f36af5dbbe0bc35e9e7b277c39a651f6431dbe3ce81703143d14167b630567ddc4b857a1998c9ab6
data/.gitignore CHANGED
@@ -3,3 +3,4 @@ doc/
3
3
  pkg/
4
4
  vendor/cache/*.gem
5
5
  tags
6
+ **/.*.swp
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.1.5
data/Gemfile CHANGED
@@ -2,6 +2,13 @@ source :rubygems
2
2
 
3
3
  gemspec
4
4
 
5
+ gem 'mini-config'
6
+
7
+ group :test do
8
+ gem 'rspec'
9
+ gem 'rspec-its'
10
+ end
11
+
5
12
  group :development do
6
13
  gem 'pry'
7
14
  gem 'kramdown'
data/README.md CHANGED
@@ -1,28 +1,70 @@
1
1
  # straightedge
2
2
 
3
+ [![Code Climate](https://codeclimate.com/github/jweissman/straightedge/badges/gpa.svg)](https://codeclimate.com/github/jweissman/straightedge)
4
+
3
5
  * [Homepage](https://rubygems.org/gems/straightedge)
4
6
  * [Documentation](http://rubydoc.info/gems/straightedge/frames)
5
7
  * [Email](mailto:jweissman1986 at gmail.com)
6
8
 
7
9
  ## Description
8
10
 
9
- One idea is for this to house the reusable geometry logic in Ruby
11
+ Give me a compass and straightedge and I will conquer the world
12
+
13
+ [![Compass and Straightedge XKCD](http://imgs.xkcd.com/comics/compass_and_straightedge.png)](http://xkcd.com/866/)
14
+
15
+ Geometry primitives and graphical app (game) framework framework.
10
16
 
11
17
  ## Features
12
18
 
19
+ * Geometry toolkit
20
+ - extensible Compass
21
+ - Ruler (for measuring distances)
22
+
23
+ * Figures composed of points called Marks
24
+ - Line
25
+ - Quadrilateral
26
+ - Hexagon
27
+
28
+ * Some fledgling support for grids
29
+
30
+ * Some reactor-pattern framework platform components
31
+ to help standardize interfaces (see straightedge-gosu
32
+ and straightedge-canvas for examples)
33
+
13
34
  ## Examples
14
35
 
15
36
  require 'straightedge'
16
37
 
38
+ # you need an adapter to actually render something
39
+ require 'straightedge-gosu'
40
+
41
+ class Example::GameController < Straightedge::Director
42
+ def current_scene
43
+ {
44
+ [200,300] => Quadrilateral.new(dimensions: [200,100], color: :green),
45
+ [200,305] => "rectangle",
46
+
47
+ [400,300] => Hexagon.new(scale: 40.0, color: :blue),
48
+ [400,305] => "hexagon"
49
+ }
50
+ end
51
+ end
52
+
17
53
  ## Requirements
18
54
 
55
+ Ruby 2.x should be enough
56
+
19
57
  ## Install
20
58
 
21
59
  $ gem install straightedge
22
60
 
23
61
  ## Synopsis
24
62
 
25
- $ straightedge
63
+ Eventually it would be nice to support a CLI that wraps around tasks (note: not implemented yet)
64
+
65
+ $ straightedge create [app] — builds an example app skeleton
66
+ $ straightedge serve — stands up a canvas webserver
67
+ $ straightedge play — connects to local instance or plays through OpenGL adapter… etc
26
68
 
27
69
  ## Copyright
28
70
 
data/gemspec.yml CHANGED
@@ -6,6 +6,9 @@ authors: Joseph Weissman
6
6
  email: jweissman1986@gmail.com
7
7
  homepage: https://rubygems.org/gems/straightedge
8
8
 
9
+ dependencies:
10
+ mini-config: ~> 0.1.3
11
+
9
12
  development_dependencies:
10
13
  bundler: ~> 1.0
11
14
  rake: ~> 0.8
data/lib/straightedge.rb CHANGED
@@ -1,17 +1,39 @@
1
- require 'straightedge/version'
2
-
3
- require 'straightedge/compass'
4
- require 'straightedge/rose'
5
- require 'straightedge/ruler'
6
-
7
- require 'straightedge/mark'
8
- require 'straightedge/line'
9
- require 'straightedge/figure'
1
+ require 'mini/config'
10
2
 
11
- # really a grid should be a tiling figure...!
12
- require 'straightedge/grid'
3
+ require 'straightedge/version'
4
+ require 'straightedge/config'
5
+ require 'straightedge/origin'
6
+ require 'straightedge/aspects'
7
+ require 'straightedge/tools'
8
+ require 'straightedge/figures'
9
+ require 'straightedge/colors'
10
+ require 'straightedge/scene'
11
+ require 'straightedge/presenter'
13
12
 
14
13
  require 'straightedge/extend/array'
15
14
 
15
+ # for integration with viewing/gaming engines...
16
+ # TODO try to downstream as much of this to supporting libs
17
+ # as possible
18
+ require 'straightedge/motor/engine'
19
+ require 'straightedge/motor/adapter'
20
+ require 'straightedge/director'
21
+ require 'straightedge/surface'
22
+
16
23
  module Straightedge
24
+ include Toolkit
25
+ include Figures
26
+
27
+ # create constructors around out configured default components
28
+ class << self
29
+ %w[ engine agent surface adapter ].each do |elem|
30
+ define_method("new_#{elem}") do |*args|
31
+ Straightedge.config.send("#{elem}_class").new(*args)
32
+ end
33
+ end
34
+ end
35
+
36
+ def self.bootstrap
37
+ new_engine.boot
38
+ end
17
39
  end
@@ -0,0 +1,3 @@
1
+ require 'straightedge/aspects/positional'
2
+ require 'straightedge/aspects/colorable'
3
+ require 'straightedge/aspects/figural'
@@ -0,0 +1,8 @@
1
+ module Straightedge::Aspects
2
+ module Colorable
3
+ attr_reader :color
4
+ def paint(c=Straightedge::Colors.pick)
5
+ @color = c
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ module Straightedge::Aspects
2
+ module Figural
3
+ extend Forwardable
4
+
5
+ # consider entity as a figure (collection of points)
6
+ def to_points
7
+ Straightedge::Figure.new(self)
8
+ end
9
+ def_delegators :to_points, :adjacent, :center
10
+
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module Straightedge::Aspects
2
+ module Positional
3
+ extend Forwardable
4
+ # consider the entity as a vector in 2-space
5
+ def to_point
6
+ Straightedge::Mark.new(*self)
7
+ end
8
+ def_delegators :to_point, :x, :y
9
+ end
10
+ end
@@ -0,0 +1,72 @@
1
+ module Straightedge
2
+ module Colors
3
+ class Palette
4
+ extend Forwardable
5
+
6
+ attr_reader :names_and_values
7
+ def initialize(names_and_hex_values={})
8
+ @names_and_values = names_and_hex_values
9
+ end
10
+
11
+
12
+ def list; @names_and_values.keys end
13
+ def_delegator :list, :sample
14
+
15
+ def hex_value_for(name)
16
+ raise "no such color: #{name}" unless list.include?(name)
17
+ @names_and_values[name]
18
+ end
19
+
20
+ def self.base
21
+ @core ||= new({
22
+ white: 0xFFFFFFFF,
23
+ black: 0xFF000000,
24
+ none: 0x00000000,
25
+ })
26
+ end
27
+
28
+ # http://paletton.com/#uid=b5C4c2O0kfUu76fODb3COkppkonk+
29
+ def self.clean_rgb
30
+ @smooth_rgb ||= new(base.names_and_values.merge({
31
+ red: 0xFFEE787B, red1: 0xFFFECDCE, red2: 0xFFFDA6A8, red3: 0xFFC8494C, red4: 0xFFA6282B,
32
+ blue: 0xFF6C5DA5, blue1: 0xFFC2BAE0, blue2: 0xFF9488C3, blue3: 0xFF4D3D8B, blue4: 0xFF362673,
33
+ green: 0xFF67C262, green1: 0xFFC0ECBE, green2: 0xFF93DA8F, green3: 0xFF40A33B, green4: 0xFF258720
34
+ }))
35
+ end
36
+
37
+ # Palette URL: http://paletton.com/#uid=72s0u0k8kpR26GB4Wuzc2lNfjho
38
+ #
39
+ # the '4' is closer to the base color, we may want to rethink the naming strategy
40
+ # also -- we need a color concept and to generate these but that's another day!
41
+ def self.pleasant_pastels
42
+ @pastels ||= new(base.names_and_values.merge({
43
+ tan: 0xFFA9BD8C, tan1: 0xFFEBF2E2, tan2: 0xFFD2E0BD, tan3: 0xFF87A063, tan4: 0xFF667F42,
44
+ green: 0xFF71987D, green1: 0xFFC7D5CB, green2: 0xFF98B4A1, green3: 0xFF50805F, green4: 0xFF356644,
45
+ pink: 0xFFCEA098, pink1: 0xFFFFF1EE, pink2: 0xFFF4D3CE, pink3: 0xFFAE756C, pink4: 0xFF8B5148,
46
+ purple: 0xFFAD8095, purple1: 0xFFE5D6DD, purple2: 0xFFCDADBC, purple3: 0xFF925B74, purple4: 0xFF743D56,
47
+ }))
48
+ end
49
+ end
50
+
51
+ # expose module-level wrappers around the currently-configured palette
52
+ #
53
+ def self.palette
54
+ @current_palette ||= Straightedge.config.palette
55
+ end
56
+
57
+ def self.all
58
+ palette.list
59
+ end
60
+
61
+ def self.pick
62
+ palette.sample
63
+ end
64
+
65
+ def self.hex_value(color)
66
+ palette.hex_value_for color
67
+ end
68
+ end
69
+
70
+ # assign a basic rgb default color palette
71
+ config.palette = Colors::Palette.clean_rgb
72
+ end
@@ -0,0 +1,6 @@
1
+ module Straightedge
2
+ include Mini::Config
3
+ configure do |straightedge|
4
+ straightedge.geometry = [ 1600, 1200 ]
5
+ end
6
+ end
@@ -0,0 +1,39 @@
1
+ module Straightedge
2
+ class Director
3
+ extend Forwardable
4
+ include Straightedge::Figures
5
+
6
+ def prepare_stage(geometry)
7
+ @width, @height = *geometry
8
+ @space = Grid.new([30,30], scale: 20.0)
9
+ @space.paint!
10
+ end
11
+
12
+ def orchestrate
13
+ @space.paint!
14
+ end
15
+
16
+ def current_scene
17
+ Scene.new({
18
+ ORIGIN => @space,
19
+ [10,10] => "grid",
20
+
21
+ [200,300] => Quadrilateral.new(dimensions: [200,100], color: :green),
22
+ [200,305] => "rectangle",
23
+
24
+ [400,300] => Hexagon.new(scale: 40.0, color: :blue),
25
+ [400,305] => "hexagon"
26
+ })
27
+ end
28
+
29
+ ## handle custom events from the surface (clicks)...
30
+ # how should we handle socket/player connects?
31
+ #
32
+ def handle(evt_name, *args)
33
+ #puts "--- got event #{evt_name} with args #{args}"
34
+ send(evt_name.to_sym, *args)
35
+ end
36
+ end
37
+
38
+ config.agent_class = Director
39
+ end
@@ -1,5 +1,6 @@
1
1
  class Array
2
- extend Forwardable
2
+ include Straightedge::Aspects::Positional
3
+ include Straightedge::Aspects::Figural
3
4
 
4
5
  def sum
5
6
  inject(&:+)
@@ -8,16 +9,4 @@ class Array
8
9
  def mean
9
10
  sum / size
10
11
  end
11
-
12
- # consider the array as a vector in n-space (where n is the self.length)
13
- def to_point
14
- Straightedge::Mark.new(*self)
15
- end
16
- def_delegators :to_point, :x, :y
17
-
18
- # consider the array as an array of points
19
- def to_points
20
- Straightedge::Figure.new(self)
21
- end
22
- def_delegators :to_points, :adjacent, :center
23
12
  end
@@ -0,0 +1,8 @@
1
+ require 'straightedge/figures/figure'
2
+ require 'straightedge/figures/mark'
3
+ require 'straightedge/figures/label'
4
+ require 'straightedge/figures/line'
5
+ require 'straightedge/figures/quadrilateral'
6
+ require 'straightedge/figures/hexagon'
7
+ require 'straightedge/figures/grid'
8
+
File without changes
@@ -0,0 +1,44 @@
1
+ module Straightedge
2
+ module Figures
3
+ # TODO the idea is that a figure is a collection of marks (and possibly other figures...?)
4
+ # marks should be represented relative to the *figural* origin
5
+ class Figure
6
+ include Straightedge::Aspects::Colorable
7
+
8
+ extend Forwardable
9
+ include Enumerable
10
+
11
+ def_delegators :marks, :each
12
+ def_delegators :compass, :project
13
+ def_delegators :location, :x, :y
14
+
15
+ attr_accessor :marks, :color, :location
16
+
17
+ def initialize(marks=[], location: nil, color: :none)
18
+ @marks = marks
19
+ @color = color
20
+ @location = location
21
+ end
22
+
23
+ def compass; @compass ||= Straightedge::Toolkit::Compass.default end
24
+
25
+ def adjacent
26
+ approximate_adjacent = map(&method(:project)).flatten(1).uniq
27
+ actual_adjacent = approximate_adjacent.reject(&method(:include?))
28
+ actual_adjacent.sort_by(&method(:distance_from_center))
29
+ end
30
+
31
+
32
+ # note this is center of the collection of raw marks
33
+ # in terms of their own space; not displaced by location
34
+ # or scaled by dimensions
35
+ def center
36
+ [map(&:x).mean, map(&:y).mean]
37
+ end
38
+
39
+ def distance_from_center(xy)
40
+ Straightedge::Toolkit::Ruler.distance(xy,center)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,65 @@
1
+ module Straightedge
2
+ module Figures
3
+ class Grid < Figure
4
+ include Enumerable
5
+ def_delegators :to_a, :sample, :map!
6
+ def_delegator :dimensions, :x, :width
7
+ def_delegator :dimensions, :y, :height
8
+
9
+ attr_reader :dimensions, :scale, :figure
10
+
11
+ def initialize(dimensions=[1,1], opts={})
12
+ @dimensions = dimensions
13
+ @scale = opts.delete(:scale) { 1.0 }
14
+ super(to_a, opts)
15
+ end
16
+
17
+ def at(xy)
18
+ [xy.x, xy.y]
19
+ end
20
+
21
+ def each
22
+ Grid.each_coordinate([width, height]) do |x, y|
23
+ yield(at([x,y]))
24
+ end
25
+ end
26
+
27
+ def cell_at(xy)
28
+ @cells ||= {}
29
+ @cells[xy] ||= Figures::Quadrilateral.new(dimensions: [@scale, @scale], location: to_pixels(xy)) #[xy.x+1,xy.y+1])) #to_pixels(xy))
30
+ end
31
+
32
+ def each_cell
33
+ each { |xy| yield cell_at(xy) }
34
+ end
35
+
36
+ def paint!
37
+ #each(&:to_point)
38
+ each_cell(&:paint)
39
+ end
40
+
41
+ def clip(xys=[])
42
+ xys.reject do |xy|
43
+ _x,_y = *xy
44
+ _x < 0 || _y < 0 || x >= _x || y >= _y
45
+ end
46
+ end
47
+
48
+ def self.each_coordinate(dimensions)
49
+ dimensions.x.times do |x|
50
+ dimensions.y.times do |y|
51
+ yield [x,y]
52
+ end
53
+ end
54
+ end
55
+
56
+ def to_pixels(xy)
57
+ [xy.x * (@scale/2), xy.y * (@scale/2)]
58
+ end
59
+
60
+ #def to_coords(xy)
61
+ # [xy.x / (@scale/2), xy.y / (@scale/2) ]
62
+ #end
63
+ end
64
+ end
65
+ end