flok 0.0.1 → 0.0.2

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: 6dd5854740ffca215345f553e605128fe4c96eaf
4
- data.tar.gz: b8d705a36091be26a782332e85951e81d8cdb6b5
3
+ metadata.gz: c5e1200a43eac75a5bdf221ec8653eeaec723f88
4
+ data.tar.gz: b8b102d8edd66ef040de7ec101a6e30b33be5833
5
5
  SHA512:
6
- metadata.gz: b212db2926d45f322bbd5398f98507bc36a65bd13e9ca5572a2852e7b1fd206058cfb46a5103a2a6e4e81bc10cd107231ed6bbf86fdc2b6bc9fc1bb6051eccc3
7
- data.tar.gz: 6dc1bd4f98989edca5e3a4555213456e3cb901b2668c82c406d6005b9fbf5cc54da2ff707d461d8b75944539271e7883fa963639284484ce6374bba61b5b3256
6
+ metadata.gz: 9139c10262284a1b2358f2b3863c803d739f818b68cdfbbc58830f6368fb086cfd5703ce09823242186f734023b7a443760ec93be490b5117d057bf068532cab
7
+ data.tar.gz: 34febd5c86fd6bb185f007da137fc4ae648ea98e56ee366c82a8cf16ddd23bbb23539f7e47421cd708fa743f2d3b4d7c415ec775cd1bcb07c479cc7aa4c32b52
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- ![flok: The mobile application framework](https://raw.githubusercontent.com/sotownsend/flok/master/logo.png)
1
+ ![flok: The eventful application framework](https://raw.githubusercontent.com/sotownsend/flok/master/logo.png)
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/iarrogant.svg)](http://badge.fury.io/rb/flok)
4
4
  [![Build Status](https://travis-ci.org/sotownsend/flok.svg)](https://travis-ci.org/sotownsend/flok)
@@ -9,6 +9,24 @@
9
9
 
10
10
  A work in progress
11
11
 
12
+ # Flok Modules
13
+ A concept borrowed from [Rails engines](http://guides.rubyonrails.org/engines.html), Flok modules both serve as your project files, all library modules, and gemified instances. That is, a project you create is automatically modular and can be imported in another flok module/project.
14
+
15
+ # Compilation
16
+ Flok does not rely on ruby for the final produced `application.js` file. The output file is pure javascript and written in javascript (not transcoded). Ruby only serves as a compilation assistant.
17
+
18
+ # Task
19
+ The task is the base unit in flok, similar to a rack module except that rack is a stack and flok is a party. Based on concepts borrowed from XNU®, FreeBSD®, and GNU HURD®; tasks are combined in flok to produce behavior by many tasks inter-cooperating. Efficiency has been provided through virtualizing the task communication so that no message passing takes place inside flok and all modules are combined into an efficient monolithic module.
20
+
21
+ ### Task Facilities
22
+ Tasks are able to
23
+ - send and receive events from a global or internal source.
24
+ - set interval and timeout timers.
25
+ - store temporary data in it's own heap '$__'
26
+
27
+ ### Default modules
28
+ This flok project contains the 'micro-task-kernel', the 'ui', and the 'operations' modules.
29
+
12
30
  ## Requirements
13
31
 
14
32
  - Mac OS X 10.9+ (Untested)
data/bin/flok CHANGED
@@ -2,11 +2,29 @@
2
2
 
3
3
  require 'flok'
4
4
  require 'thor'
5
+ require 'fileutils'
5
6
 
6
7
  class FlokCLI < Thor
7
8
  desc "new <path>", "Create a new flok project and/or module, you may supply an absolute path or relative, the last entry in the path will be the module name and folder name of the project"
8
9
  def new path
9
- Dir.mkdir path
10
+ name = File.basename(path)
11
+ Dir.chdir File.dirname(path) do
12
+ `bundle gem #{name}`
13
+
14
+ Dir.chdir name do
15
+ Dir.mkdir "app"
16
+ Dir.mkdir "config"
17
+ end
18
+ end
19
+ end
20
+
21
+ desc "build", "Build a flok project, you must be in the root of the project"
22
+ def build
23
+ Dir.mkdir("./public") unless File.exists?("./public")
24
+ FileUtils.touch "./public/application.js"
25
+
26
+ kernel_src = Flok::MergeSource.merge_kernel
27
+ File.write("./public/application.js", kernel_src)
10
28
  end
11
29
  end
12
30
 
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.6"
22
22
  spec.add_development_dependency "rake", "~> 10.3"
23
23
  spec.add_development_dependency "rspec", "~> 3.2"
24
+ spec.add_development_dependency "execjs", "~> 2.4.0"
24
25
  spec.add_runtime_dependency "thor", "~> 0.19"
25
26
  spec.executables << 'flok'
26
27
  end
@@ -1,5 +1,21 @@
1
1
  require "flok/version"
2
2
 
3
3
  module Flok
4
- # Your code goes here...
4
+ module MergeSource
5
+ #Merge all the kernel javascript files into one string
6
+ def self.merge_kernel
7
+ Dir.chdir(File.dirname(__FILE__)) do
8
+ Dir.chdir("./js/kernel/") do
9
+ js_files = Dir["*.js"]
10
+ out = ""
11
+ js_files.each do |js|
12
+ out << File.read(js)
13
+ out << "\n"
14
+ end
15
+
16
+ return out
17
+ end
18
+ end
19
+ end
20
+ end
5
21
  end
@@ -1,3 +1,3 @@
1
1
  module Flok
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1 @@
1
+ Kernel = {}
@@ -1,8 +1,8 @@
1
1
  //Forward all custom events to all tasks
2
- Rebar.handleCustomEvent = function(type, event) {
3
- var len = Rebar.tasks.length;
2
+ Kernel.handleCustomEvent = function(type, event) {
3
+ var len = Kernel.tasks.length;
4
4
  for (var i = 0; i < len; ++i) {
5
- var task = Rebar.tasks[i]
5
+ var task = Kernel.tasks[i]
6
6
  task.handle(type, event)
7
7
  }
8
8
  }
@@ -1,4 +1,4 @@
1
- Rebar.hasInit = false
2
- Rebar.handleInitEvent = function(event) {
3
- Rebar.hasInit = true
1
+ Kernel.hasInit = false
2
+ Kernel.handleInitEvent = function(event) {
3
+ Kernel.hasInit = true
4
4
  }
@@ -1,2 +1,2 @@
1
- Rebar.handleTickEvent = function(event){
1
+ Kernel.handleTickEvent = function(event){
2
2
  }
@@ -1,30 +1,30 @@
1
- Rebar.process = function(event) {
1
+ Kernel.process = function(event) {
2
2
  var type = event.type;
3
3
  //All events need a type
4
- if (type === undefined) { throw "Rebar got an event that had no type!"; }
4
+ if (type === undefined) { throw "Kernel got an event that had no type!"; }
5
5
 
6
- if (Rebar.hasInit === false) {
6
+ if (Kernel.hasInit === false) {
7
7
  if (type === "init") {
8
- Rebar.handleInitEvent(event);
8
+ Kernel.handleInitEvent(event);
9
9
  } else {
10
- throw "Rebar got a first event that was not an init, it was " + type
10
+ throw "Kernel got a first event that was not an init, it was " + type
11
11
  }
12
12
  } else {
13
13
  //Is this a special event?
14
14
  if (type === "tick") {
15
- Rebar.handleTickEvent(event);
15
+ Kernel.handleTickEvent(event);
16
16
  } else {
17
- Rebar.handleCustomEvent(type, event);
17
+ Kernel.handleCustomEvent(type, event);
18
18
  }
19
19
  }
20
20
 
21
21
  //Return outbound event queue
22
- var queue = Rebar.outboundEventQueue;
23
- Rebar.outboundEventQueue = [];
22
+ var queue = Kernel.outboundEventQueue;
23
+ Kernel.outboundEventQueue = [];
24
24
  return queue;
25
25
  }
26
26
 
27
- Rebar.outboundEventQueue = [];
28
- Rebar.sendEvent = function(event) {
29
- Rebar.outboundEventQueue.push(event);
27
+ Kernel.outboundEventQueue = [];
28
+ Kernel.sendEvent = function(event) {
29
+ Kernel.outboundEventQueue.push(event);
30
30
  }
@@ -1,13 +1,13 @@
1
1
  //Global task list
2
- Rebar.tasks = [];
2
+ Kernel.tasks = [];
3
3
 
4
- Rebar.Task = function(name) {
4
+ Kernel.Task = function(name) {
5
5
  this.name = name;
6
- Rebar.tasks.push(this);
6
+ Kernel.tasks.push(this);
7
7
 
8
8
  this.sendEvent = function(type, info) {
9
9
  info.type = type;
10
- Rebar.sendEvent(info);
10
+ Kernel.sendEvent(info);
11
11
  }
12
12
 
13
13
  var handlers = [];
@@ -2,8 +2,34 @@ require './lib/flok.rb'
2
2
  require 'tempfile'
3
3
  require 'securerandom'
4
4
 
5
+ def ensure_tmp
6
+ tmp_spec_path = './spec/tmp'
7
+ Dir.mkdir(tmp_spec_path) unless File.exists?(tmp_spec_path)
8
+ end
9
+
5
10
  RSpec.describe "CLI" do
6
- it "Creates a new module folder" do
11
+ it "Creates a new module folder with absolute path" do
12
+ #Get a temporary file, delete it, but save the path
13
+ temp = Tempfile.new "flok-temp"
14
+ path = temp.path
15
+ temp.close
16
+ temp.unlink
17
+
18
+ `ruby -Ilib ./bin/flok new #{path}`
19
+
20
+ expect(Dir.exists? path).to be(true)
21
+ end
22
+
23
+ it "Creates a new module folder with relative path" do
24
+ ensure_tmp
25
+ fn = SecureRandom.hex
26
+
27
+ dir = "./spec/tmp/#{fn}"
28
+ `ruby -Ilib ./bin/flok new #{dir}`
29
+ expect(File.exists?(dir)).to be(true)
30
+ end
31
+
32
+ it "Creates a new module folder with correct root folders" do
7
33
  #Get a temporary file, delete it, but save the path
8
34
  temp = Tempfile.new "flok-temp"
9
35
  path = temp.path
@@ -12,6 +38,112 @@ RSpec.describe "CLI" do
12
38
 
13
39
  `ruby -Ilib ./bin/flok new #{path}`
14
40
 
15
- (Dir.exists? path).should eq(true)
41
+ folders = %w{app lib config}
42
+
43
+ folders.each do |f|
44
+ p = "#{path}/#{f}"
45
+ expect(Dir.exists? p).to be(true)
46
+ end
47
+ end
48
+
49
+ it "The new module has all the files and folders of a RubyGem" do
50
+ #Get a temporary file, delete it, but save the path
51
+ temp = Tempfile.new "flok-temp"
52
+ path = temp.path
53
+ temp.close
54
+ temp.unlink
55
+ Dir.mkdir(path)
56
+ test_gem_path = "#{path}/test_gem"
57
+ Dir.mkdir(test_gem_path)
58
+ file_paths = []
59
+ dir_paths = []
60
+ name = "#{SecureRandom.hex[0..4]}_module_name"
61
+ Dir.chdir(test_gem_path) do
62
+ `bundle gem #{name}`
63
+
64
+ Dir.chdir "./#{name}" do
65
+ Dir["**/*"].each do |f|
66
+ if File.file?(f)
67
+ file_paths << f
68
+ end
69
+
70
+ if File.directory?(f)
71
+ dir_paths << f
72
+ end
73
+ end
74
+ end
75
+
76
+ file_paths.uniq!
77
+ dir_paths.uniq!
78
+ end
79
+
80
+ `ruby -Ilib ./bin/flok new #{path}/#{name}`
81
+ Dir.chdir "#{path}/#{name}" do
82
+ Dir["**/*"].each do |f|
83
+ if File.file?(f)
84
+ file_paths = file_paths - [f]
85
+ end
86
+
87
+ if File.directory?(f)
88
+ dir_paths = dir_paths - [f]
89
+ end
90
+ end
91
+
92
+ if file_paths.count+dir_paths.count != 0
93
+ puts "------------------------------------------------------------------------------"
94
+ puts "Files not found matching Gemfile: #{file_paths.inspect}" if file_paths.count > 0
95
+ puts "Directories not found matching Gemfile: #{dir_paths.inspect}" if dir_paths.count > 0
96
+ puts "------------------------------------------------------------------------------"
97
+ end
98
+
99
+ expect(file_paths.count+dir_paths.count).to be(0)
100
+ end
101
+ end
102
+
103
+ it "does create a public/application.js when 'build' is run" do
104
+ #Get a temporary file, delete it, but save the path
105
+ temp = Tempfile.new "flok-temp"
106
+ path = temp.path
107
+ temp.close
108
+ temp.unlink
109
+
110
+ `ruby -Ilib ./bin/flok new #{path}`
111
+ gem_root_path = File.expand_path(File.dirname(__FILE__))+"/.."
112
+ Dir.chdir path do
113
+ `ruby -I#{gem_root_path}/lib #{gem_root_path}/bin/flok build`
114
+ expect(File.exist?("./public/application.js")).to be(true)
115
+ end
116
+ end
117
+
118
+ it "does create a public/application.js when 'build' is run that's not empty" do
119
+ #Get a temporary file, delete it, but save the path
120
+ temp = Tempfile.new "flok-temp"
121
+ path = temp.path
122
+ temp.close
123
+ temp.unlink
124
+
125
+ `ruby -Ilib ./bin/flok new #{path}`
126
+ gem_root_path = File.expand_path(File.dirname(__FILE__))+"/.."
127
+ Dir.chdir path do
128
+ `ruby -I#{gem_root_path}/lib #{gem_root_path}/bin/flok build`
129
+ expect(File.read("./public/application.js").length).to be > 0
130
+ end
131
+ end
132
+
133
+ it "creates an application.js that is executable by js" do
134
+ #Get a temporary file, delete it, but save the path
135
+ temp = Tempfile.new "flok-temp"
136
+ path = temp.path
137
+ temp.close
138
+ temp.unlink
139
+
140
+ `ruby -Ilib ./bin/flok new #{path}`
141
+ gem_root_path = File.expand_path(File.dirname(__FILE__))+"/.."
142
+ Dir.chdir path do
143
+ `ruby -I#{gem_root_path}/lib #{gem_root_path}/bin/flok build`
144
+ str = File.read("./public/application.js")
145
+ ExecJS.compile(str)
146
+ #it does not throw an error
147
+ end
16
148
  end
17
149
  end
@@ -0,0 +1,27 @@
1
+ require './lib/flok.rb'
2
+ require 'tempfile'
3
+ require 'securerandom'
4
+ require 'execjs'
5
+
6
+ def ensure_tmp
7
+ tmp_spec_path = './spec/tmp'
8
+ Dir.mkdir(tmp_spec_path) unless File.exists?(tmp_spec_path)
9
+ end
10
+
11
+ RSpec.describe "Flok::MergeSourceSpec" do
12
+ it "when merging the kernel, it returns a string" do
13
+ str = Flok::MergeSource.merge_kernel
14
+ expect(str.class).to be(String)
15
+ end
16
+
17
+ it "when merging the kernel, it returns a string with length" do
18
+ str = Flok::MergeSource.merge_kernel
19
+ expect(str.length).to be > 0
20
+ end
21
+
22
+ it "when merging the kernel, the kernel files located in ./lib/js/kernel/ do merge and run without js syntax errors" do
23
+ str = Flok::MergeSource.merge_kernel
24
+ ExecJS.compile(str)
25
+ #It does not throw an error
26
+ end
27
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flok
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - seo
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: execjs
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 2.4.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 2.4.0
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: thor
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -71,7 +85,6 @@ description: Flok is a cross-platform application framework system that exports
71
85
  email:
72
86
  - seotownsend@icloud.com
73
87
  executables:
74
- - banner.png
75
88
  - flok
76
89
  extensions: []
77
90
  extra_rdoc_files: []
@@ -82,11 +95,11 @@ files:
82
95
  - LICENSE
83
96
  - README.md
84
97
  - Rakefile
85
- - bin/banner.png
86
98
  - bin/flok
87
99
  - flok.gemspec
88
100
  - lib/flok.rb
89
101
  - lib/flok/version.rb
102
+ - lib/js/kernel/common.js
90
103
  - lib/js/kernel/handleCustomEvent.js
91
104
  - lib/js/kernel/handleInitEvent.js
92
105
  - lib/js/kernel/handleTickEvent.js
@@ -94,6 +107,7 @@ files:
94
107
  - lib/js/kernel/task.js
95
108
  - logo.png
96
109
  - spec/cli_spec.rb
110
+ - spec/merge_source_spec.rb
97
111
  homepage: https://github.com/sotownsend/flok
98
112
  licenses:
99
113
  - MIT
@@ -120,4 +134,5 @@ specification_version: 4
120
134
  summary: A boring javascript application framework
121
135
  test_files:
122
136
  - spec/cli_spec.rb
137
+ - spec/merge_source_spec.rb
123
138
  has_rdoc:
Binary file