jruby-lint 0.1 → 0.2.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.
data/History.txt CHANGED
@@ -1,4 +1,9 @@
1
+ === 0.2.0 / 2011-06-03
2
+
3
+ - #system('ruby') and #timeout checkers, thanks Matthew Kirk (hexgnu)!
4
+ - Update GitHub SSL cert chain
5
+
1
6
  === 0.1 / 2011-05-18
2
7
 
3
- * Birthday!
8
+ - Birthday!
4
9
 
data/README.md CHANGED
@@ -26,17 +26,20 @@ Here is a list of the current checks implemented:
26
26
  provide known alternatives.
27
27
  - Report usage of Kernel#fork (which does not work) and Kernel#exec
28
28
  (which does not replace the current process).
29
+ - Report usage of Timeout::timeout which, when used excessively tend
30
+ to be slow and expensive because of native threads
31
+ - Report behavior difference when using system('ruby'), which launches
32
+ the command in-process in a new copy of the interpreter for speed
29
33
 
30
34
  ## TODO
31
35
 
32
36
  Here is a list of checks and options we'd like to implement:
33
37
 
34
- - Timeout.timeout
35
38
  - Options to save report off to a file.
36
39
  - Text, HTML formats
40
+ - Add in check for `` to make sure not execing ruby ...
37
41
  - Report on more threading and concurrency issues/antipatterns
38
42
  - arr.each {|x| arr.delete(x) }
39
- - Warn about `system("ruby ...")` etc. how they are run in-process by default
40
43
  - Try to detect IO/File resource usage without blocks
41
44
  - Check .gemspec files for extensions and extconf.rb for
42
45
  #create_makefile and warn about compiliing C extensions
@@ -22,3 +22,5 @@ require 'jruby/lint/checkers/gem'
22
22
  require 'jruby/lint/checkers/gemspec'
23
23
  require 'jruby/lint/checkers/thread_critical'
24
24
  require 'jruby/lint/checkers/object_space'
25
+ require 'jruby/lint/checkers/timeout'
26
+ require 'jruby/lint/checkers/system'
@@ -0,0 +1,39 @@
1
+ module JRuby::Lint
2
+ module Checkers
3
+ class System
4
+ include Checker
5
+
6
+ # Make sure to follow all Kernel.system calls
7
+ def visitCallNode(node)
8
+ if node.name == "system" || node.name == "`"
9
+ @call_node = node
10
+ add_finding(node) if red_flag?(node)
11
+ proc { @call_node = nil }
12
+ end
13
+ end
14
+
15
+ # Visits the function calls for system
16
+ def visitFCallNode(node)
17
+ if node.name == "system"
18
+ add_finding(node) if red_flag?(node)
19
+ end
20
+ end
21
+
22
+ def add_finding(node)
23
+ collector.findings << Finding.new("Calling Kernel.system('ruby ...') will get called in-process. Sometimes this works differently than expected",
24
+ [:system, :warning], node.position)
25
+ end
26
+
27
+ # Defines red_flag when argument matches ruby
28
+ def red_flag?(node)
29
+ first_arg = node.args_node.child_nodes.first
30
+ first_arg && first_arg.node_type.to_s == "STRNODE" && ruby_executable?(first_arg)
31
+ end
32
+
33
+ def ruby_executable?(node)
34
+ match_on = Regexp.union([/.*ruby$/i, /.*j?irb$/i, /\.rb$/i])
35
+ node.value.split.first =~ match_on
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,21 @@
1
+ module JRuby::Lint
2
+ module Checkers
3
+ class Timeout
4
+ include Checker
5
+
6
+ def visitCallNode(node)
7
+ if node.name == "timeout"
8
+ begin
9
+ add_finding(collector, node)
10
+ rescue
11
+ end
12
+ end
13
+ end
14
+
15
+ def add_finding(collector, node)
16
+ collector.findings << Finding.new("Timeout in JRuby does not work in many cases",
17
+ [:timeout, :warning], node.position)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,76 +1,23 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
3
- ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
4
- RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
5
- MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
6
- QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
7
- b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
8
- b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
9
- YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
10
- AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
11
- KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
12
- VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
13
- SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
14
- cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
15
- 6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
16
- MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
17
- kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
18
- BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
19
- BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
20
- c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
21
- AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
22
- BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
23
- OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
24
- A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
25
- 0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
26
- RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
27
- qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
28
- U+4=
29
- -----END CERTIFICATE-----
30
- -----BEGIN CERTIFICATE-----
31
- MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh
32
- bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
33
- Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
34
- QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe
35
- BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX
36
- DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE
37
- YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0
38
- aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC
39
- ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
40
- 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q
41
- N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO
42
- r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN
43
- f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH
44
- U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU
45
- TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb
46
- VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg
47
- SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv
48
- biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg
49
- MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw
50
- AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv
51
- ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu
52
- Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd
53
- IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv
54
- bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1
55
- QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O
56
- WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf
57
- SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==
58
- -----END CERTIFICATE-----
59
- -----BEGIN CERTIFICATE-----
60
- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
61
- IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
62
- BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
63
- aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
64
- 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
65
- NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
66
- azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
67
- YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
68
- Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
69
- cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
70
- dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
71
- WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
72
- v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
73
- UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
74
- IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
75
- W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
2
+ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
3
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
4
+ d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
5
+ ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
6
+ MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
7
+ LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
8
+ RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
9
+ +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
10
+ PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
11
+ xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
12
+ Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
13
+ hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
14
+ EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
15
+ MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
16
+ FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
17
+ nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
18
+ eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
19
+ hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
20
+ Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
21
+ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
22
+ +OkuE6N36B9K
76
23
  -----END CERTIFICATE-----
