Merge branch 'master' into 4523-full-text-search
authorRadhika Chippada <radhika@curoverse.com>
Fri, 6 Feb 2015 13:56:09 +0000 (08:56 -0500)
committerRadhika Chippada <radhika@curoverse.com>
Fri, 6 Feb 2015 13:56:09 +0000 (08:56 -0500)
apps/workbench/app/helpers/application_helper.rb
apps/workbench/app/views/jobs/_rerun_job_with_options_popup.html.erb
apps/workbench/app/views/pipeline_instances/show.html.erb
apps/workbench/app/views/users/_add_ssh_key_popup.html.erb
apps/workbench/app/views/users/_setup_popup.html.erb
apps/workbench/test/integration/pipeline_instances_test.rb
services/api/lib/current_api_client.rb
services/api/test/fixtures/pipeline_templates.yml

index a05e6ba268ecc2519f22eb3f444b3e29efabfa29..ef2830cd7e3fcc667719e0b442019e87de83715b 100644 (file)
@@ -307,9 +307,7 @@ module ApplicationHelper
       end
     end
 
-    if dataclass == 'number' or attrvalue.is_a? Fixnum or attrvalue.is_a? Float
-      datatype = 'number'
-    elsif attrvalue.is_a? String
+    if attrvalue.is_a? String
       datatype = 'text'
     elsif attrvalue.is_a?(Array) or dataclass.andand.is_a?(Class)
       # TODO: find a way to edit with x-editable
index 931b8da87af8b8a5ec8f418bcc90b1c215fd3386..f9086637f4ed32757c91f1d39d65b33f19c50aaa 100644 (file)
@@ -39,8 +39,8 @@
         </div>
 
         <div class="modal-footer">
-          <%= f.submit(value: "Run now", class: "btn btn-primary") %>
           <button class="btn btn-default" onClick="reset_form()" data-dismiss="modal" aria-hidden="true">Cancel</button>
+          <%= f.submit(value: "Run now", class: "btn btn-primary") %>
         </div>
       <% end %>
     </div>
index 860e8091b26dd2780974748c145d265ef174cc16..e23e49c05ba3f883440e5c73112ce5204fcf1a1e 100644 (file)
@@ -62,9 +62,9 @@
       </div>
 
       <div class="modal-footer">
-        <button type="submit" class="btn btn-primary" name="pipeline_instance[state]" value="New">Copy and edit inputs</button>
-        <button type="submit" class="btn btn-primary" name="pipeline_instance[state]" value="RunningOnServer">Run now</button>
         <button class="btn btn-default" onClick="reset_form()" data-dismiss="modal" aria-hidden="true">Cancel</button>
+        <button type="submit" class="btn btn-primary" name="pipeline_instance[state]" value="RunningOnServer">Run now</button>
+        <button type="submit" class="btn btn-primary" name="pipeline_instance[state]" value="New">Copy and edit inputs</button>
       </div>
 
     </div>
index 98f54ef252ed97b61ec5b9b66cf7e2449e2e4e14..25f4d75be19b0df6a450942bfd931f59aadc25c6 100644 (file)
@@ -29,8 +29,8 @@
       </div>
 
       <div class="modal-footer">
-        <button type="submit" class="btn btn-primary" autofocus>Submit</button>
         <button class="btn btn-default" onClick="reset_form()" data-dismiss="modal" aria-hidden="true">Cancel</button>
+        <button type="submit" class="btn btn-primary" autofocus>Submit</button>
       </div>
 
     <% end #form %>
index e9429cf451d43b8c48e601be3d7cb97824fa8adf..a1a664ce838115b875c460cd988d5260490430f1 100644 (file)
@@ -64,8 +64,8 @@
     </div>
 
     <div class="modal-footer">
-      <button type="submit" id="register" class="btn btn-primary" autofocus>Submit</button>
       <button class="btn btn-default" onClick="reset_form()" data-dismiss="modal" aria-hidden="true">Cancel</button>
+      <button type="submit" id="register" class="btn btn-primary" autofocus>Submit</button>
     </div>
 
     <% end #form %>
index 1c8139e6c6539997c3d2322c1cf3bce460ab3dd8..ebdb28b2157cfc225792099c3b1847d02e81c41e 100644 (file)
@@ -182,17 +182,27 @@ class PipelineInstancesTest < ActionDispatch::IntegrationTest
            "components JSON not found")
   end
 
-  PROJECT_WITH_SEARCH_COLLECTION = "A Subproject"
-  def check_parameter_search(proj_name)
-    template = api_fixture("pipeline_templates")["parameter_with_search"]
-    search_text = template["components"]["with-search"]["script_parameters"]["input"]["search_for"]
-    visit page_with_token("active", "/pipeline_templates/#{template['uuid']}")
+  def create_pipeline_from(template_name, project_name="Home")
+    # Visit the named pipeline template and create a pipeline instance from it.
+    # The instance will be created under the named project.
+    template_uuid = api_fixture("pipeline_templates", template_name, "uuid")
+    visit page_with_token("active", "/pipeline_templates/#{template_uuid}")
     click_on "Run this pipeline"
