rbmobile 0.0.2 → 0.0.3

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.
data/README.markdown CHANGED
@@ -1,29 +1,78 @@
1
- # Ruby JQuery Mobile HAML helper
1
+ # Ruby jquery.mobile
2
2
 
3
- A swiss knife for creating a hipster UI like from Apple
3
+ A swiss knife for creating a hipster rich user-interfaces supposed to looks great on mobile devices.
4
4
 
5
5
  ### Description
6
6
 
7
7
  This project should help you to create more readable HAML templates for your
8
- mobile applications using http://jquerymobile.com framework.
9
-
8
+ mobile application using http://jquerymobile.com framework.
9
+
10
+ ### Example
11
+
12
+ Save your fingers! and write this code:
13
+
14
+ - page :theme => 'c' do
15
+ - header do
16
+ %h1 Page header
17
+ - content do
18
+ - list do
19
+ = divider "Awesome list"
20
+ - item do
21
+ Awesome list item
22
+ - footer do
23
+ - navbar do
24
+ - navigate_to 'a.html', 'Awesome', :icon => 'load'
25
+ - navigate_to 'b.html', 'Yeah!', :icon => 'save'
26
+
27
+ Instead of this code:
28
+
29
+ %div{ :'data-role' => 'page', :'data-theme' => 'c'}
30
+ %div{ :'data-role' => 'header'}
31
+ %h1 Page header
32
+ %div{ :'data-role' => 'content'}
33
+ %ul{ :'data-role' => 'list-view'}
34
+ %li{ :'data-role' => 'listdivider'} Awesome list
35
+ %li Awesome list item
36
+ %div{ :'data-role' => 'footer' }
37
+ %div{ :'data-role' => 'navbar'}
38
+ %ul
39
+ %li
40
+ %a{ :href => 'a.html', :'data-icon' => :save } Awesome
41
+ %a{ :href => 'a.html', :'data-icon' => :save } Awesome
42
+
43
+ And there is even more magic and autogenerator inside!
10
44
 
11
45
  ### Documentation
12
46
 
13
- http://rdoc.info/projects/mfojtik/rbmobile
47
+
48
+ - RDoc: http://rdoc.info/projects/mfojtik/rbmobile
49
+ - JQuery.Mobile: http://jquerymobile.com
14
50
 
15
51
  ### Requirements
16
52
 
17
53
  - You should include JQuery library in your project or place this library into
18
- 'public' folder
54
+ 'public' folder (it should be accessible in /jquery-xxx.min.js)
55
+
19
56
  - You should unzip JQuery mobile inside your 'public' folder:
20
57
 
21
- $ wget http://code.jquery.com/mobile/1.0b2/jquery.mobile-1.0b2.zip -O public/jquery.mobile-1.0b2.zip
58
+ $ wget http://code.jquery.com/mobile/1.0b2/jquery.mobile-1.0b2.zip \
59
+ -O public/jquery.mobile-1.0b2.zip
22
60
  $ cd public && unzip jquery.mobile-1.0b2.zip
61
+
62
+ - JQuery.mobile folder should be accessible in /jquery.mobile-xxx/
63
+
23
64
 
24
65
  ### Installation
25
66
 
26
67
  gem install rbmobile
68
+
69
+ ### Demo app
70
+
71
+ $ git clone git://github.com/mifo/rbmobile.git
72
+ $ gem install sinatra sinatra-respond_to
73
+ $ cd rbmobile/example
74
+ $ ruby app.rb
75
+ $ open http://localhost:4567/
27
76
 
28
77
  ### Sinatra
29
78
 
@@ -32,15 +81,17 @@ http://rdoc.info/projects/mfojtik/rbmobile
32
81
 
33
82
  ### Rails(?)
34
83
 
35
- app/helpers/application_helper.rb:
84
+ app/helpers/application_helper.rb:
85
+
36
86
  require 'mobile_helpers'
37
87
  include RBMobile::Helpers
38
88
 
39
89
  ### TODO:
40
90
 
41
- - Finish forms.
91
+ - Finish with jquery.mobile forms
92
+ - Make public directory configurable
42
93
 
43
- == LICENSE:
94
+ ### LICENSE:
44
95
 
45
96
  Copyright (c) 20011 Michal Fojtik
46
97
 
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ require 'rake/testtask'
2
+ require 'rcov/rcovtask'
3
+
4
+ task :default_rcov_params_for_units do
5
+ RCOV_PARAMS = ENV['RCOV_PARAMS'] = "--sort=coverage"
6
+ SHOW_ONLY = ENV['SHOW_ONLY'] = "lib/mobile_helpers.rb"
7
+ end
8
+
9
+ task :default_rcov do
10
+ puts "Executing rcov..."
11
+ FileUtils::rm_rf 'coverage'
12
+ command = "rcov --exclude 'Gems/*,gems/*' lib/*"
13
+ puts command
14
+ `#{command}`
15
+ end
16
+
17
+ desc 'RCov code coverage'
18
+ task :rcov => [ :default_rcov_params_for_units, :default_rcov ]
19
+
20
+ Rake::TestTask.new do |i|
21
+ i.test_files = FileList['tests/*_test.rb']
22
+ i.verbose = true
23
+ end
@@ -560,6 +560,150 @@ module RBMobile
560
560
  end