@@ -1,5 +1,5 @@
1
1
  module JRuby
2
2
  module Lint
3
- VERSION = "0.1"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -8,11 +8,12 @@
8
8
  <head>
9
9
  <meta charset='utf-8'>
10
10
  <meta http-equiv="X-UA-Compatible" content="chrome=1">
11
+ <script>var NREUMQ=[];NREUMQ.push(["mark","firstbyte",new Date().getTime()]);</script>
11
12
  <title>C Extension Alternatives - GitHub</title>
12
13
  <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub" />
13
14
  <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub" />
14
15
 
15
- <link href="https://d3nwyuy0nl342s.cloudfront.net/ba26f6a198e5e881573c321692d2255635b24eb8/stylesheets/bundle_github.css" media="screen" rel="stylesheet" type="text/css" />
16
+ <link href="https://d3nwyuy0nl342s.cloudfront.net/709540747571a12d9ee0e981881190bbacde01fe/stylesheets/bundle_github.css" media="screen" rel="stylesheet" type="text/css" />
16
17
 
17
18
 
18
19
  <script type="text/javascript">
@@ -26,9 +27,8 @@
26
27
  var github_user = null
27
28
 
28
29
  </script>
29
- <script src="https://d3nwyuy0nl342s.cloudfront.net/ba26f6a198e5e881573c321692d2255635b24eb8/javascripts/jquery/jquery-1.4.2.min.js" type="text/javascript"></script>
30
- <script src="https://d3nwyuy0nl342s.cloudfront.net/ba26f6a198e5e881573c321692d2255635b24eb8/javascripts/bundle_common.js" type="text/javascript"></script>
31
- <script src="https://d3nwyuy0nl342s.cloudfront.net/ba26f6a198e5e881573c321692d2255635b24eb8/javascripts/bundle_github.js" type="text/javascript"></script>
30
+ <script src="https://d3nwyuy0nl342s.cloudfront.net/javascripts/jquery/jquery-1.4.2.min.js" type="text/javascript"></script>
31
+ <script src="https://d3nwyuy0nl342s.cloudfront.net/32997e5cd4ce47f6467e629aedf849edcf5a7376/javascripts/bundle_github.js" type="text/javascript"></script>
32
32
 
33
33
 
34
34
 
@@ -40,7 +40,7 @@
40
40
 
41
41
 
42
42
  <link href="https://github.com/jruby/jruby/commits/master.atom" rel="alternate" title="Recent Commits to jruby:master" type="application/atom+xml" />
43
- <script src="https://d3nwyuy0nl342s.cloudfront.net/ba26f6a198e5e881573c321692d2255635b24eb8/javascripts/bundle_wiki.js" type="text/javascript"></script>
43
+ <script src="https://d3nwyuy0nl342s.cloudfront.net/a5293f39de14a50f19260ef05b2ae4a145b2cbce/javascripts/bundle_wiki.js" type="text/javascript"></script>
44
44
 