-    within(".modal-dialog") do  # Set project for the new pipeline instance
-      find(".selectable", text: proj_name).click
+    within(".modal-dialog") do
+      # Set project for the new pipeline instance
+      find(".selectable", text: project_name).click
       click_on "Choose"
     end
-    assert(has_text?("This pipeline was created from the template"), "did not land on pipeline instance page")
+    assert(has_text?("This pipeline was created from the template"),
+           "did not land on pipeline instance page")
+  end
+
+  PROJECT_WITH_SEARCH_COLLECTION = "A Subproject"
+  def check_parameter_search(proj_name)
+    create_pipeline_from("parameter_with_search", proj_name)
+    search_text = api_fixture("pipeline_templates", "parameter_with_search",
+                              "components", "with-search",
+                              "script_parameters", "input", "search_for")
     first("a.btn,button", text: "Choose").click
     within(".modal-body") do
       if (proj_name != PROJECT_WITH_SEARCH_COLLECTION)
@@ -215,6 +225,23 @@ class PipelineInstancesTest < ActionDispatch::IntegrationTest
     check_parameter_search("A Project")
   end
 
+  test "enter a float for a number pipeline input" do
+    # Poltergeist either does not support the HTML 5 <input
+    # type="number">, or interferes with the associated X-Editable
+    # validation code.  If the input field has type=number (forcing an
+    # integer), this test will yield a false positive under
+    # Poltergeist.  --Brett, 2015-02-05
+    need_selenium "for strict X-Editable input validation"
+    create_pipeline_from("template_with_dataclass_number")
+    INPUT_SELECTOR =
+      ".editable[data-name='[components][work][script_parameters][input][value]']"
+    find(INPUT_SELECTOR).click
+    find(".editable-input input").set("12.34")
+    find("#editable-submit").click
+    assert_no_selector(".editable-popup")
+    assert_selector(INPUT_SELECTOR, text: "12.34")
+  end
+
   [
     [true, 'Two Part Pipeline Template', 'foo_collection_in_aproject', false],
     [false, 'Two Part Pipeline Template', 'foo_collection_in_aproject', false],
index 197dcd8f3e2c3cdff5419566fd319128be71e25f..6c1ff2807e12705edb108b4f92147a195eeff710 100644 (file)
@@ -187,9 +187,24 @@ module CurrentApiClient
   # If the given value is nil, or the cache has been cleared since it
   # was set, yield. Otherwise, return the given value.
   def check_cache value
-    Rails.cache.fetch "CurrentApiClient.$globals" do
-      value = nil
-      true
+    if not Rails.env.test? and
+        ActionController::Base.cache_store.is_a? ActiveSupport::Cache::FileStore and
+        not File.owned? ActionController::Base.cache_store.cache_path
+      # If we don't own the cache dir, we're probably
+      # crunch-dispatch. Whoever we are, using this cache is likely to
+      # either fail or screw up the cache for someone else. So we'll
+      # just assume the $globals are OK to live forever.
+      #
+      # The reason for making the globals expire with the cache in the
+      # first place is to avoid leaking state between test cases: in
+      # production, we don't expect the database seeds to ever go away
+      # even when the cache is cleared, so there's no particular
+      # reason to expire our global variables.
+    else
+      Rails.cache.fetch "CurrentApiClient.$globals" do
+        value = nil
+        true
+      end
     end
     return value unless value.nil?
     yield
index 4659da349092dc37bd63078268d7ef307f3532d1..40bf63dd7e2108b490841c940e12a7aa34253432 100644 (file)
@@ -165,6 +165,25 @@ template_with_dataclass_file:
         array_with_value: # important to test repeating values in the array!
           value: [1,1,2,3,5]
 
+template_with_dataclass_number:
+  uuid: zzzzz-p5p6p-numbertemplatea
+  owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  created_at: 2015-01-14 12:35:04 -0400
+  updated_at: 2015-01-14 12:35:04 -0400
+  modified_at: 2015-01-14 12:35:04 -0400
+  modified_by_client_uuid: zzzzz-ozdt8-brczlopd8u8d0jr
+  modified_by_user_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  name: Template with dataclass number
+  components:
+    work:
+      script: foo
+      script_version: master
+      script_parameters:
+        input:
+          required: true
+          dataclass: number
+          title: "Input number"
+
 pipeline_template_in_publicly_accessible_project:
   uuid: zzzzz-p5p6p-tmpltpublicproj
   owner_uuid: zzzzz-j7d0g-zhxawtyetzwc5f0