transistor 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2b5176c42b0149790524cb131b0fe4e070c775ae
4
+ data.tar.gz: 1fd188be8e56121b75c75adcda575943d9eaf5dc
5
+ SHA512:
6
+ metadata.gz: 601eca82ca3e84ae2a95b47949fd14ce6a2dca83fd5cada55792ee2f9df457b08c3ede7fc92d088a1df7ee9f67409f30ab4e71ac900beb5e8025faa78418ffbd
7
+ data.tar.gz: a97eb35930783a87e68d37fc52dc545310ee06723671acee136837c5d2467e32945ca0be4df2e465b9ac0e7e70ab5124178fea79030e5382966f29af070c801f
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'jasmine'
4
+
5
+ gem 'jslint-v8'
6
+
7
+ gem 'jake'
8
+
9
+ gem 'rake'
10
+
11
+ gem 'gem-this'
data/Gemfile.lock ADDED
@@ -0,0 +1,57 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ childprocess (0.3.9)
5
+ ffi (~> 1.0, >= 1.0.11)
6
+ diff-lcs (1.2.4)
7
+ eventful (1.0.1)
8
+ methodphitamine (= 1.0.0)
9
+ ffi (1.8.1)
10
+ gem-this (0.3.7)
11
+ jake (1.1.1)
12
+ eventful (>= 1.0.0)
13
+ oyster (>= 0.9.5)
14
+ packr (>= 3.2.0)
15
+ jasmine (1.3.2)
16
+ jasmine-core (~> 1.3.1)
17
+ rack (~> 1.0)
18
+ rspec (>= 1.3.1)
19
+ selenium-webdriver (>= 0.1.3)
20
+ jasmine-core (1.3.1)
21
+ jslint-v8 (1.1.1)
22
+ therubyracer (~> 0.10.0)
23
+ libv8 (3.3.10.4)
24
+ methodphitamine (1.0.0)
25
+ multi_json (1.7.2)
26
+ oyster (0.9.5)
27
+ packr (3.2.1)
28
+ oyster (>= 0.9.5)
29
+ rack (1.5.2)
30
+ rake (10.0.4)
31
+ rspec (2.13.0)
32
+ rspec-core (~> 2.13.0)
33
+ rspec-expectations (~> 2.13.0)
34
+ rspec-mocks (~> 2.13.0)
35
+ rspec-core (2.13.1)
36
+ rspec-expectations (2.13.0)
37
+ diff-lcs (>= 1.1.3, < 2.0)
38
+ rspec-mocks (2.13.1)
39
+ rubyzip (0.9.9)
40
+ selenium-webdriver (2.32.1)
41
+ childprocess (>= 0.2.5)
42
+ multi_json (~> 1.0)
43
+ rubyzip
44
+ websocket (~> 1.0.4)
45
+ therubyracer (0.10.2)
46
+ libv8 (~> 3.3.10)
47
+ websocket (1.0.7)
48
+
49
+ PLATFORMS
50
+ ruby
51
+
52
+ DEPENDENCIES
53
+ gem-this
54
+ jake
55
+ jasmine
56
+ jslint-v8
57
+ rake
data/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # Radiotower Client
2
+
3
+ The javascript client consists mainly of two parts:
4
+
5
+ * Transistor.Control
6
+ * Transistor.Radio
7
+
8
+ ## Control
9
+
10
+ The Control object is used for administrative work on a station. It is initialized as following:
11
+
12
+ ```javascript
13
+ var broadcaster_url = "http://broadcast.radiotower.io",
14
+ station_uid = "5a665bf153c0437bdb14a3004dad52e1",
15
+ push_token = "e29c6c92143cfaa0d5026aebf87f1a0f";
16
+
17
+ var control = Transistor.Control(broadcaster_url, station_uid, push_token);
18
+ ```
19
+
20
+ The main purpose of the Control object is the administration of specific channels. It supports the following basic collection operations:
21
+
22
+ ```javascript
23
+ control.set("channel/path", [{value: 'collection'}, {value: 'of'}, {value: 'entries'}]);
24
+ control.insert("channel/path", {value: 'object that gets pushed'});
25
+ control.update("channel/path", 12, {value: 'i am the new object w/ id 12'});
26
+ control.remove("channel/path", 23); // object w/ id 23 gets removed
27
+ ```
28
+
29
+ The actual ids of an specific entry are retrieved through the client, which usage gets explained in the following chapter.
30
+
31
+ ## Radio
32
+
33
+ The Radio object can be used --- as the name might suggest --- for listening to specific channels of a station of the Radiotower. It is initialized as following:
34
+
35
+ ```javascript
36
+ var station_finder_url = "http://station_finder.radiotower.io",
37
+ station_uid = "5a665bf153c0437bdb14a3004dad52e1",
38
+ test_token = "d10cf06ecd08ff5bc0df1c8bb84d1107"
39
+ // or use the live_token, if it's a production application
40
+
41
+ var radio = Transistor.Radio(station_finder_url, station_uid, test_token);
42
+ ```
43
+
44
+ Now the basic Radio is initialized. No network connections or requests are done so far. On a second step, you have to tune your radio to all the channels, you want to listen to:
45
+
46
+ ```javascript
47
+ var listener = function (event, args) {
48
+ console.log("Event '"+event+"' occured with args", arg);
49
+ };
50
+
51
+ radio.tune("news", listener);
52
+ radio.tune("sports", listener);
53
+ ```
54
+
55
+ Even at this point, no connections where made, the listener structure is 100% passive.
56
+
57
+ To get things startet, you have to turn on the Radio (sounds pretty clear, eh?).
58
+
59
+ This will fire a request to the StationFinder like: "Hey, here I am, at which frequency can I get my channels, and what is their current state??"
60
+
61
+ ```javascript
62
+ radio.turnOn();
63
+ ```
64
+
65
+ From now on, your listener will fire, whenever an specific event occures. Below is a listing of the possible events and their respective arguments:
66
+
67
+ ```javascript
68
+ // These are the arguments of the called listener (event, args)
69
+
70
+ // "init", {collection: [{id: 12, object: {..}}, {id: 13, object: {..}]}
71
+ // "set", {collection: [{id: 12, object: {..}}, {id: 13, object: {..}]}
72
+ // "insert", {entry: {id: 24, object: {..}}}
73
+ // "update", {id: 13, entry: {id: 13, object: {..}}}
74
+ // "remove", {id: 13}
75
+ ```
76
+
77
+ ## Binders
78
+
79
+ To simplify the binding between a remote Radiotower collection and your local array, Transistor gives you a nifty little tool called Binder.
80
+
81
+ Mainly, it implements a simple and thin listener which keeps track of changes and updates an array accordingly. Use it this way:
82
+
83
+ ```javascript
84
+ // radio is already initialized but not turned on yet
85
+
86
+ var news = [],
87
+ news_binder = Transistor.Binder(news);
88
+
89
+ radio.tune("the/news", news_binder);
90
+
91
+ radio.turnOn();
92
+ ```
93
+
94
+ From now on, your local array `news` is an exact copy of the collection in the channel "the/news". Radio and Binder are there for you, they talk and sync and you have nothing to worry about at all while using your local array.
95
+
96
+ But keep in mind, that changes on the array itself will bring most likely inconsitencies in your data. All updates, inserts, a.s.o. *MUST* bew made through the Control object.
data/Rakefile ADDED
@@ -0,0 +1,109 @@
1
+ require 'rake'
2
+ require 'jslint-v8'
3
+
4
+ namespace :js do
5
+ JSLintV8::RakeTask.new do |task|
6
+ task.name = "lint"
7
+ task.description = "runs jslint against all important javascript files"
8
+
9
+ task.output_stream = STDOUT
10
+
11
+ task.include_pattern = "lib/transistor/*.js"
12
+
13
+ task.browser = true # predefine Browser globals
14
+ end
15
+ end
16
+
17
+ begin
18
+ require 'jasmine'
19
+ load 'jasmine/tasks/jasmine.rake'
20
+ rescue LoadError
21
+ task :jasmine do
22
+ abort "Jasmine is not available. In order to run jasmine, you must: (sudo) gem install jasmine"
23
+ end
24
+ end
25
+
26
+
27
+ require "rubygems"
28
+ require "rubygems/package_task"
29
+ require "rdoc/task"
30
+
31
+ require "rspec"
32
+ require "rspec/core/rake_task"
33
+ RSpec::Core::RakeTask.new do |t|
34
+ t.rspec_opts = %w(--format documentation --colour)
35
+ end
36
+
37
+
38
+ task :default => ["spec"]
39
+
40
+ # This builds the actual gem. For details of what all these options
41
+ # mean, and other ones you can add, check the documentation here:
42
+ #
43
+ # http://rubygems.org/read/chapter/20
44
+ #
45
+ spec = Gem::Specification.new do |s|
46
+
47
+ # Change these as appropriate
48
+ s.name = "transistor"
49
+ s.version = "0.1.0"
50
+ s.summary = "Client for the radiotower.io service"
51
+ s.author = "Jakob Holderbaum"
52
+ s.email = "jakob@featurefabrik.de"
53
+ s.homepage = "http://featurefabrik.com"
54
+
55
+ s.has_rdoc = true
56
+ s.extra_rdoc_files = %w(README.md)
57
+ s.rdoc_options = %w(--main README.md)
58
+
59
+ # Add any extra files to include in the gem
60
+ s.files = %w(Gemfile.lock index.html Rakefile Gemfile faye-browser.js README.md jake.yml) + Dir.glob("{spec,lib}/**/*")
61
+ s.require_paths = ["lib"]
62
+
63
+ # If you want to depend on other gems, add them here, along with any
64
+ # relevant versions
65
+ # s.add_dependency("some_other_gem", "~> 0.1.0")
66
+
67
+ # If your tests use any gems, include them here
68
+ s.add_development_dependency('jasmine')
69
+ s.add_development_dependency('jslint-v8')
70
+ s.add_development_dependency('jake')
71
+ s.add_development_dependency('rake')
72
+ s.add_development_dependency('gem-this')
73
+ end
74
+
75
+ # This task actually builds the gem. We also regenerate a static
76
+ # .gemspec file, which is useful if something (i.e. GitHub) will
77
+ # be automatically building a gem for this project. If you're not
78
+ # using GitHub, edit as appropriate.
79
+ #
80
+ # To publish your gem online, install the 'gemcutter' gem; Read more
81
+ # about that here: http://gemcutter.org/pages/gem_docs
82
+ Gem::PackageTask.new(spec) do |pkg|
83
+ pkg.gem_spec = spec
84
+ end
85
+
86
+ desc "Build the gemspec file #{spec.name}.gemspec"
87
+ task :gemspec do
88
+ file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
89
+ File.open(file, "w") {|f| f << spec.to_ruby }
90
+ end
91
+
92
+ # If you don't want to generate the .gemspec file, just remove this line. Reasons
93
+ # why you might want to generate a gemspec:
94
+ # - using bundler with a git source
95
+ # - building the gem without rake (i.e. gem build blah.gemspec)
96
+ # - maybe others?
97
+ task :package => :gemspec
98
+
99
+ # Generate documentation
100
+ RDoc::Task.new do |rd|
101
+ rd.main = "README.md"
102
+ rd.rdoc_files.include("README.md", "lib/**/*.rb")
103
+ rd.rdoc_dir = "rdoc"
104
+ end
105
+
106
+ desc 'Clear out RDoc and generated packages'
107
+ task :clean => [:clobber_rdoc, :clobber_package] do
108
+ rm "#{spec.name}.gemspec"
109
+ end