45
45
  <script src="/javascripts/other/MathJax/MathJax.js" type="text/javascript">
46
46
  if (window.location.protocol == "https:") {
@@ -57,7 +57,7 @@
57
57
  <script type="text/javascript">
58
58
  GitHub.nameWithOwner = GitHub.nameWithOwner || "jruby/jruby";
59
59
  GitHub.currentRef = 'master';
60
- GitHub.commitSHA = "21565774f8800b3df6f839505365d340b573f253";
60
+ GitHub.commitSHA = "f03b829c28c581c661f8916b54978b552cc03ff5";
61
61
  GitHub.currentPath = '';
62
62
  GitHub.masterBranch = "master";
63
63
 
@@ -93,17 +93,14 @@
93
93
 
94
94
 
95
95
 
96
-
97
-
98
-
99
-
100
96
  <div class="subnavd" id="main">
101
97
  <div id="header" class="true">
102
98
 
103
99
  <a class="logo boring" href="https://github.com">
104
- <img alt="github" class="default" src="https://d3nwyuy0nl342s.cloudfront.net/images/modules/header/logov3.png" />
100
+
101
+ <img alt="github" class="default" height="45" src="https://d3nwyuy0nl342s.cloudfront.net/images/modules/header/logov5.png" />
105
102
  <!--[if (gt IE 8)|!(IE)]><!-->
106
- <img alt="github" class="hover" src="https://d3nwyuy0nl342s.cloudfront.net/images/modules/header/logov3-hover.png" />
103
+ <img alt="github" class="hover" height="45" src="https://d3nwyuy0nl342s.cloudfront.net/images/modules/header/logov5-hover.png" />
107
104
  <!--<![endif]-->
108
105
  </a>
109
106
 
@@ -111,10 +108,14 @@
111
108
  <div class="topsearch">
112
109
 
113
110
  <ul class="nav logged_out">
111
+
114
112
  <li class="pricing"><a href="/plans">Pricing and Signup</a></li>
113
+
115
114
  <li class="explore"><a href="/explore">Explore GitHub</a></li>
116
115
  <li class="features"><a href="/features">Features</a></li>
116
+
117
117
  <li class="blog"><a href="/blog">Blog</a></li>
118
+
118
119
  <li class="login"><a href="/login?return_to=%2Fjruby%2Fjruby%2Fwiki%2FC-Extension-Alternatives">Login</a></li>
119
120
  </ul>
120
121
 
@@ -144,24 +145,23 @@
144
145
 
145
146
  <li class="for-owner" style="display:none"><a href="/jruby/jruby/admin" class="minibutton btn-admin "><span><span class="icon"></span>Admin</span></a></li>
146
147
  <li>
147
- <a href="/jruby/jruby/toggle_watch" class="minibutton btn-watch " id="watch_button" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', 'f0cc17b027c2396c32ee54c98c3537e3299e335c'); f.appendChild(s);f.submit();return false;" style="display:none"><span><span class="icon"></span>Watch</span></a>
148
- <a href="/jruby/jruby/toggle_watch" class="minibutton btn-watch " id="unwatch_button" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', 'f0cc17b027c2396c32ee54c98c3537e3299e335c'); f.appendChild(s);f.submit();return false;" style="display:none"><span><span class="icon"></span>Unwatch</span></a>
148
+ <a href="/jruby/jruby/toggle_watch" class="minibutton btn-watch " id="watch_button" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', '39136b986bbed8c260a8aa8d9ff8b1c9bd2b9ac8'); f.appendChild(s);f.submit();return false;" style="display:none"><span><span class="icon"></span>Watch</span></a>
149
+ <a href="/jruby/jruby/toggle_watch" class="minibutton btn-watch " id="unwatch_button" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', '39136b986bbed8c260a8aa8d9ff8b1c9bd2b9ac8'); f.appendChild(s);f.submit();return false;" style="display:none"><span><span class="icon"></span>Unwatch</span></a>
149
150
  </li>
150
151
 
151
152
 
152
- <li class="for-notforked" style="display:none"><a href="/jruby/jruby/fork" class="minibutton btn-fork " id="fork_button" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', 'f0cc17b027c2396c32ee54c98c3537e3299e335c'); f.appendChild(s);f.submit();return false;"><span><span class="icon"></span>Fork</span></a></li>
153
+ <li class="for-notforked" style="display:none"><a href="/jruby/jruby/fork" class="minibutton btn-fork " id="fork_button" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', '39136b986bbed8c260a8aa8d9ff8b1c9bd2b9ac8'); f.appendChild(s);f.submit();return false;"><span><span class="icon"></span>Fork</span></a></li>
153
154
  <li class="for-hasfork" style="display:none"><a href="#" class="minibutton btn-fork " id="your_fork_button"><span><span class="icon"></span>Your Fork</span></a></li>
154
155
 
155
156
 
156
157
 
157
-
158
158
 
159
159
 
160
160
 
161
161
  <li class="repostats">
162
162
  <ul class="repo-stats">
163
- <li class="watchers"><a href="/jruby/jruby/watchers" title="Watchers" class="tooltipped downwards">497</a></li>
164
- <li class="forks"><a href="/jruby/jruby/network" title="Forks" class="tooltipped downwards">109</a></li>
163
+ <li class="watchers"><a href="/jruby/jruby/watchers" title="Watchers" class="tooltipped downwards">512</a></li>
164
+ <li class="forks"><a href="/jruby/jruby/network" title="Forks" class="tooltipped downwards">114</a></li>
165
165
  </ul>
166
166
  </li>
167
167
  </ul>
@@ -242,8 +242,6 @@
242
242
 
243
243
 
244
244
 
245
-
246
-
247
245
  </div>
248
246
  <div class="flash-messages"></div>
249
247
 
@@ -292,7 +290,7 @@
292
290
  Last edited by headius, <abbr class="relatize" title="2011-05-15 17:25:54">Sun May 15 17:25:54 -0700 2011</abbr>
293
291
  </p>
294
292
  <p id="delete-link">
295
- <a href="/jruby/jruby/wiki/C-Extension-Alternatives" onclick="if (confirm('Are you sure you want to delete this page?')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m);var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', 'f0cc17b027c2396c32ee54c98c3537e3299e335c'); f.appendChild(s);f.submit(); };return false;"><span>Delete this Page</span></a>
293
+ <a href="/jruby/jruby/wiki/C-Extension-Alternatives" onclick="if (confirm('Are you sure you want to delete this page?')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m);var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', '39136b986bbed8c260a8aa8d9ff8b1c9bd2b9ac8'); f.appendChild(s);f.submit(); };return false;"><span>Delete this Page</span></a>
296
294
  </p>
297
295
  </div>
298
296
  </div>
@@ -305,27 +303,31 @@
305
303
 
306
304
  <div id="footer" class="clearfix">
307
305
  <div class="site">
308
- <div class="sponsor">
309
- <a href="http://www.rackspace.com" class="logo">
310
- <img alt="Dedicated Server" height="36" src="https://d3nwyuy0nl342s.cloudfront.net/images/modules/footer/rackspace_logo.png?v2" width="38" />
311
- </a>
312
- Powered by the <a href="http://www.rackspace.com ">Dedicated
313
- Servers</a> and<br/> <a href="http://www.rackspacecloud.com">Cloud
314
- Computing</a> of Rackspace Hosting<span>&reg;</span>
315
- </div>
306
+
307
+ <div class="sponsor">
308
+ <a href="http://www.rackspace.com" class="logo">
309
+ <img alt="Dedicated Server" height="36" src="https://d3nwyuy0nl342s.cloudfront.net/images/modules/footer/rackspace_logo.png?v2" width="38" />
310
+ </a>
311
+ Powered by the <a href="http://www.rackspace.com ">Dedicated
312
+ Servers</a> and<br/> <a href="http://www.rackspacecloud.com">Cloud
313
+ Computing</a> of Rackspace Hosting<span>&reg;</span>
314
+ </div>
315
+
316
316
 
317
317
  <ul class="links">
318
- <li class="blog"><a href="https://github.com/blog">Blog</a></li>
319
- <li><a href="https://github.com/contact">Support</a></li>
320
- <li><a href="https://github.com/training">Training</a></li>
321
- <li><a href="http://jobs.github.com">Job Board</a></li>
322
- <li><a href="http://shop.github.com">Shop</a></li>
323
- <li><a href="https://github.com/contact">Contact</a></li>
324
- <li><a href="http://developer.github.com">API</a></li>
325
- <li><a href="http://status.github.com">Status</a></li>
318
+
319
+ <li class="blog"><a href="https://github.com/blog">Blog</a></li>
320
+ <li><a href="https://github.com/about">About</a></li>
321
+ <li><a href="https://github.com/contact">Contact &amp; Support</a></li>
322
+ <li><a href="https://github.com/training">Training</a></li>
323
+ <li><a href="http://jobs.github.com">Job Board</a></li>
324
+ <li><a href="http://shop.github.com">Shop</a></li>
325
+ <li><a href="http://developer.github.com">API</a></li>
326
+ <li><a href="http://status.github.com">Status</a></li>
327
+
326
328
  </ul>
327
329
  <ul class="sosueme">
328
- <li class="main">&copy; 2011 <span id="_rrt" title="0.40823s from fe4.rs.github.com">GitHub</span> Inc. All rights reserved.</li>
330
+ <li class="main">&copy; 2011 <span id="_rrt" title="0.09826s from fe4.rs.github.com">GitHub</span> Inc. All rights reserved.</li>
329
331
  <li><a href="/site/terms">Terms of Service</a></li>
330
332
  <li><a href="/site/privacy">Privacy</a></li>
331
333
  <li><a href="https://github.com/security">Security</a></li>
@@ -333,7 +335,7 @@
333
335
  </div>
334
336
  </div><!-- /#footer -->
335
337
 
336
- <script>window._auth_token = "f0cc17b027c2396c32ee54c98c3537e3299e335c"</script>
338
+ <script>window._auth_token = "39136b986bbed8c260a8aa8d9ff8b1c9bd2b9ac8"</script>
337
339
 
338
340
 
339
341
  <div id="keyboard_shortcuts_pane" class="instapaper_ignore readability-extra" style="display:none">
@@ -535,6 +537,98 @@
535
537
  </div>
536
538
  </div>
537
539
 
540
+ <div id="markdown-help" class="instapaper_ignore readability-extra">
541
+ <h2>Markdown Cheat Sheet</h2>
542
+
543
+ <div class="cheatsheet-content">
544
+
545
+ <div class="mod">
546
+ <div class="col">
547
+ <h3>Format Text</h3>
548
+ <p>Headers</p>
549
+ <pre>
550
+ # This is an &lt;h1&gt; tag
551
+ ## This is an &lt;h2&gt; tag
552
+ ###### This is an &lt;h6&gt; tag</pre>
553
+ <p>Text styles</p>
554
+ <pre>
555
+ *This text will be italic*
556
+ _This will also be italic_
557
+ **This text will be bold**
558
+ __This will also be bold__
559
+
560
+ *You **can** combine them*
561
+ </pre>
562
+ </div>
563
+ <div class="col">
564
+ <h3>Lists</h3>
565
+ <p>Unordered</p>
566
+ <pre>
567
+ * Item 1
568
+ * Item 2
569
+ * Item 2a
570
+ * Item 2b</pre>
571
+ <p>Ordered</p>
572
+ <pre>
573
+ 1. Item 1
574
+ 2. Item 2
575
+ 3. Item 3
576
+ * Item 3a
577
+ * Item 3b</pre>
578
+ </div>
579
+ <div class="col">
580
+ <h3>Miscellaneous</h3>
581
+ <p>Images</p>
582
+ <pre>
583
+ ![GitHub Logo](/images/logo.png)
584
+ Format: ![Alt Text](url)
585
+ </pre>
586
+ <p>Links</p>
587
+ <pre>
588
+ http://github.com - automatic!
589
+ [GitHub](http://github.com)</pre>
590
+ <p>Blockquotes</p>
591
+ <pre>
592
+ As Kanye West said:
593
+ > We're living the future so
594
+ > the present is our past.
595
+ </pre>
596
+ </div>
597
+ </div>
598
+ <div class="rule"></div>
599
+
600
+ <h3>Code Examples in Markdown</h3>
601
+ <div class="col">
602
+ <p>Syntax highlighting with <a href="http://github.github.com/github-flavored-markdown/" title="GitHub Flavored Markdown">GFM</a></p>
603
+ <pre>
604
+ ```javascript
605
+ function fancyAlert(arg) {
606
+ if(arg) {
607
+ $.facebox({div:'#foo'})
608
+ }
609
+ }
610
+ ```</pre>
611
+ </div>
612
+ <div class="col">
613
+ <p>Or, indent your code 4 spaces</p>
614
+ <pre>
615
+ Here is a Python code example
616
+ without syntax highlighting:
617
+
618
+ def foo:
619
+ if not bar:
620
+ return true</pre>
621
+ </div>
622
+ <div class="col">
623
+ <p>Inline code for comments</p>
624
+ <pre>
625
+ I think you should use an
626
+ `&lt;addr&gt;` element here instead.</pre>
627
+ </div>
628
+ </div>
629
+
630
+ </div>
631
+ </div>
538
632
 
539
633
 
540
634
  <!--[if IE 8]>
@@ -550,8 +644,9 @@
550
644
  <![endif]-->
551
645
 
552
646
 
553
- <script type='text/javascript'></script>
554
647
 
648
+
649
+ <script>(function(){var d=document;var e=d.createElement("script");e.async=true;e.src="https://d1ros97qkrwjf5.cloudfront.net/10/eum/rum.js ";var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(e,s);})();NREUMQ.push(["nrf2","beacon-3.newrelic.com","2f94e4d8c2",64799,"dw1bEBZcX1RWRhoBFFUSXRdLQ1JKR11WDxZVFlwLCg==",0,151,new Date().getTime()])</script>
555
650
  </body>
556
651
  </html>
557
652
 
@@ -132,4 +132,56 @@ describe JRuby::Lint::Checkers do
132
132
  Then { collector.findings.size.should == 0 }
133
133
  end
134
134
  end
135
+
136
+ context "Timeout::timeout" do
137
+ Given(:checker) { JRuby::Lint::Checkers::Timeout.new }
138
+
139
+ context "::timeout usage" do
140
+ Given(:script) { "Timeout::timeout(5) { sleep 10 }"}
141
+ When { collector.run }
142
+ Then { collector.findings.size.should == 1}
143
+ end
144
+
145
+ context ".timeout usage" do
146
+ Given(:script) { "Timeout.timeout(5) { sleep 10 }" }
147
+ When { collector.run }
148
+ Then { collector.findings.size.should == 1}
149
+ end
150
+ end
151
+
152
+
153
+ context "System" do
154
+ Given(:checker) { JRuby::Lint::Checkers::System.new }
155
+
156
+ context "calling ruby -v in system" do
157
+ Given(:script) { "system('echo'); system('/usr/bin/ruby -v')"}
158
+ When { collector.run }
159
+ Then { collector.findings.size.should == 1}
160
+ end
161
+
162
+ context "calling ruby in the first argument to system" do
163
+ Given(:script) { "system('/usr/bin/ruby', '-v')"}
164
+ When { collector.run }
165
+ Then { collector.findings.size.should == 1}
166
+ end
167
+
168
+ context "calling irb or jirb from system" do
169
+ Given(:script) { "system('jirb'); system('irb')"}
170
+ When { collector.run }
171
+ Then { collector.findings.size.should == 2 }
172
+ end
173
+
174
+ context "calling a .rb file from system" do
175
+ Given(:script) { "system('asdf.rb')" }
176
+ When { collector.run }
177
+ Then { collector.findings.size.should == 1 }
178
+ end
179
+
180
+ context "calling ruby -v in Kernel.system should have a finding" do
181
+ Given(:script) { "Kernel.system('ruby -v'); Kernel.system('echo \"zomg\"')"}
182
+ When { collector.run }
183
+ Then { collector.findings.size.should == 1}
184
+ end
185
+
186
+ end
135
187
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: jruby-lint
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: "0.1"
5
+ version: 0.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Nick Sieger
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-18 00:00:00 -04:00
13
+ date: 2011-06-03 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -122,7 +122,9 @@ files:
122
122
  - lib/jruby/lint/checkers/gem.rb
123
123
  - lib/jruby/lint/checkers/gemspec.rb
124
124
  - lib/jruby/lint/checkers/object_space.rb
125
+ - lib/jruby/lint/checkers/system.rb
125
126
  - lib/jruby/lint/checkers/thread_critical.rb
127
+ - lib/jruby/lint/checkers/timeout.rb
126
128
  - lib/jruby/lint/cli.rb
127
129
  - lib/jruby/lint/collectors.rb
128
130
  - lib/jruby/lint/collectors/bundler.rb