561
561
  end
562
562
 
563
+ def form(url, method=:post, opts={}, &block)
564
+ opts.merge!(
565
+ :method => method,
566
+ :url => url
567
+ )
568
+ opts.merge!(:'data-ajax' => 'false') if not RBMobile::config[:ajax] and not opts.delete(:ajax)
569
+ haml_tag :form, opts do
570
+ block.call if block_given?
571
+ end
572
+ end
573
+
574
+ def input(name, kind, label=nil, opts={})
575
+ capture_haml do
576
+ form_field do
577
+ haml_tag :label, :for => name do
578
+ haml_concat label || name.to_s.capitalize
579
+ end
580
+ haml_tag :input, { :name => name, :id => name, :type => kind, :value => opts.delete(:value),
581
+ :placeholder => opts.delete(:placeholder), :required => opts.delete(:required) ? 'required' : nil,
582
+ :pattern => opts.delete(:pattern), :min => opts.delete(:min), :max => opts.delete(:max),
583
+ :maxlength => opts.delete(:maxlength) || opts.delete(:size), :checked => opts.delete(:checked) ? 'checked' : nil,
584
+ :autocomplete => opts.delete(:no_complete) ? 'off' : nil }.merge(opts)
585
+
586
+ end
587
+ end
588
+ end
589
+
590
+ def search_input(name, label=nil, opts={})
591
+ input(name, :search, label, {
592
+ :'data-type' => :search,
593
+ }.merge(opts))
594
+ end
595
+
596
+ def toogle(name, label=nil, opts={})
597
+ capture_haml do
598
+ form_field do
599
+ haml_tag :label, :for => name do
600
+ haml_concat label || name.to_s.capitalize
601
+ end
602
+ haml_tag :select, :id => name, :'data-role' => 'slider' do
603
+ haml_tag :option, :value => opts[:first] || 'on' do
604
+ haml_concat opts[:first] ? opts[:first].to_s.capitalize : 'On'
605
+ end
606
+ haml_tag :option, :value => opts[:second] || 'off' do
607
+ haml_concat opts[:second] ? opts[:second].to_s.capitalize : 'Off'
608
+ end
609
+ end
610
+ end
611
+ end
612
+ end
613
+
614
+ def select(name, label=nil, options=[], opts={})
615
+ opts = {
616
+ :'data-native-menu' => opts.delete(:native) ? 'true' : 'false',
617
+ :'data-theme' => opts.delete(:theme)
618
+ }.merge(opts)
619
+ capture_haml do
620
+ form_field do
621
+ haml_tag :label, :for => name do
622
+ haml_concat label || name.to_s.capitalize
623
+ end
624
+ haml_tag :select, { :id => name }.merge(opts) do
625
+ options.each do |option|
626
+ option = [option] unless option.kind_of? Array
627
+ # One-item array will create a placeholder
628
+ haml_tag :option, :value => option.size==2 ? option.first : nil, :'data-placeholder' => option.size==1 ? 'true' : nil do
629
+ haml_concat option.last
630
+ end
631
+ end
632
+ end
633
+ end
634
+ end
635
+ end
636
+
637
+ def radio(name, label=nil, options=[], opts={})
638
+ capture_haml do
639
+ form_field do
640
+ haml_tag :fieldset, :'data-role' => :controlgroup, :'data-type' => opts[:type] || 'vertical' do
641
+ haml_tag :legend do
642
+ haml_concat label || name.to_s.capitalize
643
+ end
644
+ options.each_with_index do |option, index|
645
+ haml_tag :input, :name => name, :id => "#{name}-choice-#{index}", :type => :radio,
646
+ :value => option, :checked => option.kind_of?(Symbol) ? 'checked' : nil
647
+ haml_tag :label, :for => "#{name}-choice-#{index}" do
648
+ haml_concat option
649
+ end
650
+ end
651
+ end
652
+ end
653
+ end
654
+ end
655
+
656
+ def checkbox(name, label=nil, options=[], opts={})
657
+ capture_haml do
658
+ form_field do
659
+ haml_tag :fieldset, :'data-role' => :controlgroup, :'data-type' => opts[:type] || 'vertical' do
660
+ haml_tag :legend do
661
+ haml_concat label || name.to_s.capitalize
662
+ end
663
+ options.each_with_index do |option, index|
664
+ haml_tag :input, :name => "name[#{index}]", :id => "#{name}-choice-#{index}", :type => :checkbox,
665
+ :value => option, :checked => option.kind_of?(Symbol) ? 'checked' : nil
666
+ haml_tag :label, :for => "#{name}-choice-#{index}" do
667
+ haml_concat option
668
+ end
669
+ end
670
+ end
671
+ end
672
+ end
673
+ end
674
+
675
+ def textarea(name, label=nil, opts={})
676
+ capture_haml do
677
+ form_field do
678
+ haml_tag :label, :for => name do
679
+ haml_concat label || name.to_s.capitalize
680
+ end
681
+ haml_tag :'textarea', :'<', :name => name, :id => name, :cols => opts[:cols], :rows => opts[:rows],
682
+ :placeholder => opts[:placeholder], :required => opts[:required] ? 'required' : nil,
683
+ :maxlength => opts[:maxlength] do
684
+ haml_concat opts[:content] if opts[:content]
685
+ end
686
+ end
687
+ end
688
+ end
689
+
690
+ def form_field(opts={}, &block)
691
+ role :'fieldcontain', opts, &block
692
+ end
693
+
694
+ def submit(label=nil, opts={})
695
+ opts = {
696
+ :'data-theme' => opts.delete(:theme)
697
+ }.merge(opts)
698
+ capture_haml do
699
+ form_field do
700
+ haml_tag :button, { :type => :submit }.merge(opts), :value => label do
701
+ haml_concat label || 'Submit'
702
+ end
703
+ end
704
+ end
705
+ end
706
+
563
707
  private
564
708
 
565
709
  def role(name, opts={}, &block)
@@ -0,0 +1,86 @@
1
+ require 'rubygems'
2
+ require 'haml'
3
+ require 'lib/mobile_helpers'
4
+ require 'minitest/autorun'
5
+ require 'nokogiri'
6
+
7
+ class TestRoles < MiniTest::Unit::TestCase
8
+
9
+ extend Haml
10
+ include Haml::Helpers
11
+ include RBMobile::Helpers
12
+
13
+ def setup
14
+ init_haml_helpers
15
+ RBMobile::config do
16
+ disable :ajax
17
+ end
18
+ end
19
+
20
+ def test_it_generates_basic_page_role
21
+ output = capture_haml do
22
+ page
23
+ end
24
+ retval = Nokogiri::HTML(output)
25
+ assert_equal retval.css("div").size, 1
26
+ assert_nil retval.css("div").first[:class]
27
+ assert_equal retval.css("div").first[:'data-role'], 'page'
28
+ assert_empty retval.css("div *")
29
+ end
30
+
31
+ def test_it_generates_themed_page_role
32
+ output = capture_haml do
33
+ page :theme => :c
34
+ end
35
+ retval = Nokogiri::HTML(output)
36
+ assert_equal retval.css("div").first[:'data-theme'], 'c'
37
+ end
38
+
39
+ def test_it_generates_titled_page_role
40
+ output = capture_haml do
41
+ page :title => "Test1"
42
+ end
43
+ retval = Nokogiri::HTML(output)
44
+ assert_equal retval.css("div").first[:'data-title'], 'Test1'
45
+ end
46
+
47
+ def test_it_generates_basic_header_role
48
+ output = capture_haml do
49
+ page do
50
+ header do
51
+ end
52
+ end
53
+ end
54
+ retval = Nokogiri::HTML(output)
55
+ assert_equal retval.css("div[@data-role=page] div").size, 1
56
+ assert_equal retval.css("div[@data-role=page] div").first[:'data-role'], "header"
57
+ assert_equal retval.css("div[@data-role=page] div").first[:'data-position'], "inline"
58
+ end
59
+
60
+ def test_it_generates_basic_navbar_role
61
+ output = capture_haml do
62
+ page do
63
+ footer do
64
+ navbar do
65
+ haml_concat navigate_to "a.html", "Test"
66
+ end
67
+ end
68
+ end
69
+ end
70
+ retval = Nokogiri::HTML(output)
71
+ assert_equal retval.css("div[@data-role=page] > div").size, 1
72
+ assert_equal retval.css("div[@data-role=page] div").first[:'data-role'], "footer"
73
+ assert_equal retval.css("div[@data-role=page] div[@data-role=footer] div").first[:'data-role'], "navbar"
74
+ assert_equal retval.css("div[@data-role=page] div[@data-role=footer] div").size, 1
75
+ assert_equal retval.css("div[@data-role=page] div[@data-role=footer] div ul").size, 1
76
+ assert_equal retval.css("div[@data-role=page] div[@data-role=footer] div ul li").size, 1
77
+ assert_equal retval.css("div[@data-role=page] div[@data-role=footer] div ul li a").size, 1
78
+ assert_equal retval.css("div[@data-role=page] div[@data-role=footer] div ul li a").first[:href], 'a.html'
79
+ assert_equal retval.css("div[@data-role=page] div[@data-role=footer] div ul li a").first.text.strip, 'Test'
80
+ end
81
+
82
+
83
+
84
+
85
+
86
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbmobile
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Michal Fojtik
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-16 00:00:00 +02:00
18
+ date: 2011-08-17 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -42,6 +42,8 @@ extra_rdoc_files: []
42
42
 
43
43
  files:
44
44
  - lib/mobile_helpers.rb
45
+ - tests/basic_test.rb
46
+ - Rakefile
45
47
  - README.markdown
46
48
  has_rdoc: true
47
49
  homepage: http://github.com/mifo/rbmobile